Corregir errores en tu ledger¶
Corrige transacciones incorrectas en tu ledger sin perder el rastro de lo que ha cambiado. Cada corrección deja una entrada visible en el historial, así que siempre puedes ver cómo era una transacción antes y después. Todo ocurre en tu ordenador: no se envía nada a ningún sitio.
Antes de empezar¶
Necesitas:
Un perfil de contribuyente activo. Todas las órdenes de abajo trabajan sobre el perfil activo; si no hay ninguno establecido, la orden se niega. Consulta Configurar tu perfil de contribuyente.
Una frase de contraseña de clave maestra. La herramienta te la pide la primera vez que abre tu almacenamiento cifrado en una sesión.
Un ledger con transacciones.
Para localizar la transacción que quieres corregir, enumera tus transacciones y examina una en detalle. La secuencia de abajo registra un gasto de ejemplo, enumera el ledger y examina esa fila:
aeat --format json app ledger add --date 2026-03-15 --amount 210.00 --direction OUTGOING \
--description Silla de oficina --idempotency-key correct-findaeat --format json app ledger add --date 2026-03-15 --amount 210.00 --direction OUTGOING `
--description Silla de oficina --idempotency-key correct-find{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "a9ef0aa32d83010e35c72d35d6cc793ade13766f38979a9ae358646f1064352f" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "210", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Silla de oficina", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb" }, "schema_version": "2", "status": "success" }
aeat app ledger listaeat app ledger listACCOUNTING LEDGER TRANSACTIONS id full_id date amount description IVA category review_status f83add28 f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb 2026-03-15 210 Silla de oficina pending
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "210", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Silla de oficina", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb" }, "schema_version": "2", "status": "success" }
Confirm the inspected transaction is the one you want to fix.
La orden view informa del id, el importe, la dirección, la descripción y el estado del ciclo de vida. La guía de transacciones trata en profundidad la enumeración y el filtrado.
Elige tu corrección¶
Si una transacción tiene un importe, una fecha o un texto incorrectos, actualízala.
Si una transacción no debería existir en absoluto, elimínala.
Si la misma compra se importó dos veces, elimina el duplicado, o archívalo para conservar un rastro deliberado de él.
Si un pago cubre dos cosas distintas, divídelo.
Si dividiste algo y quieres volver a juntarlo, fusiona las partes.
Si tienes dudas sobre una transacción y quieres quitarla de en medio, apártala.
Si quieres conservar una transacción en el historial pero fuera de las listas del día a día, archívala.
Si apartaste o archivaste una transacción por error, restáurala a activa.
Actualiza campos de una transacción¶
Cambia uno o más campos directamente. La secuencia registra una silla a un precio incorrecto, corrige el importe y la descripción, y confirma la corrección:
aeat --format json app ledger add --date 2026-03-15 --amount 100.00 --direction OUTGOING \
--description Office chair --idempotency-key correct-updateaeat --format json app ledger add --date 2026-03-15 --amount 100.00 --direction OUTGOING `
--description Office chair --idempotency-key correct-update{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "47c494e7c2a1631efad4835b3c50110ccfda63015482d65fef4f0b83f8dd1c61" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "100", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Office chair", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "1a9106f8f6783eaf5ba09478eeb3bcec6188caf02d136a7cdd9770bcd6e7830d", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "1a9106f8f6783eaf5ba09478eeb3bcec6188caf02d136a7cdd9770bcd6e7830d" }, "schema_version": "2", "status": "success" }
aeat app ledger update {transaction_id} --amount 121.00 --description \
Office chair, corrected priceaeat app ledger update {transaction_id} --amount 121.00 --description `
Office chair, corrected priceID 59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5 Date 2026-03-15 Amount 121 Description Office chair, corrected price Review status pending
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "121", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Office chair, corrected price", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5" }, "schema_version": "2", "status": "success" }
Confirm the update replaced the amount and description.
Cada opción reemplaza por completo ese campo: escribe el nuevo valor completo, no un añadido al anterior. Escribe el importe como una cifra positiva: el campo de dirección indica si el dinero entró o salió, y un importe negativo se rechaza. Los campos actualizables son: fecha, fecha de valor, importe, dirección, moneda, contraparte, descripción, base imponible, tipo de IVA, cuota de IVA, categoría de IRPF, notas y grupo.
Una actualización da a la transacción un nuevo ID: la salida de la actualización lo imprime. No tienes que hacer seguimiento del cambio para las órdenes de lectura: un ID que anotaste antes de la actualización sigue respondiendo en history, view y track, resolviéndose a la transacción corregida, exactamente igual que el view de arriba. Para otra mutación -otro update, classify o archive- usa el ID actual de la salida de la actualización o de list, porque esas órdenes actúan sobre la transacción viva.
Update solo funciona sobre transacciones activas. Las transacciones archivadas y apartadas lo rechazan, igual que un padre de división: las partes activas de una división se pueden actualizar con normalidad.
Elimina una transacción¶
Remove borra una transacción de tus registros activos. Haz primero una vista previa con --dry-run y luego elimínala de verdad. El id eliminado ya no se resuelve, que es como la secuencia confirma el borrado:
aeat --format json app ledger add --date 2026-03-15 --amount 60.50 --direction OUTGOING \
--description Wrong import --idempotency-key correct-removeaeat --format json app ledger add --date 2026-03-15 --amount 60.50 --direction OUTGOING `
--description Wrong import --idempotency-key correct-remove{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "8b33ed95365478e1093bdc08e4960210b7eb3fda5fe8f7de1144c1a9c47a8688" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "60.5", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Wrong import", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb" }, "schema_version": "2", "status": "success" }
aeat app ledger remove {transaction_id} --reason wrong file imported --dry-runaeat app ledger remove {transaction_id} --reason wrong file imported --dry-runBucket <profile-id> ID 1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb Removed False DRY RUN MODE True
aeat app ledger remove {transaction_id} --reason wrong file imported --yesaeat app ledger remove {transaction_id} --reason wrong file imported --yesBucket <profile-id> ID 1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb Removed True DRY RUN MODE False
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "error": { "action": { "action": null, "argument_bindings": [], "conditionality": "not_applicable", "evidence": [ { "condition_id": "cli.ledger.transaction_id.resolves", "evidence_id": "cli.ledger.transaction_id.resolves.observation", "provenance": "runtime_observation", "values": { "transaction_id_resolves": false } } ], "failed_condition_id": "cli.ledger.transaction_id.resolves", "missing_argument_names": [], "no_recovery_outcome": "operator_decision" }, "category": "REFUSED", "code": "REFUSED_FINANCIAL_LEDGER_TRANSACTION_ID_PREFIX", "context": { "prefix": "'1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb'" }, "message": "no transaction matches id prefix '1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb'", "retryable": false, "runbook_id": null, "trace_id": null }, "notices": [], "schema_version": "2", "status": "error" }
Confirm the removed transaction no longer resolves.
Una transacción eliminada desaparece de tus registros activos: el view final se niega porque el id ya no nombra una fila activa.
Divide una transacción en partes¶
Cuando un pago cubre dos cosas distintas -por ejemplo, un pago con tarjeta que mezcla artículos de la actividad y personales-, divídelo en partes. Los importes y las descripciones se emparejan uno por parte: el primer importe va con la primera descripción, y así sucesivamente:
aeat --format json app ledger add --date 2026-03-15 --amount 121.00 --direction OUTGOING \
--description Mixed receipt --idempotency-key correct-splitaeat --format json app ledger add --date 2026-03-15 --amount 121.00 --direction OUTGOING `
--description Mixed receipt --idempotency-key correct-split{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "9f5e7d2af0b80902321e3b1202a64f33db90510f94d37b6ac8a1faae0c89d25c" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "121", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Mixed receipt", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9" }, "schema_version": "2", "status": "success" }
aeat --format json app ledger split {transaction_id} --child-amount 100.00 \
--child-description office supplies --child-amount 21.00 --child-description \
personal items --reason mixed receipt --yesaeat --format json app ledger split {transaction_id} --child-amount 100.00 `
--child-description office supplies --child-amount 21.00 --child-description `
personal items --reason mixed receipt --yes{ "active_profile": "docs-sequence-sandbox", "command": "ledger.split", "notices": [], "result": { "bucket_event_id": "2960d40c4f90dbaa25b1c462ce52210f4b2cc4ab1904c6c78c08739e821fbf1b", "bucket_id": "<bucket-id>", "child_transaction_ids": [ "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49", "0bba86e710bdb3ccf97cd1cf82d62a5011a7107989ee76648f8ef8932c28ba0e" ], "child_transactions": [ { "display_id": "9cc7a263", "full_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49" }, { "display_id": "0bba86e7", "full_id": "0bba86e710bdb3ccf97cd1cf82d62a5011a7107989ee76648f8ef8932c28ba0e" } ], "classified_child_count": null, "llm": null, "parent_amount": null, "parent_transaction_id": "e55d6600ead7d9490cb4774a0de8f8e9254866b0015b5c6898c68569e8d7a6e9", "persisted": null, "proposed_children": null, "provenance": null, "provider": null, "reason": null, "split_group_id": "49e46bf12630b536b609999a5502582c94bc0faefcbba41cf784f89552823662" }, "schema_version": "2", "status": "success" }
aeat --format json app ledger view {first_part}aeat --format json app ledger view {first_part}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "100", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "office supplies", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "9cc7a2639a30fcead52f62683cdc1c627a8b47cb43ff333f01b19e7f37245b49" }, "schema_version": "2", "status": "success" }
Confirm the split produced two active child parts.
La transacción original pasa a ser el padre de la división, y las partes cargan con el saldo a partir de entonces. La salida de la división imprime una fila child_transactions por parte, cada una con un display_id corto y un full_id completo. Copia esos ids: la orden de fusión los necesita para deshacer la división.
Vuelve a fusionar las partes de una división¶
Para deshacer una división, vuelve a fusionar las partes usando los ids de las hijas que imprimió la división. Nombra todas las partes hermanas: la orden rechaza una fusión parcial. La secuencia divide un pago y luego fusiona las partes en una transacción nueva:
aeat --format json app ledger merge --child-id {first_child} --child-id {second_child} \
--reason undo split --yesaeat --format json app ledger merge --child-id {first_child} --child-id {second_child} `
--reason undo split --yes{ "active_profile": "docs-sequence-sandbox", "command": "ledger.merge", "notices": [], "result": { "bucket_event_id": "24fa3aac51e5315bbb008dcbc57b80fdc41b292a4d2e504303e54e6c21354591", "bucket_id": "<bucket-id>", "merged_transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9", "parent_transaction_id": "3cda9f1229ee04269a70bb6705dafeff1de2f9b14f1bfcefacba4ae277b20a9d", "source_child_ids": [ "63c3f9245937ab54232f067804fc12248abcbb1a5f9d93e9433313f8bf74b23d", "e0504b924f0b4500f0be1c70fe2958279ff9d9d0e5f61c4c66615fe9ed65ae84" ], "split_group_id": "ea58900b8c1962062494a7fb1c80418936a96ae53f2e402af33f8b212fb055c0" }, "schema_version": "2", "status": "success" }
aeat --format json app ledger view {merged}aeat --format json app ledger view {merged}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "121", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Split to undo", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "afc12ac601d050659efe0abace313167f275923e77ba6b0a4ead868f32d7cdd9" }, "schema_version": "2", "status": "success" }
Confirm the merge produced a single active transaction carrying the full amount.
Las partes y el padre original pasan al historial, y la fusión crea una transacción nueva en su lugar. Si ya no tienes la salida de la división, las partes son filas activas: ejecuta aeat app ledger list y lee sus ids del listado.
Aparta una transacción sobre la que tienes dudas¶
Stash aparta una transacción para más adelante. Una transacción apartada se mantiene fuera del trabajo ordinario. La secuencia aparta una fila y confirma su nuevo estado del ciclo de vida:
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
--description Awaiting invoice --idempotency-key correct-stashaeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING `
--description Awaiting invoice --idempotency-key correct-stash{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "78ad404abaedb72ff65685f682bb8eeb58032ac35d5553aabd48810cc6cbea06" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "80", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Awaiting invoice", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22" }, "schema_version": "2", "status": "success" }
aeat app ledger stash {transaction_id} --reason waiting for invoice --yesaeat app ledger stash {transaction_id} --reason waiting for invoice --yesID f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22 Date 2026-03-15 Amount 80 Description Awaiting invoice Review status pending
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "80", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Awaiting invoice", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "STASHED", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22" }, "schema_version": "2", "status": "success" }
Confirm the transaction moved to the stashed state.
Usa stash para una fila que aún no has resuelto y archive para una fila que has apartado a propósito, como un duplicado confirmado. Ambas son reversibles: restore devuelve la fila a activa. La orden stash imprime los campos de la transacción pero no su nuevo estado del ciclo de vida, así que view es como confirmas que el cambio surtió efecto.
Archiva una transacción¶
Archive mantiene una transacción en el historial pero fuera del trabajo ordinario: es la opción adecuada para los duplicados de los que quieres conservar un rastro deliberado. La secuencia archiva una fila duplicada y confirma el cambio de estado:
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
--description Duplicate import --idempotency-key correct-archiveaeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING `
--description Duplicate import --idempotency-key correct-archive{ "active_profile": "docs-sequence-sandbox", "command": "ledger.add", "notices": [], "result": { "bucket_event_ids": [ "23efbc39a82a4a3977431bce885841629c5b7721e681921b8b70c0b9d90586f1" ], "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "80", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Duplicate import", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0" }, "schema_version": "2", "status": "success" }
aeat app ledger archive {transaction_id} --reason duplicate imported row --yesaeat app ledger archive {transaction_id} --reason duplicate imported row --yesID a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0 Date 2026-03-15 Amount 80 Description Duplicate import Review status pending
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "80", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Duplicate import", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ARCHIVED", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0" }, "schema_version": "2", "status": "success" }
Confirm the duplicate moved to the archived state.
Igual que stash, la orden imprime los campos de la transacción pero no su nuevo estado del ciclo de vida, así que view confirma que la fila ahora muestra ARCHIVED.
Restaura una transacción apartada o archivada¶
Si apartaste o archivaste una transacción por error, restáurala a activa. Restore es la inversa de stash y archive: la fila vuelve a tus listas y totales del día a día. La secuencia aparta una fila y luego la restaura:
aeat app ledger restore {transaction_id} --reason stashed by mistake --yesaeat app ledger restore {transaction_id} --reason stashed by mistake --yesID d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332 Date 2026-03-15 Amount 80 Description Stashed by mistake Review status pending
aeat --format json app ledger view {transaction_id}aeat --format json app ledger view {transaction_id}{ "active_profile": "docs-sequence-sandbox", "command": "ledger.view", "notices": [], "result": { "bucket_id": "<bucket-id>", "review_status": "pending", "transaction": { "amount": "80", "attachment_ids": [], "booked_date": "2026-03-15", "business_classification": "NOT_YET_PROCESSED", "business_pct": null, "category_id": null, "classification_confidence": null, "classification_reason": "", "classified_at": null, "classified_by": "auto", "counterparty": "", "counterparty_country": null, "counterparty_identification_state": null, "created_at": "2026-04-01T09:00:00+00:00", "currency": "EUR", "date": "2026-03-15", "description": "Stashed by mistake", "direction": "OUTGOING", "fx_rate": null, "invoice_id": null, "irpf_category": null, "iva_amount": null, "iva_category": null, "iva_rate": null, "lifecycle_state": "ACTIVE", "m210_income_classification": null, "modified_at": "2026-04-01T09:00:00+00:00", "notes": "", "prorrata_reference": null, "purchase_invoice_evidence_id": null, "source_jurisdiction": "ES", "taxable_base": null, "transaction_id": "d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332", "usage_ratio_id": null, "value_date": null, "value_in_eur": null }, "transaction_id": "d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332" }, "schema_version": "2", "status": "success" }
Confirm the restored transaction is active again.
Restore acepta el mismo prefijo de id que aceptan las demás órdenes. Para recuperar varias filas apartadas por error, restaura cada una por su id: no necesitas restablecer todo el ledger. List no tiene un filtro solo para apartadas, así que identifica las filas apartadas por los ids que apartaste, o por el estado del ciclo de vida de cada fila que muestra view.
Restore rechaza una fila que ya está activa, y rechaza una fila cuyo periodo ya has presentado: restaurarla cambiaría los datos que hay detrás de una declaración que has presentado. Restaura una de estas solo después de haber corregido la presentación mediante una declaración complementaria.
Revisa lo que ha cambiado¶
Cada corrección queda registrada. Para ver todas las acciones sobre una transacción en orden, ejecuta ledger history. La secuencia divide un pago y luego lee el historial con la opción de hermanas para seguir toda la familia de la división:
aeat app ledger history {transaction_id}aeat app ledger history {transaction_id}Bucket <profile-id> ID 1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570 Event count 2 2026-04-01T09:00:00+00:00 ledger.transaction.split 0dd721341b0758df0aa4baaab3e24ad7dd79c3a2f90f5f2fc17856dfe491a21f 2026-04-01T09:00:00+00:00 ledger.transaction.created 808c7c37fdc6678905928147c14d45cb7e28450f8c87c917c27a3b61f6406388
aeat --format json app ledger history {transaction_id} --include-split-siblingsaeat --format json app ledger history {transaction_id} --include-split-siblings{ "active_profile": "docs-sequence-sandbox", "command": "ledger.history", "notices": [], "result": { "bucket_id": "<bucket-id>", "event_count": 2, "events": [ { "actor": "<profile-id>", "bucket_id": "<bucket-id>", "event_id": "0dd721341b0758df0aa4baaab3e24ad7dd79c3a2f90f5f2fc17856dfe491a21f", "event_type": "ledger.transaction.split", "object_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570", "object_type": "ledger_transaction", "occurred_at": "2026-04-01T09:00:00Z", "payload": { "child_count": "2", "parent_transaction_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570", "reason": "mixed receipt", "source_command": "aeat app ledger split", "split_group_id": "4d2d96d6579ac45716e2561a4bc5e7c73876e0a76843db90f5045ebc6dc7a026" }, "payload_version": 1 }, { "actor": "<profile-id>", "bucket_id": "<bucket-id>", "event_id": "808c7c37fdc6678905928147c14d45cb7e28450f8c87c917c27a3b61f6406388", "event_type": "ledger.transaction.created", "object_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570", "object_type": "ledger_transaction", "occurred_at": "2026-04-01T09:00:00Z", "payload": { "amount": "121.00", "currency": "EUR", "direction": "OUTGOING", "source_command": "aeat app ledger add" }, "payload_version": 1 } ], "transaction_id": "1fa07beedceb057f55a3aab56aa756e9dab983c332573ee6bdb1e77bb0e16570" }, "schema_version": "2", "status": "success" }
Confirm the history records the transaction's events in order.
El historial enumera cada acción en orden con su marca de tiempo y su referencia de evento. Los detalles como el motivo y los valores nuevos están en la salida JSON. Para ver un valor antes de un cambio, lee los eventos anteriores del historial. La referencia de la CLI cubre todos los campos que muestra el historial.
Evidencia y correcciones¶
Un registro de evidencia adjunto -un recibo o una factura- no se borra cuando corriges una transacción. Después de una división o una fusión, comprueba las transacciones nuevas y vuelve a adjuntar la evidencia donde haz falta. La guía de evidencia trata cómo adjuntar y comprobar la evidencia.
Empieza de cero como último recurso¶
Si el ledger no tiene arreglo -por ejemplo, después de importar los archivos equivocados repetidamente-, vacíalo y reconstrúyelo. Haz primero una vista previa y luego confirma. La secuencia registra una fila, muestra una vista previa del restablecimiento, vacía el ledger y confirma que no queda nada:
aeat app ledger reset --reason re-importing all statements --dry-runaeat app ledger reset --reason re-importing all statements --dry-runBucket <profile-id> Rows 1 Reset False DRY RUN MODE True
aeat app ledger reset --reason re-importing all statements --yesaeat app ledger reset --reason re-importing all statements --yesBucket <profile-id> Rows 1 Reset True DRY RUN MODE False
aeat --format json app ledger listaeat --format json app ledger list{ "active_profile": "docs-sequence-sandbox", "command": "ledger.list", "notices": [], "result": { "bucket_id": "<bucket-id>", "limit": null, "offset": 0, "rows": [], "shown": 0, "total": 0, "truncated": false }, "schema_version": "2", "status": "success" }
Confirm the reset cleared the active ledger.
Reset vacía todo el ledger del perfil activo. Usa la guía de transacciones para reconstruirlo a partir de tus extractos.
Dónde conseguir ayuda¶
Si una orden se niega o falla, consulta la guía de resolución de problemas. Los términos que no conozcas se explican en el glosario. Antes de compartir la salida de una orden con nadie, elimina los identificadores fiscales como tu NIF, CIF, DNI, NIE o NII.
Próximos pasos¶
Importar y gestionar transacciones: trae transacciones nuevas.
Adjuntar evidencia a las transacciones: respalda tus correcciones con recibos.
Clasificar transacciones: prepara las filas corregidas para los cálculos fiscales.
Referencia de la CLI: detalle completo de campos para todas las órdenes del ledger.