AEAT14 April 2026

AEAT forms (303, 390, 347, 349, 111, 130…) in Odoo Community: what ships by default and what OCA adds

Odoo Community gives you the Spanish chart of accounts and taxes, but the AEAT returns ready to file (with export to BOE format) are not in the core: either you pay for Enterprise or you install the OCA/l10n-spain modules. We review, module by module and verifying on GitHub, which forms are covered, in which branches and what you actually need.

Fiscalidad EspañaOdoo CommunityContabilidadOCA

The starting point: Community gives you accounting, not the returns

If you install the Spanish localisation in Odoo, the l10n_es module ("Spain - Accounting (PGCE 2008)") provides the chart of accounts, taxes and fiscal positions. That is the accounting base, not the returns to the tax authority. The question everyone managing an SME or an accounting firm with Odoo Community asks is: can I produce form 303, 347 or 390 as such, ready to file? And the honest answer is: not with the plain Community core.

There are two paths to obtaining AEAT returns in Odoo, and it is worth being clear about them from the start because they involve different cost and architecture: the Enterprise path (official modules from Odoo S.A.) and the Community path (modules from the OCA community). Let's verify each one.

Enterprise path: the native forms live in l10n_es_reports (and are paid)

In Odoo Enterprise, the AEAT returns appear as dynamic tax reports. The official Odoo 19 documentation describes it like this: to access the forms you go to Accounting ‣ Reporting ‣ Tax Report and choose between Mod 111, 115, 130, 303, 347, 349 and 390 in their Spanish (ES) version.

Those reports are provided by the l10n_es_reports module (plus its annual updates l10n_es_reports_2024 and l10n_es_reports_2025). And here is the key to Community vs Enterprise: Odoo's own development guide says that accounting reports are implemented in an l10n_XX_reports module that must go to the "enterprise repository" and that depends on account_reports.

Accounting reports should be added via a separate module l10n_XX_reports that should go to the enterprise repository. (Odoo development documentation, accounting localization howto)

account_reports (the dynamic accounting reports engine) is an Enterprise module. Therefore, l10n_es_reports —and with it Odoo's "native" 303/347/349/390 forms— is only available with an Enterprise licence. In Community that module is not installable because it lacks its dependency. It is not a bug nor a configurable limitation: it is the dividing line between the two editions.

Community path: OCA/l10n-spain and the l10n_es_aeat family

The real, mature alternative for Community is the OCA (Odoo Community Association) l10n-spain project on GitHub. That is where a family of modules lives, all with an AGPL-3 licence, which implement the AEAT returns without depending on Enterprise. The central piece is the base module l10n_es_aeat.

The base module: l10n_es_aeat

l10n_es_aeat is described as the "Modulo base para declaraciones de la AEAT" (base module for AEAT returns). It does not generate any form on its own: it provides the common infrastructure (data model and return views, sequences by form type, export engine to BOE format, certificate management, tax mapping). Each specific form is a separate module that builds on this base.

The modules by form (branch 19.0)

Verified against branch 19.0 of the OCA/l10n-spain repository, these are the available AEAT modules, with their exact technical name:

  • l10n_es_aeat_mod111 — "AEAT modelo 111" (IRPF withholdings on earned income and professional activities)
  • l10n_es_aeat_mod115 — "AEAT modelo 115" (withholdings on property rentals)
  • l10n_es_aeat_mod123 — "AEAT modelo 123" (withholdings on income from movable capital)
  • l10n_es_aeat_mod130 — "AEAT modelo 130" (IRPF instalment payment for self-employed under direct assessment)
  • l10n_es_aeat_mod190 — "AEAT modelo 190" (annual summary of form 111 withholdings)
  • l10n_es_aeat_mod216 — "AEAT modelo 216" (income of non-residents)
  • l10n_es_aeat_mod296 — "AEAT modelo 296" (annual summary of non-resident withholdings)
  • l10n_es_aeat_mod303 — "AEAT modelo 303" (quarterly VAT self-assessment)
  • l10n_es_aeat_mod347 — "AEAT modelo 347" (transactions with third parties >€3,005.06)
  • l10n_es_aeat_mod349 — "AEAT modelo 349" (intra-Community transactions)
  • l10n_es_aeat_mod390 — "AEAT modelo 390" (annual VAT summary)
  • l10n_es_aeat_partner_check — "AEAT - Comprobación de Calidad de datos identificativos" (AEAT - quality check of identifying data)
  • l10n_es_aeat_sii_oca — "Suministro Inmediato de Información en el IVA" (Immediate Supply of VAT Information, SII)

