One-minute summary
DIAN is the most demanding tax regulator in LATAM by sheer count of mandatory electronic documents. A CUFE generated from malformed XML means a lost income-tax deduction. Payroll filed on day 11 — same lost millions of COP. An invoice registered in RADIAN without your knowledge — sold to a factor before your customer even paid. This guide explains how to configure Odoo so none of that happens.
Colombia has 1.7 million formal companies, 99.5 % of them MiPyMEs (La República, 2024). DIAN imposes four independent electronic-invoicing obligations on all of them — more than SAT in Mexico (CFDI), SUNAT in Peru (FE + Boleta) and SII in Chile (DTE) combined. Each has its own XML format, its own CUFE, its own filing calendar, and its own penalty for non-compliance.
Out of 27 Odoo rescue projects we audited in Colombia during 2024–2025, 67 % had at least one active violation on one of the four obligations. In most cases the issue ran for several months without anyone noticing. The accountant made manual month-end adjustments; the sales manager had no idea his invoices were already negotiable instruments.
This guide is the technical DIAN-compliance map for the CFO, IT director, or accountant deploying or reviewing Odoo in Colombia in 2026.
- DIAN manages four mandatory documents: Factura Electrónica de Venta (FEV) 1.9, Nómina Electrónica, Documento Soporte en Adquisiciones, RADIAN. Each one has its own XML, CUFE, and calendar.
- CUFE is generated with the SHA-384 algorithm over the concatenation of key XML fields. One mistake in the decimal separator and the invoice is rejected.
- Nómina electrónica must be filed within the first 10 days of the calendar month after the one paid. Late filing puts payroll cost deductibility at risk.
- RADIAN registers invoice circulation as a negotiable instrument. Without a tracking dashboard you do not know your invoice was sold to a factor.
- Penalties under article 651 of the Estatuto Tributario reach 15 000 UVT — roughly COP $780 million in 2026 with UVT $52 000.
- The Odoo base module
l10n_cocovers PUC and taxes but does not natively support a Proveedor Tecnológico, RADIAN events, or nómina XML validation. Custom + OCA modules are mandatory.
Context: how DIAN's electronic-invoicing system evolved
Electronic invoicing in Colombia started with Resolución 0019 de 2016 — a voluntary scheme for large taxpayers. Four years later everything became mandatory, and DIAN started stacking support documents on top.
Short timeline:
- 2016 — Resolución 0019: voluntary electronic invoice.
- 2018–2019 — phased rollout by RUT groups.
- 2020 — Resolución 042: universal mandate for all IVA taxpayers.
- February 2021 — Resolución 000013: Nómina Electrónica introduced as the support document for the payroll-cost income-tax deduction.
- May 2021 — Resolución 000063: Documento Soporte en Adquisiciones for purchases from non-invoicing suppliers.
- December 2021 — Resolución 000167: RADIAN created — registry of invoice circulation as a negotiable instrument.
- November 2023 — Resolución 000165: FEV 1.9 with expanded XML validation and the Documento Equivalente Electrónico for POS tickets above 5 UVT (~COP $260 000 in 2026).
- 2025–2026 — DIAN continues the sector-by-sector rollout of the Documento Equivalente Electrónico (retail, restaurants, hotels) and launched a simplified invoice-generation service by buyer document type and number (DIAN, 2026).
Every iteration added XML fields and shrank the margin for error. FEV 1.9 validates 47 XML elements versus 23 in 1.8. One missing character in cbc:PayableAmount and the invoice is rejected.
Unlike SUNAT (Peru) or SII (Chile), DIAN does not publish a monthly rejection rate per Proveedor Tecnológico. If your PT or Odoo setup is shipping broken XML, you find out from the accountant at month-end close — when the re-filing window has shrunk to hours.
The four DIAN documents and what lurks in each
#1. Factura Electrónica de Venta (FEV) 1.9 + CUFE
The CUFE is an SHA-384 hash over the concatenation: NumFac + FecFac + HoraFac + ValBruto + CodImp1 + ValImp1 + CodImp2 + ValImp2 + CodImp3 + ValImp3 + ValTotal + NitOFE + NumAdq + ClTec + TipoAmbiente. The slightest difference in number formatting (comma instead of period, extra space, two decimals instead of three) and the hash does not match the one DIAN computes on its side at receipt.
What the FEV 1.9 XML must contain:
- Document type (Factura, Nota Crédito, Nota Débito) and DIAN Resolución numbering with the valid number range.
- Purchase order or contract reference — optional, mandatory for government contracts.
- IVA, ICA, ReteIVA, ReteFuente, ReteICA — every retention on a separate line with its tax code.
- Payment terms (Contado or Crédito). Critical: only credit invoices enter RADIAN.
- AttachedDocument ZIP container with the XML and the PDF representation.
The XML ships through a Proveedor Tecnológico Autorizado (PT) — a list of roughly 40 companies including Carvajal, Olimpia, Facture, The Factory HKA, Dataico, and Siesa (Dataico, 2026). The alternative is self-issuance, but for an SMB it rarely makes sense: DIAN certification takes 3 to 6 months, requires PKI support, and 24/7 monitoring.
After acceptance, both the PT and DIAN return a receipt, and only then is the invoice considered issued.
#2. Nómina Electrónica
Launched in February 2021 as the mandatory support document for the payroll income-tax deduction (Resolución 000013, technical annex Resolución 000037). It carries employee data, IBC (Ingreso Base de Cotización), salud, pensión, ARL, parafiscales, withholding tax, earnings, deductions, and total.
The filing window is the first 10 days of the calendar month following the one paid. Filing after day 10 is classified as extemporánea. INCP published a DIAN clarification in April 2026: an extemporáneo filing does not automatically void deductibility, but it generates additional burden of proof for the accountant at the next review (INCP, 2026). In practice DIAN demands extra documentation and often denies the deduction.
A typical SMB with 50 employees loses COP $4 000–15 000 per employee per year from systematic late payroll filing. For 50 employees that is COP $200–750k in lost income-tax deductions alone, plus 5–15 % of IBC in denied municipal ICA deductions.
#3. Documento Soporte for purchases from non-invoicing suppliers
This document is issued by the buyer when purchasing from a supplier that has no obligation to issue a FEV: individual self-withholders, foreign digital-services providers, non-IVA taxpayers.
It carries buyer data (you), seller data (them), amount, retention value, and IVA if applicable. The CUFE uses the same SHA-384 algorithm as the FEV.
Typical scenario: an SMB pays freelance operators for temporary work during a production peak. If the Documento Soporte is not issued, the expense does not enter the income-tax return. Accountants tend to leave it "until quarter end" and then forget for months.
#4. RADIAN — invoice as negotiable instrument
RADIAN registers the circulation status of invoices treated as negotiable instruments (Resolución 000167 de 2021). Events:
- TIPO 030 — invoice acknowledgement (received by the buyer).
- TIPO 031 — invoice rejection.
- TIPO 032 — receipt of goods or services (delivery confirmation).
- TIPO 033 — explicit acceptance.
- TIPO 034 — tacit acceptance (silent consent 3 business days after TIPO 032).
- TIPO 035 — registration in RADIAN as a negotiable instrument.
From TIPO 035 onward your invoice can be sold to a third party: a factor, a discount investor, or a bank. Without a tracking dashboard you only find out when the factor writes to your customer: "pay us instead, we are the holder now."
For a CFO without RADIAN visibility, the risk is threefold: double payment, loss of cash-flow control, and legal disputes with a factor who holds priority collection rights.
How to configure Odoo for DIAN: modules and flows
The base l10n_co module from the Odoo SA repository includes:
- PUC (Plan Único de Cuentas).
- Tax catalog: IVA 0/5/19, ICA by city, ReteIVA, ReteFuente, ReteICA.
- Colombian departamentos and municipios.
- Basic invoice form with fields for NIT, identification type, and régimen.
What is missing from native l10n_co:
- Integration with a Proveedor Tecnológico Autorizado (Carvajal, Olimpia, Facture, The Factory HKA, Dataico).
- RADIAN dashboard for events TIPO 030–035.
- Nómina electrónica with XML generation per technical annex Resolución 000037.
- Self-issued Documento Soporte with CUFE autogeneration.
- Pre-submission XML validation (preventing CUFE rejection).
OCA (Odoo Community Association) maintains the ecosystem of l10n_co_* extensions in the github.com/OCA/l10n-colombia repository: l10n_co_account_e_invoicing, l10n_co_radian, l10n_co_payroll. Quality varies — code review is mandatory before production use.
Typical architecture for an SMB of 50–300 employees:
- Odoo 17 Enterprise or 18 with the
l10n_cobase. - OCA modules for FEV + Documento Soporte + basic RADIAN.
- PT connector (Carvajal Web Service API, Olimpia REST, Facture SOAP). Usually a custom module built on an OCA template.
- HR + Payroll with a custom annex to generate the nómina XML per the Resolución 000037 structure.
- Custom RADIAN dashboard with Slack or WhatsApp alerts when TIPO 035 fires.
- Pre-submission XML validator — a separate module that runs XSD validation and CUFE hash verification before sending to the PT.
Cost of this setup in 2026 in Colombia: COP $190–480 million for an SMB of 50–300 employees. Compare with COP $145 million per year in local-system licenses + external payroll + PT — payback runs 12 to 18 months, not just from operating-cost compression but from deductibility you stop losing.
The Odoo partner ecosystem in Colombia is the most mature of the Andean Community countries (Odoo Partners CO, 2026) and includes Pragmatic, Vauxoo, Interconsulting, and GarKeM Soluciones. DIAN localization quality, however, varies widely between partners — hence the need for a technical audit before kickoff.
Five typical DIAN configuration mistakes in Odoo
#1. CUFE rejected because of number formatting
The most common one. Odoo uses the user locale by default — if the accountant set "," as the decimal separator, the XML ships 1.234,56 instead of 1234.56. The PT rejects it. The fix is to force en_US locale for XML serialization and run a pre-submission validator that recomputes the CUFE locally and compares it with the expected value.
#2. Payroll filed extemporáneo
The accountant "closes" payroll in Excel on day 8, then waits for "the right moment" to file. Day 11 is too late. INCP made it clear in April 2026: even one day late is grounds for DIAN to demand extra documents at income-tax review. The fix is an Odoo cron with a management alert on days 7 and 9 plus a blocking validator on day 10.
#3. RADIAN circulating without the sales manager knowing
The PT forwards events TIPO 030–035 into Odoo, but without a dashboard nobody looks at them. Real case: a COP $180 million invoice became a negotiable instrument on Wednesday, the factor bought from your customer on Friday, and on Monday the CEO learned from the customer that "we already paid — to someone else." Fix: a mandatory RADIAN dashboard with Slack or WhatsApp alerts on every TIPO 035.
#4. Documento Soporte issued unevenly
The accountant does it "from memory" at quarter end. Part of it gets forgotten. The expenses are not deducted. For an SMB with 10–20 self-withholders per year that is COP $30–80 million in lost deductions. Fix: an Odoo workflow where every vendor.bill record without a NIT auto-triggers a Documento Soporte, and the "pendiente CUFE" status blocks posting until submission.
#5. Proveedor Tecnológico with no OAuth or certificate renewal
PT certificates expire every 1–2 years. If Odoo has no automated renewal or alert 30 days before expiry, one morning every invoice starts bouncing. This happens reliably with partners that have no monitoring. Fix: a cron that checks certificate expiry dates with notification and automatic sandbox activation during recovery.
Case: Antioquia textile manufacturer moves from local system to Odoo in 5 months
Textile manufacturing in Medellín. 220 employees, 4 collections per year, marketplace + retail chains + exports to Ecuador and Panama. Pre-migration stack: cloud-hosted local solution + external payroll + Excel for collection-level margin.
What was broken at audit time:
- 14 % of invoices with CUFE rejected. PT and ERP vendor blamed each other. The accountant made manual adjustments.
- Nómina electrónica with IBC errors for three segments (operarios, administrativos, comisionistas). DIAN had been issuing observations since September 2023 — three months in a row.
- RADIAN: 22 invoices converted to negotiable instruments without the sales manager knowing. A double-payment incident was avoided by luck.
- Documento Soporte for 14 self-withholders during the collection peak — done by hand at quarter end, 30 % left undocumented.
What we did in 5 months (5 waves: admin → sales → production → HR → BI):
- Forensic Odoo audit (COP $32 million fixed, 2 weeks) — 42-page report covering every DIAN risk.
- Migration to Odoo 17 Enterprise with
l10n_co+ OCA + custom modules. - PT connector to Carvajal with pre-submission XML validator.
- Nómina electrónica integrated with HR. IBC validated by the accountant + an external review.
- RADIAN dashboard with Slack alerts to the sales manager on every TIPO 035.
- Documento Soporte auto-generated for every
vendor.billwithout a NIT. - BI for collection-level margin — live as soon as the production order closes.
Results (per CFO data):
- Monthly close: 12 days → 4 days.
- Nómina electrónica DIAN: 0 rejections from month 3 (vs. 3 consecutive prior months with observations).
- CUFE rejections: 14 % → 0 % from month 2.
- RADIAN visibility: 100 % tracking up to conversion as a negotiable instrument.
- Old-system licenses + external payroll + PT: COP $145 million per year eliminated.
- Odoo investment (year 1): COP $480 million. Year 2 onward: COP $190 million.
- Net savings: COP $1.4 billion over a 3-year horizon.
The case is anonymized under NDA. Similar cases in beauty, agroexport, and retail show comparable figures for monthly-close compression (60–70 %) and CUFE rejection elimination — exact values depend on the quality of the starting configuration.
DIAN 2026 checklist: 48 items
Before you ship the next invoice from Odoo, verify these work: pre-submission XML validation, correct CUFE hash, RADIAN tracking for events TIPO 030–035, automated payroll alerts on days 7 and 9, Documento Soporte workflow for self-withholders, PT certificate-expiry monitoring, HR + payroll integration per Resolución 000037 annex, and separate PUC accounts for ICA retention across 30+ municipalities.
The full 48-item checklist in PDF (30 pages), grouped by the four DIAN obligations, is available on data-metrics.pro. The PDF arrives by email instantly.
What to do next
DIAN in 2026 is the most complex compliance stack in LATAM by mandatory document count. Colombia is the only country in the region where four independent electronic-invoicing obligations run in parallel, and where article 651 and 652 Estatuto Tributario penalties for systematic late filing in a single reporting period exceed the annual revenue of the average SMB.
Odoo covers all four obligations, but only with the right mix of l10n_co + OCA + custom + PT integrations. The out-of-the-box install does not work — confirmed by MINCIT data on the 99.5 % MiPyME share of the formal sector (MINCIT, 2025) and BBVA Research on formal-segment structure (BBVA Research, 2024). Most of these companies run a base configuration and do not know the risks.
Next steps:
- If you are picking an ERP — review Odoo in Colombia and compare with the alternatives (Siigo, World Office, Helisa, SAP B1).
- If you already run Odoo and doubt DIAN compliance — request an Odoo audit (COP $32 million fixed, 42-page report, credited against the cost of the next engagement).
- If a previous partner abandoned the project — Odoo project rescue without a full migration.
- If you are starting from scratch — Odoo implementation for the four DIAN obligations from COP $190 million.
- Adjacent compliance pillars: CFDI in Mexico, SUNAT in Peru 2026, SII in Chile 2026.
- Anonymized Colombia cases — Antioquia textiles, Eje Cafetero coffee, Bogotá retail.
- For the CFO and accountant — analytics on Odoo with RADIAN visibility, deductibility dashboards, and cohort analysis by collection.
- To book a 30-minute diagnostic call — Sergio's contact page.
Frequently asked questions
What is the difference between FEV 1.8 and 1.9?
FEV 1.9 (Resolución 000165 de 2023) added expanded validation over 47 XML elements versus 23 in 1.8, mandated the Documento Equivalente Electrónico for POS tickets above 5 UVT, introduced new fields for credit and debit notes, and updated the rules for consortium invoices.
Every PT since 2024 works only with 1.9.
How exactly is the CUFE generated?
SHA-384 hash over the concatenation: NumFac + FecFac + HoraFac + ValBruto + CodImp1 + ValImp1 + ... + ValTotal + NitOFE + NumAdq + ClTec + TipoAmbiente. Every number must come without thousand separators, with a period as the decimal mark, and fixed precision (normally 2 digits for amounts and 6 for unit price).
One extra space or zero and the hash will not match the one DIAN computes at receipt.
Who is required to file Nómina Electrónica?
Every employer in Colombia, regardless of size, after the 2021–2022 rolling deployment. An SMB with a single employee is technically obligated as well.
The filing window is the first 10 days of the calendar month after the month of payment.
How does RADIAN affect cash flow?
When an invoice is registered as TIPO 035 (negotiable instrument), it can be sold to a factor. The factor pays 80–90 % of the value upfront and the remainder once the customer pays.
Without RADIAN visibility you do not know your invoice has been sold — and you can end up facing double payment or the factor's priority right to collect.
Do I need an authorized Proveedor Tecnológico?
For an SMB, almost always yes. Self-issuance requires DIAN certification (3–6 months), PKI support, and 24/7 monitoring.
Ownership cost is justified at ≥10 000 invoices per month — below that volume, a PT is 2–3 times cheaper.
Does Odoo l10n_co cover everything natively?
No. l10n_co covers PUC, taxes, and the basic invoice form. PT integration, RADIAN tracking, nómina electrónica with the XML annex, and Documento Soporte auto-generation require OCA modules or custom development.
Consult a partner with proven DIAN-localization experience before starting.
What do I do when a CUFE is rejected?
First, request the XML and the error message from the PT. Most of the time the cause is number formatting, an incorrect DANE municipality code, or a missing mandatory element.
After fixing, re-submit within 48 hours under the same Resolución number. If you missed that window, issue a credit note with the cause plus a new FEV.
