Skip to main content
iVentureTeam
Odoo Accounting & Tax

Odoo CFDI 4.0 Setup Checklist: CSD, PAC, Payments and Carta Porte

Set up Odoo CFDI 4.0 in Odoo 19 or 20: CSD certificates, PAC, fiscal regimes, payment complements, cancellations, global invoices, Carta Porte and tests.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 14, 202613 min read0 views
Odoo CFDI 4.0 Setup Checklist: CSD, PAC, Payments and Carta Porte cover

Most CFDI 4.0 guides list what the SAT wants and stop there. This one maps each requirement to the Odoo screen where you set it. When the standard module is not enough, our Odoo customization services add addendas, reports and portal changes.

Related service: Odoo for finance teams — accounting, tax and reporting automation.

This guide is for finance leads and IT teams setting up Odoo in Mexico, or fixing a setup that keeps getting rejected. It skips budgets; for those, read our guide to Odoo implementation cost in Mexico.

What do you need before setting up Odoo CFDI 4.0?

You need three things from outside Odoo first: a valid RFC registered with the SAT, a Certificado de Sello Digital (CSD), and a PAC account. Without all three, Odoo cannot sign a single invoice.

The Odoo 20 Mexico localization docs list these as hard requirements and note that CFDI 4.0 has been mandatory since January 1, 2022. Spanish-speaking teams search for this as "odoo facturacion electronica mexico".

Three modules install automatically. Add the optional ones only when the business needs them.

ModuleTechnical nameInstall when
Mexico - Accountingl10n_mxAlways (chart of accounts, taxes)
EDI for Mexicol10n_mx_ediAlways (CFDI signing, payment complements)
Mexican Localization Reportsl10n_mx_reportsAlways (DIOT, electronic accounting)
EDI for Mexico (Advanced Features)l10n_mx_edi_extendedYou export goods (foreign trade complement)
Electronic Delivery Guidel10n_mx_edi_stockYou move goods and need Carta Porte
Stock/Landingl10n_mx_edi_landingYou import goods with customs numbers
Sale, POS, eCommerce add-onsl10n_mx_edi_sale, _pos, _website_saleYou invoice from those apps

The company currency must stay MXN; Odoo's docs say to use pricelists for other currencies. Our Odoo multi currency accounting guide covers rates and FX gains.

How do you load CSD certificates and connect the PAC in Odoo?

Upload the CSD key and certificate in Settings, set the certificate scope, then enter your PAC credentials under MX Electronic invoicing. Do this before you create any invoice.

In Odoo 20, follow these steps:

  1. Open Settings and go to Certificates and Keys.
  2. Click Keys, then New, and upload the .key file with its password.
  3. Go back, click Certificates, then New, and upload the .cer file.
  4. Select the private key you just created.
  5. Set Certificate scope to CFDI (CSD), or E Firma (FIEL) for the e.firma.
  6. In Accounting settings, open MX Electronic invoicing and pick the PAC.
  7. Enter the PAC username and password, then save.

Teams often miss the scope step. Odoo 20 never fills it from the file, and if it is empty, invoices fail because no CSD is found. In Odoo 19 the path is Settings, General Settings, Certificates and Keys, per the Odoo 19 Mexico docs.

For trials, tick MX PAC test environment and select Solución Factible; no username or password is needed. For production, register with the PAC directly and buy stamps from it.

How do you set fiscal regimes and master data for CFDI 4.0?

Most CFDI 4.0 rejections come from master data, so set the fiscal regime, legal name, ZIP code and SAT codes before the first invoice. CFDI 4.0 checks receiver data against the SAT record.

  • Company: the SAT-registered name without the legal entity suffix, full address with ZIP, and the RFC in Tax ID.
  • Fiscal regime: set it in Accounting settings, under MX Electronic invoicing.
  • Branches: each fiscal regime used for invoicing needs its own branch.
  • Customers: SAT name, ZIP, state, country and RFC, plus the fiscal regime on the Sales & Purchase tab.
  • Products: every product needs a UNSPSC Product Category (SAT code), including the shipping product.
  • Taxes: check Factor Type and SAT Tax Type; use Tasa for 0% VAT and Exento for VAT exempt.