Details verified in the branch 19.0 manifests that are worth knowing for their practical value: l10n_es_aeat_mod303 depends on l10n_es and l10n_es_aeat; l10n_es_aeat_mod390 depends directly on l10n_es_aeat_mod303 (the annual summary builds on the 303 forms of the year); l10n_es_aeat_mod347 additionally pulls in account_tax_balance, base_vat and portal; and l10n_es_aeat_mod130 (self-employed) depends on l10n_es_aeat. All are AGPL-3 and community-maintained (authors such as Tecnativa, Guadaltech, AvanzOSC, ForgeFlow and OCA itself).

Watch out for the branches: not everything is ported to every version

The OCA project is organised into branches that correspond to each version of Odoo (16.0, 17.0, 18.0, 19.0…). The same module can exist in one branch and not yet be ported to another. For example, branch 17.0 includes additional modules that extend coverage:

  • l10n_es_aeat_mod303_oss — "AEAT modelo 303 - OSS" (one-stop shop / One-Stop Shop)
  • l10n_es_aeat_mod390_oss — "AEAT modelo 390 - OSS"
  • l10n_es_aeat_mod369 — "AEAT modelo 369" (OSS/IOSS e-commerce scheme)
  • l10n_es_aeat_mod592 — "AEAT modelo 592" (tax on non-reusable plastic packaging)
  • l10n_es_aeat_sii_oss / l10n_es_aeat_sii_match / l10n_es_aeat_sii_invoice_summary — SII add-ons

The honest rule before committing to an implementation: do not assume that the form you need is in your version of Odoo. Go to github.com/OCA/l10n-spain, select your version's branch and check that the module folder exists and that its README does not mark it as beta or unmaintained. The most common VAT and withholding forms (303, 390, 347, 349, 111, 115, 130) are covered in the modern branches; the more specialised ones or the OSS ones may lag behind.

SII, Veri*Factu and TicketBAI: a separate chapter

In addition to the periodic forms, there are near-real-time information supply obligations. Here the two paths coexist again. For SII (Immediate Supply of VAT Information), Community has OCA's l10n_es_aeat_sii_oca, while Enterprise solves it with its own l10n_es_edi_sii module. For electronic/verifiable invoicing, the Odoo documentation mentions Veri*Factu and TicketBAI (the latter, e-invoicing of the Basque Country's Provincial Councils) as manually installed modules within the localisation.

The practical takeaway: if your obligation includes SII or Veri*Factu, assess it separately from the block of classic "forms", because the Community/Enterprise split and the maturity of each piece are not the same.

How to decide: an honest checklist

  1. List your real obligations: 303 and 390? 347/349? withholdings 111/115/130/190? SII? Each one is a separate module.
  2. Look at your version of Odoo and go to the corresponding branch in OCA/l10n-spain. Confirm that the module folder for each form exists and its status.
  3. If you go with Community, count on installing l10n_es_aeat (base) + one module for each form you need. They are AGPL-3, free, but they require installation, updating and testing.
  4. If you go with Enterprise, the native forms (l10n_es_reports + annual updates) come with the subscription, integrated in the Tax Report, but it is a paid licence.
  5. Do not mix blindly: the OCA modules (l10n_es_aeat_*) and the native Enterprise ones (l10n_es_reports) solve the same thing through different paths; it is best to choose one and be consistent.
  6. Always validate the output file against the AEAT portal before accepting any form as good, whether Community or Enterprise. The export to BOE is a help, not a guarantee that your figures add up.

Want help setting up (and validating) your AEAT forms in Odoo?

At skanndar we work with Odoo with judgement: no smoke about what ships by default and what does not. If you are on Community and want to file your forms with the OCA modules well installed and tested, or you are deciding between Community + OCA and Enterprise for your specific case, we can carry out a short, honest audit of your Spanish Odoo tax configuration and support you along the way. Write to us and we'll look at it with your real obligations on the table.

Have an Odoo project or an implementation that never quite works?

Tell me directly — I run a free audit for qualified projects.