Prepare your first quarterly IRPF filing

This page covers your first quarterly Modelo 130 filing, end to end: bring a quarter of transactions into the ledger, classify them as business income and deductible expenses, prepare the draft, and check that it passed verification before you file it. It is written for a self-employed taxpayer with a NIF, CIF, NIE, or other filing identity who is running Cadrumo for the first time.

Cadrumo never submits a return to the Agencia Estatal de Administración Tributaria (AEAT). It produces the Modelo 130 fichero-BOE artefact locally; you present that file through the official AEAT channel.

The commands on this page run live at build time in a fresh, synthetic sandbox. The transactions, amounts, and taxpayer are invented. Run the same commands against your own profile to see your own figures.

Requirement: a valid taxpayer profile. Create one with aeat config profile create <name> before you start. Set up your profile walks through it step by step.

Bring your quarter’s transactions in

Import your bank statement for the quarter. This example reads a small comma-separated statement with two movements: one payment collected from a client, and one office-supplies purchase.

1Bring the quarter's bank movements into the ledger.
aeat app ledger import --file fixtures/movimientos-2026-1t.csv --provider csv
aeat app ledger import --file fixtures/movimientos-2026-1t.csv --provider csv
Rows	2
Entries imported	2
Skipped	0
2Check that the quarter's ledger now holds both movements.
aeat --format json app ledger list --year 2026 --period 1T
aeat --format json app ledger list --year 2026 --period 1T
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.list",
  "notices": [],
  "result": {
    "bucket_id": "<bucket-id>",
    "limit": null,
    "offset": 0,
    "rows": [
      {
        "amount": "1210",
        "attachment_ids": [],
        "booked_date": "2026-02-10",
        "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-02-10",
        "description": "Cobro factura F-2026-001 servicios de consultoria",
        "direction": "INCOMING",
        "display_id": "71a5db2b",
        "full_id": "71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518",
        "fx_rate": null,
        "group_label": 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,
        "review_status": "pending",
        "source_jurisdiction": null,
        "taxable_base": null,
        "transaction_id": "71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518",
        "usage_ratio_id": null,
        "value_date": "2026-02-10",
        "value_in_eur": null
      },
      {
        "amount": "605",
        "attachment_ids": [],
        "booked_date": "2026-02-11",
        "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-02-11",
        "description": "Compra de material de oficina proveedor local",
        "direction": "OUTGOING",
        "display_id": "e3eeac5e",
        "full_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d",
        "fx_rate": null,
        "group_label": 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,
        "review_status": "pending",
        "source_jurisdiction": null,
        "taxable_base": null,
        "transaction_id": "e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d",
        "usage_ratio_id": null,
        "value_date": "2026-02-11",
        "value_in_eur": null
      }
    ],
    "shown": 2,
    "total": 2,
    "truncated": false
  },
  "schema_version": "2",
  "status": "success"
}

Confirm both movements are now in the ledger.

The import reads the statement and stores each movement as a ledger row. The listing confirms the two rows landed in the first quarter of 2026. Point --provider at the format your bank exports; list the accepted providers with:

1Show the import command's help, including the accepted providers.
aeat app ledger import --help
aeat app ledger import --help
Usage: aeat app ledger import [OPTIONS]

  Import bank statements or records into the accounting ledger

Options:
  --file <path>                   Path to the bank statement file or directory
                                  [required]
  --provider <auto|csv|ofx|qfx|xlsx|excel|n26|pdf|pdf-n26>
                                  Statement format provider.  [required]
  --dry-run                       Run the import in dry-run mode (without
                                  saving)
  --verify                        Verify entries after import
  --verify-source <path>          Original file used to verify imported rows.
  --verbose                       Show detailed information during import
  --period <str>                  Filing period as an AEAT token: 1T-4T
                                  (quarters), 0A (annual), 01-12 (months).
                                  Combine with --year to choose the year.
  --year <int>                    Filing year for --period (e.g. 2024).
  --install-completion            Install completion for the current shell.
  --show-completion               Show completion for the current shell, to
                                  copy it or customize the installation.
  --help                          Show this message and exit.