Two traps come up often. An RFC with no country can produce incorrect invoices. And an invoice to a child contact uses the parent's RFC and address, which Odoo's forum team links to error CFDI40145.

Tax Object codes matter too. Odoo sets `01` for untaxed lines and `02` for taxed lines; `03` to `05` and `08` are set by hand, and `01`, `03`, `04` or `05` remove the tax node from the XML.

How do Uso de CFDI, PUE and PPD work on Odoo invoices?

Every Odoo CFDI 4.0 invoice carries a Usage (Uso de CFDI), a Payment Policy (PUE or PPD) and, for PUE, a Payment Way. Set them on the contact or sales order so they flow to every invoice.

FieldWhat it meansHow Odoo fills it
Usage (Uso de CFDI)How the customer uses the invoiceFrom the contact or order; S01 for CFDI to public
PUEPaid in a single paymentDefault when payment is due this month
PPDPaid in installments or laterDefault when the due date is in a later month
Payment WayCash, transfer, card and so onRequired for PUE; PPD uses 99, To Define

To force PPD, use a due date or payment terms that land next month. After you confirm, click Send, tick CFDI, and Odoo submits the XML to the PAC.

Once stamped, the Fiscal Folio (UUID) appears and the XML sits in the CFDI tab. Click Update SAT to confirm the status reads Validated. In a test database, "Not Found" is normal.

How do payment complements work in Odoo?

Odoo creates a payment complement (CFDI type P) only for PPD invoices, once a payment is fully reconciled with a stamped invoice. PUE invoices never need one.

Register the payment as usual. When it is reconciled with an invoice that has a Fiscal Folio, an Update Payments button appears. Click it, and Odoo sends the complement to the PAC and shows it on both the invoice and the payment.

  • Payment Way: a payment cannot use To Define; pick the real method.
  • Bank account: Annex 20 expects 10 or 18 digits for transfers and 16 for cards.
  • Cancel a complement: click Cancel on its line in the invoice CFDI tab, then Update SAT on the payment.
  • Replace a complement: unreconcile the payment and add `04|` plus the old folio in CFDI Origin.

How do you cancel a CFDI 4.0 invoice in Odoo?

Click Request Cancel on the posted invoice, choose a SAT reason code, and track the result with Update SAT. Since 2022, every cancellation needs a reason, and after 24 hours the customer must accept it.

Reason codeWhen to use itWhat Odoo does
01Issued with errors, with a replacementCreates a linked replacement draft
02Issued with errors, no replacementRequests cancellation right away
03The operation did not happenRequests cancellation right away
04Nominative operation in a global invoiceRequests cancellation right away

With no answer in 72 hours, the SAT cancels automatically. If the status returns to Validated, a related document, such as a payment complement, may need canceling first. A cancellation in a locked period cancels the CFDI but not the journal entry.

How do CFDI to public and global invoices work in Odoo?

Sales to customers without an RFC go out as CFDI to public, and unbilled sales for a period can be grouped into one global invoice. Both are built into l10n_mx_edi.

Tick CFDI to public, and Odoo writes the generic RFC XAXX010101000 (XEXX010101000 for foreign buyers), your ZIP and Usage S01. Do not name the generic customer "PUBLICO EN GENERAL", as it triggers error CFDI40130. Use CLIENTE FINAL.

For a global invoice:

  1. Set the Global Invoice Serie in MX Electronic invoicing settings (default GINV/).
  2. Create a dedicated journal for global invoices.
  3. Select CFDI to public orders marked To Invoice and create drafts, with Consolidated Billing unticked.
  4. Confirm the drafts, then choose Actions, Create Global Invoice.
  5. Pick the periodicity your accountant recommends and the period date.

In POS, receipts can carry a QR code or URL so customers self-invoice later, and unbilled orders roll into a global invoice from the backend.

How do you set up Odoo Carta Porte 3.1?

