IN SHORT: Odoo generates the Carta Porte 3.1 complement for road transport (autotransporte, type T) via l10n_mx_edi + a PAC. With the new SAT catalogs in effect since January 13, 2026, a misconfigured complement rejects the invoice. Honest note: Odoo covers road transport well; for sea, air, or rail transport you'll need development or additional modules. Here's the step-by-step to get it stamping without rejections.
Since January 13, 2026, new SAT catalogs for Carta Porte took effect, and many logistics and trucking companies discovered the change the hard way: rejected invoices. If you move goods by road and invoice from Odoo, this guide tells you exactly what to configure so the 3.1 complement comes out right the first time.
What Carta Porte 3.1 is and when you need it
The Carta Porte complement is an attachment to the CFDI that covers the transport of goods within national territory. The current version is 3.1. You need it when:
- You move goods over federal jurisdiction roads (federal highways).
- You are a carrier and invoice the transport service (Income CFDI with complement).
- You move your own goods between branches or warehouses (Transfer CFDI with complement).
The complement identifies what is moved, from where, to where, with which vehicle, and who drives it. A single wrong value in any of those blocks = PAC rejection.
What changed on January 13, 2026
SAT updated catalogs that Carta Porte consumes (transport product/service keys, units, hazardous materials, vehicle configurations, among others). If your Odoo still has the old catalogs mapped, the XML is built with keys that no longer exist and the PAC rejects it. The first action after the change is to update the localization and catalogs to the current version.
Honest scope: what Odoo covers and what it doesn't
Let's be clear so you don't buy the wrong expectations:
| Transport type | Does Odoo cover it out of the box? |
|---|---|
| Road transport (autotransporte, type T) | ✅ Yes, it's the supported case |
| Sea | ⚠️ Requires development / additional module |
| Air | ⚠️ Requires development / additional module |
| Rail | ⚠️ Requires development / additional module |
Odoo's Mexican localization is built for road transport, which is the vast majority of cases in the country. If your operation combines modes (sea + land, for example), plan the complementary-transport development from the start — don't assume it "already comes with it."
Step-by-step setup (road transport)
1. Update the localization and SAT catalogs
Make sure your Odoo (18 or 19) has l10n_mx_edi current and the SAT catalogs in effect since January 2026. This step prevents the most common rejection after the change.
2. Configure the issuer's data and the PAC
CSD installed (not the FIEL), correct RFC and tax regime, contracted PAC (Finkok / Factura.com) in test mode first. Never go to production without a successful test stamping.
3. Register the vehicle (road transport)
The transport data captures:
- Vehicle configuration (SAT catalog key for the unit type).
- Motor vehicle plate and year/model.
- SCT permit and its number.
- Insurer and policy for civil liability (and environmental if applicable).
4. Register the operator (driver)
- RFC of the operator and license (type and number).
- Address if the catalog requires it.
5. Define origin, destination, and distance
- Origin and destination locations with postal code and estimated departure/arrival date and time.
- Distance traveled in kilometers — mandatory field.
6. Describe the goods
- Transport ClaveProdServ per line item (from the updated catalog).
- Weight in kilograms, quantity, and unit.
- Hazardous material (if applicable): key, packaging, and description — a critical block that rejects if missing.
7. Stamp in test, validate, and go to production
Generate the XML with the complement, stamp in a test environment, verify the catalogs match the current version, and only then issue in production.
Errors that cause rejection (ordered by frequency)
1. Outdated SAT catalogs. The #1 error since January 2026. Product/service or unit keys that no longer exist. Fix: update the localization.
2. Missing or zero distance traveled. It's mandatory; without it the PAC rejects.
3. Incomplete vehicle data. Missing SCT permit, policy, or an incorrect vehicle configuration.
4. Inconsistent goods weight. Total weight must reconcile with the sum of line items.
5. Invalid origin/destination postal code. It must exist in the SAT postal code catalog.
6. Mis-declared hazardous material. If the goods are hazardous and not declared (or declared wrong), rejection is certain.
7. Operator without valid RFC/license. Incomplete driver data.
Checklist before stamping in production
- Localization and SAT catalogs updated (post Jan-13-2026)
- Valid CSD (not the FIEL) and PAC with stamp balance
- Vehicle: configuration, plate, SCT permit, policy
- Operator: RFC and license
- Origin/destination with valid postal code and distance in km
- Goods with current ClaveProdServ, weight, and hazardous material (if applicable)
- Successful test stamping
Carta Porte and CFDI: the complete tax triad
Carta Porte doesn't live alone: it's part of the tax triad that must be spotless in Odoo. The other key piece is CFDI 4.0 and its payment complement (REP). If you're tuning the tax side of your Odoo, also review the complete Odoo in Mexico guide — the same misconfigured master data that rejects an invoice rejects a Carta Porte.
Why configure it with iTechDev
Carta Porte is one of those things where a single wrong detail halts the entire logistics operation. At iTechDev we configure Odoo's Mexican localization (18 and 19) with current catalogs, and when your operation needs something beyond the standard — like a complementary transport mode or a custom transfer flow — we build it as our own Python/OWL module, with 100% of the code yours. We're an Odoo Ready partner, a software factory, CMMI Level 2, REPSE, with more than 200 projects delivered and 5.0★ on Clutch. And we run our own company on Odoo 19, so we know the tax operation from the inside.