Confirm the import command lists its accepted providers.

Classify each transaction

An imported row carries a date and an amount, but it does not yet say how the tax calculation should treat it. Classify each row before you calculate.

Mark the collected payment as business income and the purchase as a deductible business expense with a category. Take each transaction id from the listing above. The income classification takes only the business decision:

1Classify the collected payment as business income.
aeat --format json app ledger classify 71a5db2b --classification BUSINESS
aeat --format json app ledger classify 71a5db2b --classification BUSINESS
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.classify",
  "notices": [],
  "result": {
    "bucket_event_ids": [
      "59813ece53d01035dac79cf9a8fc8cf9cd8928359b15b5d910766dbbc15948f8"
    ],
    "bucket_id": "<bucket-id>",
    "review_status": "reviewed",
    "transaction": {
      "amount": "1210",
      "attachment_ids": [],
      "booked_date": "2026-02-10",
      "business_classification": "BUSINESS",
      "business_pct": null,
      "category_id": null,
      "classification_confidence": "1",
      "classification_reason": "aeat app ledger classify",
      "classified_at": "2026-04-01T09:00:00+00:00",
      "classified_by": "manual",
      "counterparty": "",
      "counterparty_country": null,
      "counterparty_identification_state": null,
      "created_at": "2026-04-01T09:00:00+00:00",
      "currency": "EUR",
      "date": "2026-02-10",
      "description": "Cobro factura F-2026-001 servicios de consultoria",
      "direction": "INCOMING",
      "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": null,
      "taxable_base": null,
      "transaction_id": "71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518",
      "usage_ratio_id": null,
      "value_date": "2026-02-10",
      "value_in_eur": null
    },
    "transaction_id": "71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the collected payment is classified as business income.

For an expense, add --category-id <category-id> plus the taxable base and IVA fields. List the accepted categories any time:

1List the accepted expense categories.
aeat --format json app ledger categories
aeat --format json app ledger categories
{
  "active_profile": "docs-sequence-sandbox",
  "command": "ledger.categories",
  "notices": [],
  "result": {
    "category_ids": [
      "cuotas_colegiales",
      "cuotas_autonomos_ss",
      "mutualidad_alternativa",
      "arrendamiento_local",
      "arrendamiento_vivienda_afecto",
      "ibi_local_afecto",
      "suministros_local_afecto",
      "suministros_home_office_luz",
      "suministros_home_office_agua",
      "suministros_home_office_gas",
      "suministros_home_office_internet",
      "amortizacion_vivienda_afecto",
      "ibi_vivienda_afecto",
      "comunidad_vivienda_afecto",
      "telefonia_movil",
      "telefonia_fija",
      "material_oficina",
      "software_suscripcion",
      "hardware_amortizable",
      "mobiliario_amortizable",
      "reparaciones_conservacion",
      "vehiculo_combustible",
      "vehiculo_mantenimiento",
      "vehiculo_seguro",
      "vehiculo_peaje",
      "vehiculo_parking",
      "manutencion_dietas_nacional",
      "manutencion_dietas_extranjero",
      "asesoria_fiscal",
      "asesoria_juridica",
      "asesoria_contable",
      "publicidad_marketing",
      "formacion_profesional",
      "viajes_transporte",
      "viajes_alojamiento",
      "seguros_responsabilidad_civil",
      "seguros_salud_autonomo",
      "gastos_bancarios",
      "gastos_financieros",
      "suministros_cliente_directos",
      "subcontratacion",
      "tributos_fiscalmente_deducibles"
    ],
    "families": [
      {
        "category_ids": [
          "cuotas_colegiales",
          "cuotas_autonomos_ss",
          "mutualidad_alternativa"
        ],
        "family": "social_security"
      },
      {
        "category_ids": [
          "arrendamiento_local",
          "ibi_local_afecto",
          "suministros_local_afecto"
        ],
        "family": "premises"
      },
      {
        "category_ids": [
          "suministros_home_office_luz",
          "suministros_home_office_agua",
          "suministros_home_office_gas",
          "suministros_home_office_internet",
          "telefonia_fija"
        ],
        "family": "home_office_suministros"
      },
      {
        "category_ids": [
          "amortizacion_vivienda_afecto",
          "ibi_vivienda_afecto",
          "comunidad_vivienda_afecto",
          "arrendamiento_vivienda_afecto"
        ],
        "family": "home_office_ownership"
      },
      {
        "category_ids": [
          "telefonia_movil"
        ],
        "family": "telecoms"
      },
      {
        "category_ids": [
          "material_oficina",
          "software_suscripcion",
          "hardware_amortizable",
          "mobiliario_amortizable",
          "reparaciones_conservacion",
          "publicidad_marketing",
          "formacion_profesional"
        ],
        "family": "office"
      },
      {
        "category_ids": [
          "vehiculo_combustible",
          "vehiculo_mantenimiento",
          "vehiculo_seguro",
          "vehiculo_peaje",
          "vehiculo_parking"
        ],
        "family": "vehicle"
      },
      {
        "category_ids": [
          "manutencion_dietas_nacional",
          "manutencion_dietas_extranjero"
        ],
        "family": "meals"
      },
      {
        "category_ids": [
          "asesoria_fiscal",
          "asesoria_juridica",
          "asesoria_contable"
        ],
        "family": "professional_services"
      },
      {
        "category_ids": [
          "viajes_transporte",
          "viajes_alojamiento"
        ],
        "family": "travel"
      },
      {
        "category_ids": [
          "seguros_responsabilidad_civil",
          "seguros_salud_autonomo"
        ],
        "family": "insurance"
      },
      {
        "category_ids": [
          "gastos_bancarios",
          "gastos_financieros"
        ],
        "family": "financial"
      },
      {
        "category_ids": [
          "suministros_cliente_directos",
          "subcontratacion"
        ],
        "family": "direct_costs"
      },
      {
        "category_ids": [
          "tributos_fiscalmente_deducibles"
        ],
        "family": "taxes"
      }
    ],
    "income_requires_category": false,
    "irpf_categories": [
      {
        "directions": [
          "INCOMING",
          "OUTGOING"
        ],
        "id": "actividad_economica",
        "net_paid_invoice": true,
        "purpose": "activity_income_withholding",
        "related_category_ids": [
          "asesoria_contable",
          "asesoria_fiscal",
          "asesoria_juridica"
        ]
      },
      {
        "directions": [
          "OUTGOING"
        ],
        "id": "arrendamiento_local",
        "net_paid_invoice": true,
        "purpose": "rent_expense_withholding",
        "related_category_ids": [
          "arrendamiento_local"
        ]
      },
      {
        "directions": [
          "OUTGOING"
        ],
        "id": "arrendamiento_vivienda_afecto",
        "net_paid_invoice": true,
        "purpose": "rent_expense_withholding",
        "related_category_ids": [
          "arrendamiento_vivienda_afecto"
        ]
      },
      {
        "directions": [
          "INCOMING"
        ],
        "id": "trabajo",
        "net_paid_invoice": false,
        "purpose": "employment_income",
        "related_category_ids": []
      }
    ],
    "irpf_category_ids": [
      "actividad_economica",
      "arrendamiento_local",
      "arrendamiento_vivienda_afecto",
      "trabajo"
    ],
    "net_paid_withholding_irpf_category_ids": [
      "actividad_economica",
      "arrendamiento_local",
      "arrendamiento_vivienda_afecto"
    ]
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the accepted expense categories read back.

For the full classification workflow (bulk classification, mixed-use shares, and the review queue), read Classify transactions.

Prepare the Modelo 130 draft

Once the quarter’s rows are classified, prepare the instalment. The preparation below sets up a self-employed profile and a classified ledger, then creates the draft, calculates it, and verifies it. Modelo 130 is the IRPF payment on account for self-employed activity under estimación directa.

1Open a Modelo 130 draft for the first quarter.
aeat --format json app modelo work create --modelo 130 --year 2026 --period 1T
aeat --format json app modelo work create --modelo 130 --year 2026 --period 1T
{
  "active_profile": "docs-sequence-sandbox",
  "command": "modelo.work.create",
  "notices": [],
  "result": {
    "applicability_guard_bypassed": false,
    "bucket_id": "<bucket-id>",
    "causante_ccaa": null,
    "created_at": "2026-04-01T09:00:00+00:00",
    "current_calculation_revision_id": null,
    "current_filing_record_id": null,
    "discard_reason": null,
    "discarded_at": null,
    "discarded_by": null,
    "filed_calculation_revision_id": null,
    "filing_year": 2026,
    "modelo": "130",
    "name": "130-2026-1T",
    "name_applied": null,
    "operation": "modelo.work.create",
    "period": {
      "code": "1T",
      "filing_year": 2026
    },
    "revision_id": "2019-y-siguientes",
    "short_current_calculation_revision_id": null,
    "short_filed_calculation_revision_id": null,
    "short_work_unit_id": "3d88172f4204",
    "state": "borrador",
    "status": "created",
    "status_message": "New work unit created.",
    "updated_at": "2026-04-01T09:00:00+00:00",
    "work_unit_id": "ca5815c72d1ed564e582924ad157fd1c3349eba45264da2a7b843d88172f4204"
  },
  "schema_version": "2",
  "status": "success"
}
2Calculate the quarter's instalment from the classified ledger.
aeat --format json app modelo work calculate {work_unit_id} --binding \
  modelo-130-resultados-negativos-anteriores=0 --binding \
  modelo-130-pagos-fraccionados-anteriores=0 --binding \
  irpf.previous_year_economic_activity_net_income=0
aeat --format json app modelo work calculate {work_unit_id} --binding `
  modelo-130-resultados-negativos-anteriores=0 --binding `
  modelo-130-pagos-fraccionados-anteriores=0 --binding `
  irpf.previous_year_economic_activity_net_income=0
{
  "active_profile": "docs-sequence-sandbox",
  "command": "modelo.work.calculate",
  "notices": [],
  "result": {
    "authorization_state": null,
    "binding_overrides": {
      "irpf.previous_year_economic_activity_net_income": "0",
      "modelo-130-actividad-economica-gastos-cumulative": "500",
      "modelo-130-actividad-economica-ingresos-cumulative": "1000",
      "modelo-130-actividad-economica-ingresos-taxable-base-cumulative": "1000",
      "modelo-130-actividad-economica-rendimiento-neto-cumulative": "1000",
      "modelo-130-actividad-economica-retenciones-cumulative": "0",
      "modelo-130-pagos-fraccionados-anteriores": "0",
      "modelo-130-resultados-negativos-anteriores": "0"
    },
    "calculation_revision_id": "07d9ed8eec846976eac02aeae13217e835e000f8a460d053909b33d9a3995fec",
    "casilla_values": {
      "01": "1000",
      "02": "500",
      "03": "500.00",
      "04": "100.00",
      "05": "0",
      "06": "0",
      "07": "100.00",
      "08": "0",
      "09": "0.00",
      "10": "0",
      "11": "0.00",
      "12": "100.00",
      "13": "100.00",
      "14": "0.00",
      "15": "0.00",
      "16": "0",
      "17": "0.00",
      "18": "0",
      "19": "0.00",
      "saldo-negativo-fin-periodo": "0.00"
    },
    "created_at": "2026-04-01T09:00:00+00:00",
    "deadline": {
      "closes_on": "2026-04-20",
      "conditional_recargo_preview": null,
      "days_overdue": null,
      "days_remaining": 19
    },
    "detail_rows": [],
    "filed_at": null,
    "filed_by": null,
    "input_values_by_casilla_id": {
      "01": "1000",
      "02": "500",
      "05": "0",
      "06": "0"
    },
    "modality": null,
    "modality_reason": null,
    "observations": [
      {
        "absent_by_design": false,
        "casilla_id": "01",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95",
          "ley-35-2006:art-27",
          "ley-35-2006:art-28"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "1000"
      },
      {
        "absent_by_design": false,
        "casilla_id": "02",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95",
          "ley-35-2006:art-28",
          "ley-35-2006:art-30"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "500"
      },
      {
        "absent_by_design": false,
        "casilla_id": "03",
        "formula_id": "modelo-130-rendimiento-neto",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "01",
          "02"
        ],
        "operand_refs": [
          "01",
          "02"
        ],
        "operand_values": [
          "1000",
          "500"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "500.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "04",
        "formula_id": "modelo-130-pago-fraccionado-directa",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "max",
        "operand_casilla_refs": [
          "03"
        ],
        "operand_refs": [
          "03",
          "irpf.direct_estimation_fractional_payment_rate"
        ],
        "operand_values": [
          "500.00",
          "20"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "100.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "05",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "06",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "07",
        "formula_id": "modelo-130-resultado-apartado-i",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "04",
          "05",
          "06"
        ],
        "operand_refs": [
          "04",
          "05",
          "06"
        ],
        "operand_values": [
          "100.00",
          "0",
          "0"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "100.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "08",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "09",
        "formula_id": "modelo-130-pago-fraccionado-agrario",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "percent",
        "operand_casilla_refs": [
          "08"
        ],
        "operand_refs": [
          "08",
          "irpf.agriculture_fractional_payment_rate"
        ],
        "operand_values": [
          "0",
          "2"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "10",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "11",
        "formula_id": "modelo-130-resultado-apartado-ii",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "09",
          "10"
        ],
        "operand_refs": [
          "09",
          "10"
        ],
        "operand_values": [
          "0.00",
          "0"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "12",
        "formula_id": "modelo-130-suma-parciales",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "max",
        "operand_casilla_refs": [
          "07",
          "11"
        ],
        "operand_refs": [
          "07",
          "11"
        ],
        "operand_values": [
          "100.00",
          "0.00"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "100.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "13",
        "formula_id": "modelo-130-minoracion-rendimientos-netos",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "if_then_else",
        "operand_casilla_refs": [],
        "operand_refs": [
          "irpf.previous_year_economic_activity_net_income"
        ],
        "operand_values": [
          "0"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "100.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "14",
        "formula_id": "modelo-130-neto-tras-minoracion",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "12",
          "13"
        ],
        "operand_refs": [
          "12",
          "13"
        ],
        "operand_values": [
          "100.00",
          "100.00"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "15",
        "formula_id": "modelo-130-resultados-negativos-anteriores-cap",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "min",
        "operand_casilla_refs": [
          "14"
        ],
        "operand_refs": [
          "modelo-130-resultados-negativos-anteriores",
          "14"
        ],
        "operand_values": [
          "0",
          "0.00"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "16",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "17",
        "formula_id": "modelo-130-diferencia",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "14",
          "15",
          "16"
        ],
        "operand_refs": [
          "14",
          "15",
          "16"
        ],
        "operand_values": [
          "0.00",
          "0.00",
          "0"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "18",
        "formula_id": null,
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": null,
        "operand_casilla_refs": [],
        "operand_refs": [],
        "operand_values": [],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0"
      },
      {
        "absent_by_design": false,
        "casilla_id": "19",
        "formula_id": "modelo-130-resultado-final",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "subtract",
        "operand_casilla_refs": [
          "17",
          "18"
        ],
        "operand_refs": [
          "17",
          "18"
        ],
        "operand_values": [
          "0.00",
          "0"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      },
      {
        "absent_by_design": false,
        "casilla_id": "saldo-negativo-fin-periodo",
        "formula_id": "modelo-130-saldo-negativo-fin-periodo",
        "legal_refs": [
          "rd-439-2007:art-110",
          "orden-eha-672-2007:art-1",
          "ley-35-2006:art-99",
          "rd-439-2007:art-95"
        ],
        "op": "max",
        "operand_casilla_refs": [
          "17"
        ],
        "operand_refs": [
          "17"
        ],
        "operand_values": [
          "0.00"
        ],
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ],
        "value": "0.00"
      }
    ],
    "operation": "modelo.work.calculate",
    "registry_snapshot_ref": {
      "modelo": "130",
      "modelo_year": 2026,
      "period": "1T",
      "revision_id": "2019-y-siguientes"
    },
    "relation_overrides": {},
    "result_summary": [
      {
        "casilla_id": "03",
        "label": "Net yield",
        "role": "key_figure",
        "value": "500.00"
      },
      {
        "casilla_id": "04",
        "label": "Fractional payment amount",
        "role": "key_figure",
        "value": "100.00"
      },
      {
        "casilla_id": "07",
        "label": "Partial result of Section I",
        "role": "key_figure",
        "value": "100.00"
      },
      {
        "casilla_id": "09",
        "label": "Fractional payment amount",
        "role": "key_figure",
        "value": "0.00"
      },
      {
        "casilla_id": "11",
        "label": "Partial result of Section II",
        "role": "key_figure",
        "value": "0.00"
      },
      {
        "casilla_id": "12",
        "label": "Sum of partial results",
        "role": "key_figure",
        "value": "100.00"
      },
      {
        "casilla_id": "13",
        "label": "Reduction for net yields",
        "role": "key_figure",
        "value": "100.00"
      },
      {
        "casilla_id": "14",
        "label": "Net amount after reduction",
        "role": "key_figure",
        "value": "0.00"
      },
      {
        "casilla_id": "17",
        "label": "Difference",
        "role": "key_figure",
        "value": "0.00"
      },
      {
        "casilla_id": "19",
        "label": "Final result",
        "role": "key_figure",
        "value": "0.00"
      }
    ],
    "saved": true,
    "saved_confirmation": "Saved as draft calculation revision 07d9ed8eec846976eac02aeae13217e835e000f8a460d053909b33d9a3995fec (state: draft). It is persisted and can be resumed later.",
    "source_provenance": [
      {
        "contributor_binding_source": "ledger_renta_income_aggregation",
        "contributor_source_kind": "ledger_renta_income_aggregation",
        "dependency_treatment": "",
        "fingerprint": null,
        "lineage_role": "primary",
        "parent_source_ref": null,
        "resolved_binding_source": "ledger_renta_income_aggregation",
        "resolver_id": "ledger_renta_income_aggregation",
        "source_ref": "transaction:71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518"
      },
      {
        "contributor_binding_source": "ledger_renta_gastos_pago_fraccionado_aggregation",
        "contributor_source_kind": "ledger_renta_gastos_pago_fraccionado_aggregation",
        "dependency_treatment": "",
        "fingerprint": null,
        "lineage_role": "primary",
        "parent_source_ref": null,
        "resolved_binding_source": "ledger_renta_gastos_pago_fraccionado_aggregation",
        "resolver_id": "ledger_renta_gastos_pago_fraccionado_aggregation",
        "source_ref": "transaction:e3eeac5e306efe4e82a72896e92e7c236245ec85348834b2c10b120c67fe087d"
      },
      {
        "contributor_binding_source": "previous_filing",
        "contributor_source_kind": "previous_filing",
        "dependency_treatment": "factual_evidence",
        "fingerprint": null,
        "lineage_role": "primary",
        "parent_source_ref": null,
        "resolved_binding_source": "previous_filing",
        "resolver_id": "previous_filing",
        "source_ref": "100:2025:0A:irpf.previous_year_economic_activity_net_income"
      }
    ],
    "state": "borrador",
    "superseded_at": null,
    "updated_at": "2026-04-01T09:00:00+00:00",
    "verified_at": null,
    "verified_by": null,
    "work_unit_id": "ca5815c72d1ed564e582924ad157fd1c3349eba45264da2a7b843d88172f4204"
  },
  "schema_version": "2",
  "status": "success"
}
3Verify the draft before you export it.
aeat --format json app modelo work verify {calculation_revision_id}
aeat --format json app modelo work verify {calculation_revision_id}
{
  "active_profile": "docs-sequence-sandbox",
  "command": "modelo.work.verify",
  "notices": [
    {
      "action": null,
      "code": "modelo.work.verify.finding.advisory",
      "context": {
        "activity_start_date": "2026-01-01",
        "kind": "advisory",
        "legal_refs": "rd-1065-2007:art-9",
        "origin_code": "previous_filing_binding",
        "severity": "warning",
        "source_filing_year": "2025",
        "source_modelo": "100",
        "source_period": "0A",
        "source_refs": "aeat-dr-130-2019-v12, aeat-modelo-130-instructions"
      },
      "message": "Modelo 100 2025 0A is suppressed by operator declaration (previous_filing_binding), with declared activity start date 2026-01-01.",
      "severity": "warning"
    },
    {
      "action": null,
      "code": "modelo.work.verify.finding.advisory",
      "context": {
        "binding_id": "71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518",
        "diagnostic_reason_code": "missing_transaction_evidence",
        "kind": "advisory",
        "legal_refs": "ley-37-1992:art-97, rd-1619-2012:art-2",
        "severity": "warning",
        "source_kind_code": "output_iva_evidence",
        "source_refs": "aeat-dr-130-2019-v12, aeat-modelo-130-instructions"
      },
      "message": "An output transaction has no supporting evidence (binding 71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518, source output_iva_evidence, reason missing_transaction_evidence).",
      "severity": "warning"
    }
  ],
  "result": {
    "calculation_revision_id": "07d9ed8eec846976eac02aeae13217e835e000f8a460d053909b33d9a3995fec",
    "completeness_status": "complete",
    "findings": [
      {
        "action": null,
        "casilla_id": null,
        "expectation_id": null,
        "kind": "advisory",
        "legal_refs": [
          "rd-1065-2007:art-9"
        ],
        "message": "Modelo 100 2025 0A is suppressed by operator declaration (previous_filing_binding), with declared activity start date 2026-01-01.",
        "severity": "warning",
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ]
      },
      {
        "action": null,
        "casilla_id": null,
        "expectation_id": null,
        "kind": "advisory",
        "legal_refs": [
          "ley-37-1992:art-97",
          "rd-1619-2012:art-2"
        ],
        "message": "An output transaction has no supporting evidence (binding 71a5db2bb891df295bee72544c40497d24d5c8cfc7edab745ce7339dcf8d6518, source output_iva_evidence, reason missing_transaction_evidence).",
        "severity": "warning",
        "source_refs": [
          "aeat-dr-130-2019-v12",
          "aeat-modelo-130-instructions"
        ]
      }
    ],
    "granted_verificado_completo": true,
    "missing_required_casilla_ids": [],
    "operation": "modelo.work.verify",
    "registry_snapshot_ref": {
      "modelo": "130",
      "modelo_year": 2026,
      "period": "1T",
      "revision_id": "2019-y-siguientes"
    },
    "resolved_casilla_ids": [],
    "run_at": "2026-04-01T09:00:00+00:00",
    "verification_report_id": "475fedcde9467701a4a5f9a29274e4a6db03e03b6971e85112a4c911fe7f2f4f",
    "verified_by": "docs-sequence-sandbox"
  },
  "schema_version": "2",
  "status": "warning"
}

Confirm the draft passed verification before you file it.

Read the frames in order:

  • Create the draft for Modelo 130, first quarter 2026. The command reports a work_unit_id that addresses the draft.

  • Calculate it. Cadrumo reads the classified ledger and fills the boxes: casilla 01 is the quarter’s income, casilla 02 the deductible expenses, casilla 03 the net yield, and casilla 04 the instalment. Casilla 01 shows 1000.00, not the 1210.00 you collected: IVA is never part of your income, so the 210.00 of IVA is left out. With the example ledger the net yield is 500.00 and the instalment is 100.00, twenty percent of the net. The three --binding ...=0 values are the prior-period carries a true first quarter does not have.

  • Verify the draft. The result reads granted_verificado_completo true, so the draft is complete and ready to file.

Check the figures and record the filing

The verification result is the signal that the draft is ready. Verification refuses until every deductible-expense row carries linked purchase-invoice evidence, so this example registers the supplier invoice and attaches it before it calculates. Attach in that order: a draft bundles its evidence when you verify it, so an invoice attached afterwards does not reach the filing.

The sequence below exports the verified draft and then records the local filed marker.

1Export the verified draft to the registry-backed fichero-BOE layout.
aeat --format json app modelo export --modelo 130 --year 2026 --period 1T --output \
  ./modelo-130.boe
aeat --format json app modelo export --modelo 130 --year 2026 --period 1T --output `
  ./modelo-130.boe
{
  "active_profile": "docs-sequence-sandbox",
  "command": "modelo.export",
  "notices": [
    {
      "action": null,
      "code": "modelo.export.local_export_not_official_evidence",
      "context": {
        "evidence_status": "local_export_not_official_aeat_filing_evidence",
        "filing_year": "2026",
        "modelo": "130",
        "period": "1T"
      },
      "message": "The local export is not official filing evidence.",
      "severity": "warning"
    }
  ],
  "result": {
    "bucket_event_id": "3ff37989bdc94cfba48d032cd41b6f30e38e44375d3aded8bb46cd96f453832b",
    "bucket_id": "<bucket-id>",
    "byte_size": 946,
    "calculation_revision_id": "07d9ed8eec846976eac02aeae13217e835e000f8a460d053909b33d9a3995fec",
    "file_sha256": "eaf7e73156441acfec60519635ebea91a6a221f32b23b85a638b5219b8536c7d",
    "filing_year": 2026,
    "format": "fichero-boe",
    "modelo": "130",
    "operation": "modelo.export",
    "output_path": "modelo-130.boe",
    "payment_election": null,
    "period": {
      "code": "1T",
      "filing_year": 2026
    },
    "prior_domiciliation_election": {
      "baseline_evidence_reference_id": null,
      "baseline_filing_record_id": null,
      "baseline_result_disposition": null,
      "baseline_source_header_locator": null,
      "election": "keep"
    },
    "refund_election": null,
    "resolved_result_disposition": "N",
    "work_unit_id": "ca5815c72d1ed564e582924ad157fd1c3349eba45264da2a7b843d88172f4204"
  },
  "schema_version": "2",
  "status": "warning"
}
2Record the separate local filed marker in the obligation window.
aeat --format json app modelo work file --modelo 130 --year 2026 --period 1T
aeat --format json app modelo work file --modelo 130 --year 2026 --period 1T
{
  "active_profile": "docs-sequence-sandbox",
  "command": "modelo.work.file",
  "notices": [],
  "result": {
    "aeat_accepted": false,
    "aeat_register": null,
    "amends_filing_record_id": null,
    "bucket_id": "<bucket-id>",
    "calculation_revision_id": "07d9ed8eec846976eac02aeae13217e835e000f8a460d053909b33d9a3995fec",
    "confirmation": "pendiente",
    "declaration_kind": "original",
    "external_evidence": null,
    "filed_at": "2026-04-01T09:00:00+00:00",
    "filed_by": "docs-sequence-sandbox",
    "filing_record_id": "608622207ce0b6d86cab159d3ba196e5848eb48f2517a06fa8e2bcc508da595b",
    "filing_year": 2026,
    "kind": "internal_filing",
    "live_submission": false,
    "member_nif": null,
    "modelo": "130",
    "notes": null,
    "operation": "modelo.work.file",
    "origin": "local",
    "period": {
      "code": "1T",
      "filing_year": 2026
    },
    "status": "vigente",
    "superseded_at": null,
    "superseded_by_filing_record_id": null,
    "work_unit_id": "ca5815c72d1ed564e582924ad157fd1c3349eba45264da2a7b843d88172f4204"
  },
  "schema_version": "2",
  "status": "success"
}

Confirm the export succeeds and the filing marker stays local.

A later quarter builds on this one: leave the three prior-period bindings unset so they resolve from your filed history. See Prepare a Modelo 130 IRPF instalment for the cumulative year-to-date behaviour.

Next steps