Install l10n_mx_edi_stock, set up vehicles in Fleet, give every product a weight, and generate the delivery guide from the validated delivery. Carta Porte is a CFDI of type T created on the transfer, not the invoice.

Carta Porte 3.1 has applied since July 17, 2024. Odoo offers two transport types:

  • No Federal Highways: under 30 km; only the usual invoice data and UNSPSC codes are needed.
  • Federal Transport: over 30 km; needs a Fleet freight vehicle with plate, model year, driver and MX Parameters.

Products must be storable with a weight above 0. A zero weight triggers an error, and the fix means returning the goods and recreating the delivery. Hazardous UNSPSC codes also need hazardous material and packaging codes.

Odoo does not support air, train or marine Carta Porte, or the type I version. Addresses must match the SAT Carta Porte catalog, and the origin address comes from the warehouse.

Which CFDI 4.0 errors in Odoo come up most, and how do you fix them?

Odoo CFDI 4.0: Common stamping errors and their fixes

Most common stamping errors trace back to one setting, so a short fix table saves days of back and forth with the PAC. These six come from Odoo's docs and Odoo forum answers.

ErrorLikely causeFix in Odoo
CFDI40141 or CFDI40158Fiscal regime does not fit RFC typeChoose a regime valid for that RFC
CFDI40145Receiver name differs from SAT recordUse SAT name on parent contact
CFDI40130Customer named PUBLICO EN GENERALRename to CLIENTE FINAL, use CFDI to public
CFDI40180Tax rounding outside SAT limitsSwitch tax rounding method, then re-sign
No CSD certificate foundCertificate scope left emptySet scope to CFDI (CSD)
Missing SAT product codeProduct has no UNSPSC categoryAdd UNSPSC category to every product

Odoo's forum answer on error CFDI40141 shows a persona moral RFC rejected with regime 605. For error CFDI40180, it suggests switching round per line and round globally.

Exporters may also see CFDI40122 when the export value is 02 without a foreign trade complement, which l10n_mx_edi_extended adds. Our post on Odoo localization gaps covers where country modules stop.

How should you test Odoo CFDI 4.0 before go-live?

Run every document type through the PAC test environment with SAT test data, then repeat a short smoke test in production. Odoo's docs provide test credentials, so you do not risk real folios.

Odoo 20's docs use test RFC IVD920810GU2, ZIP 58000 and regime General de Ley Personas Morales, with SAT test certificates. Run this script:

  1. Stamp a PUE invoice and check the Fiscal Folio and PDF.
  2. Stamp a PPD invoice, register a partial payment and send the complement.
  3. Issue a credit note with Add Credit Note so CFDI Origin fills itself.
  4. Cancel one invoice with reason 01 and one with reason 02.
  5. Create a CFDI to public sale and a global invoice.
  6. Generate a short-trip and a federal Carta Porte.
  7. Test POS or eCommerce invoicing if you use them.

Our Odoo UAT guide for Odoo 19 and 20 explains how to sign off each scenario.

Which industries need extra CFDI setup in Odoo?

Retailers, distributors, importers and exporters each add a layer on top of the base CFDI 4.0 setup. The table shows what changes by sector.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
Retail and POSMany sales without an RFCCFDI to public, self-invoicing QR, global invoicesSet up POS payment methods and portal
DistributionGoods moving between sitesCarta Porte 3.1 with Fleet vehiclesMap vehicles and product weights
ImportersCustoms numbers on resold goodsl10n_mx_edi_landing with landed costsConfigure lots and landed costs
ExportersForeign trade complementl10n_mx_edi_extended with tariff fieldsLoad tariff codes, test exports
Food and beverageIEPS taxes and breakdownCuota formulas, IEPS breakdown per contactBuild and test tax setups

If Mexican payroll is in scope, see our Odoo payroll setup guide.

Odoo 19 or Odoo 20 for CFDI 4.0?

Both versions sign CFDI 4.0 with the same l10n_mx_edi flow, but the Odoo 20 docs add certificate scopes and automatic download of received CFDIs. For a new project, Odoo 20 is the easier start.

With the e.firma uploaded, Odoo 20 fetches received invoices and credit notes daily as draft bills. This has no test environment. For a wider view, read Odoo 19 vs Odoo 20.

