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:

1Record an example expense you will correct in the sections below.
aeat --format json app ledger add --date 2026-03-15 --amount 210.00 --direction OUTGOING \
  --description Silla de oficina --idempotency-key correct-find
aeat --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"
}
2List your transactions to find the one to fix.
aeat app ledger list
aeat app ledger list
ACCOUNTING LEDGER TRANSACTIONS
id	full_id	date	amount	description	IVA category	review_status
f83add28	f83add280832e5cbcbfc1da6432f5e6a7e02eb78ba74fc265eb483b805ee7afb	2026-03-15	210	Silla de oficina		pending
3Inspect one transaction in detail before changing it.
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:

1Record a transaction with a wrong price to correct.
aeat --format json app ledger add --date 2026-03-15 --amount 100.00 --direction OUTGOING \
  --description Office chair --idempotency-key correct-update
aeat --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"
}
2Change the amount and description in one command.
aeat app ledger update {transaction_id} --amount 121.00 --description \
  Office chair, corrected price
aeat app ledger update {transaction_id} --amount 121.00 --description `
  Office chair, corrected price
ID	59316515102ea30c11d09b68fccd42fd4ed6b385f8fe1324412724fb1827dfe5
Date	2026-03-15
Amount	121
Description	Office chair, corrected price
Review status	pending
3The original id still resolves; view it to confirm the correction.
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:

1Record a transaction imported from the wrong file.
aeat --format json app ledger add --date 2026-03-15 --amount 60.50 --direction OUTGOING \
  --description Wrong import --idempotency-key correct-remove
aeat --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"
}
2Preview the removal without deleting anything.
aeat app ledger remove {transaction_id} --reason wrong file imported --dry-run
aeat app ledger remove {transaction_id} --reason wrong file imported --dry-run
Bucket	<profile-id>
ID	1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb
Removed	False
DRY RUN MODE	True
3Remove it for real.
aeat app ledger remove {transaction_id} --reason wrong file imported --yes
aeat app ledger remove {transaction_id} --reason wrong file imported --yes
Bucket	<profile-id>
ID	1caacc8087e969e8648cc8618626fb93510b89a62186b1854f9a1893813869eb
Removed	True
DRY RUN MODE	False
4Confirm the id no longer resolves.
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:

1Record a card payment that mixes business and personal items.
aeat --format json app ledger add --date 2026-03-15 --amount 121.00 --direction OUTGOING \
  --description Mixed receipt --idempotency-key correct-split
aeat --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"
}
2Split the payment into two parts.
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 --yes
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 --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"
}
3Confirm the first part is an active transaction of its own.
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:

1Merge the two parts back into one transaction, naming every sibling.
aeat --format json app ledger merge --child-id {first_child} --child-id {second_child} \
  --reason undo split --yes
aeat --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"
}
2Confirm the merged transaction is active and carries the full amount.
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:

1Record a transaction you are not ready to resolve.
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
  --description Awaiting invoice --idempotency-key correct-stash
aeat --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"
}
2Set it aside for later.
aeat app ledger stash {transaction_id} --reason waiting for invoice --yes
aeat app ledger stash {transaction_id} --reason waiting for invoice --yes
ID	f5c6e7a8fce9960b36a29df9e59c7954affef5dc4bf50cd6a0aaaebc3eed8c22
Date	2026-03-15
Amount	80
Description	Awaiting invoice
Review status	pending
3Confirm the lifecycle state now reads STASHED.
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:

1Record a duplicate row you want to keep a trace of.
aeat --format json app ledger add --date 2026-03-15 --amount 80.00 --direction OUTGOING \
  --description Duplicate import --idempotency-key correct-archive
aeat --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"
}
2Archive it out of ordinary work.
aeat app ledger archive {transaction_id} --reason duplicate imported row --yes
aeat app ledger archive {transaction_id} --reason duplicate imported row --yes
ID	a095fd3caed8beeb0a33806f3b456822e31378e214e89067227d9f2fc6d0d6b0
Date	2026-03-15
Amount	80
Description	Duplicate import
Review status	pending
3Confirm the lifecycle state now reads ARCHIVED.
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:

1Return it to your everyday lists and totals.
aeat app ledger restore {transaction_id} --reason stashed by mistake --yes
aeat app ledger restore {transaction_id} --reason stashed by mistake --yes
ID	d74c37a7d906824ef0171222e6c84b31dbcbcf5ed11806ce7864ff3db1267332
Date	2026-03-15
Amount	80
Description	Stashed by mistake
Review status	pending
2Confirm the lifecycle state is ACTIVE again.
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:

1List every action on the transaction in order.
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
2Follow the whole split family with the sibling flag.
aeat --format json app ledger history {transaction_id} --include-split-siblings
aeat --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:

1Preview the reset without clearing anything.
aeat app ledger reset --reason re-importing all statements --dry-run
aeat app ledger reset --reason re-importing all statements --dry-run
Bucket	<profile-id>
Rows	1
Reset	False
DRY RUN MODE	True
2Clear the whole ledger for the active profile.
aeat app ledger reset --reason re-importing all statements --yes
aeat app ledger reset --reason re-importing all statements --yes
Bucket	<profile-id>
Rows	1
Reset	True
DRY RUN MODE	False
3Confirm no transactions remain.
aeat --format json app ledger list
aeat --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