How iVentureTeam helps with Odoo CFDI 4.0 setup

Setting up CFDI 4.0? Scope it in minutes

We set up, test and extend the Mexican localization so invoices stamp the first time. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.

  • Readiness check: RFC, CSD, PAC, fiscal regimes and SAT codes reviewed first.
  • Configuration: certificates, PAC, taxes, branches, journals and global invoice series.
  • Extensions: addendas for large buyers, Carta Porte, customs numbers and foreign trade.
  • Integrations: POS, eCommerce and other systems linked through our Odoo integration services.
  • Testing: a full PAC test script, then a production smoke test.

For a quick scope and timeline, try the free Odoo project estimate tool.

Odoo tax localization case study: Fernando Tax Management

This project was in the Netherlands and Curaçao, not Mexico, but it shows the work CFDI needs: localized tax output a regulator accepts. Fernando Tax Management B.V. is a tax and accounting firm.

The firm ran on a rigid legacy system with hand-keyed data. Duplicate records were reconciled by hand, and reports had translation gaps, a real risk for output that feeds government compliance.

We moved the firm to Odoo 18 in 10 weeks, built localized tax compliance reports and fixed hidden journal lines. Manual data entry fell by 60%. Read the Fernando Tax Odoo accounting automation case study.

The bottom line on Odoo CFDI 4.0

Odoo CFDI 4.0 covers invoices, payment complements, cancellations, global invoices and Carta Porte, but it rewards a strict setup order. Get the CSD scope, PAC, regimes and SAT codes right first.

Then test every document type in the PAC sandbox, and keep the error table close for the first weeks of live use.

Ready to get your CFDI 4.0 setup stamping cleanly?

Request a CFDI setup review

Get your certificates, PAC and master data checked before the first live invoice. Request an Odoo CFDI 4.0 setup review, call +91-90235-15208, or email business@iventureteam.com.

Frequently Asked Questions

Does Odoo support CFDI 4.0?

+

Yes. The l10n_mx_edi module signs invoices, credit notes and payment complements to CFDI 4.0 and sends them to a supported PAC. It works in Odoo 19 and Odoo 20.

Which PAC works with Odoo?

+

Odoo's documentation lists Solución Factible, Quadrum and SW Sapien (Smarter Web). You register with the PAC directly and enter its username and password in Odoo's accounting settings.

Where do I upload the CSD certificate in Odoo?

+

In Settings, under Certificates and Keys. Upload the .key file, then the .cer file, link them, and in Odoo 20 set the certificate scope to CFDI (CSD). Without the scope, invoices fail to sign.

When does Odoo create a payment complement?

+

Only for invoices with the PPD payment policy. Once a payment is reconciled with a stamped invoice, click Update Payments and Odoo sends the type P complement to the PAC.

How do I cancel a CFDI in Odoo?

+

Open the posted invoice, click Request Cancel and pick SAT reason 01, 02, 03 or 04. Reason 01 creates a replacement invoice. After 24 hours the customer must accept, or the SAT cancels it after 72 hours.

Does Odoo support Carta Porte?

+

Yes, through l10n_mx_edi_stock, which supports Carta Porte 3.1 for road transport with or without federal highways. Air, train and marine transport are not supported.

Can Odoo create a global invoice?

+

Yes. Mark sales as CFDI to public, set the Global Invoice Serie, and use Create Global Invoice from invoices or POS orders with the periodicity your accountant recommends.

Can I test CFDI 4.0 in Odoo without a PAC account?

+

Yes. Tick MX PAC test environment and choose Solución Factible; no username or password is needed. Odoo also provides SAT test certificates and a test company RFC.

Free e-invoicing and tax readiness check

Getting Odoo ready for CFDI?

We check your Odoo version, localization and invoice flows against CFDI, then send what to set up, what to test and the effort involved.

Free, with no obligation. A senior consultant replies within 12 business hours.

We use cookies to improve your experience

Essential cookies make the site work; with your permission we also use analytics to improve it. See our cookie policy.