OdooWiki OCA HUB

Mexico - CFDI Generation

l10n_mx_cfdi folder_open OCA/l10n-mexico open_in_new
Accounting License: LGPL-3

This module provides the configuration used by electronic invoicing for Mexico:

  • Multi-PAC integration via satcfdi (Finkok, Diverza, Prodigia, Comercio Digital, SW Sapien, MYSuite, Facturama).
  • Local CSD management for CFDI sealing when the PAC uses stamp().
  • Facturama Multiemisor CSD upload on issuer registration (required before issue()).
  • Management of different series and CFDI issuers for the same company.

CFDI × PAC capability matrix

| Flow | Finkok | Diverza | Prodigia | Com. Digital | SW Sapien | MYSuite | Facturama | |------|:------:|:-------:|:--------:|:------------:|:---------:|:-------:|:---------:| | Path | issue() | issue() | stamp() | stamp() | issue() | stamp() | issue() Multiemisor / Web | | Ingreso (I) | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | Egreso (E) | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | | Pago (P) | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | | Traslado / Carta Porte | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | Pedimentos on concepts | Yes | Yes | Yes | Yes | Yes | Yes | Yes | | Full CCE complement | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | Conditional | | Cancel (API) | Conditional | Yes | No | No | Yes | No | Yes | | Cancel with acuse | Conditional | Unknown | No | No | Unknown | No | Conditional |

Legend

  • Yes: supported end-to-end via this module + satcfdi for that PAC.
  • Conditional:
  • Egreso: requires a fully reconciled refund (amount_residual == 0).
  • Pago: auto-stamp only for reconciled inbound payments on PPD invoices; manual stamping needs valid payment CFDI data.
  • Finkok cancel: requires company FIEL via l10n_mx_sat (signer).
  • Facturama cancel acuse: may be empty; the module shows status/message when the PAC omits the acuse.
  • Full CCE: built by l10n_mx_cfdi_comex (Exportacion=02 + cce20.ComercioExterior). Stamp PACs (Prodigia, Comercio Digital, MYSuite) and XML-issue PACs (Finkok, Diverza, SW) can stamp sealed XML with CCE (live PAC acceptance not exhaustively retested here). Facturama Multiemisor does not support CCE; when CCE is present the module switches to FacturamaWeb (same user/password; account-profile CSD).
  • No:
  • Cancel API is not exposed in satcfdi for Prodigia, Comercio Digital, and MYSuite (supports_cancel=False).
  • Unknown: acuse availability depends on the PAC response (Diverza / SW Sapien).
  • Path: Finkok, Diverza, SW Sapien, and Facturama use issue(); Prodigia, Comercio Digital, and MYSuite use local CSD seal + stamp(). Facturama is Multiemisor by default (Registrar uploads the CSD); FacturamaWeb is used automatically for Comercio Exterior.
  • Pedimentos on concepts are not the full CCE complement; the Facturama adapter maps NumerosPedimento.

auto_awesome What this module does

AI-generated from the code · Odoo 19.0

Lets Mexican companies create, stamp, download and cancel CFDI electronic invoices through several PAC providers, and keeps the fiscal data (issuer, series, PAC account, product codes) needed to do so.

This module adds a full CFDI (Mexican electronic invoice) workspace to Odoo. Users get a new "CFDI" menu with Documents, Issuers, Series and PAC Settings screens.

  • Documents: each CFDI is stored with its type (income, expense, payment, transfer), series and folio, issuer, receiver, status (draft, pending, published, pending cancellation, cancelled, unknown), UUID, PDF and XML files, and the SAT verification link and QR code. Buttons let users cancel a document, check its status with the PAC, and retrieve the cancellation acknowledgment.
  • Issuers: a company can register several issuers, each with its tax ID, fiscal name, logo and digital certificate (certificate, key and password). Registering validates the certificate and, for Facturama, uploads it to the provider.
  • PAC Settings: connection details for the stamping provider (Finkok, Diverza, Prodigia, SW Sapien, Facturama, etc.), including sandbox mode and credentials. The system shows whether the chosen provider can issue and cancel.
  • Series: numbering sequences for CFDI, with automatic folio assignment when a document is created.

On companies, a setting enables CFDI and another creates the CFDI automatically when an invoice is posted. Partners gain fiscal regime, CFDI usage, payment method and payment form fields; products gain SAT product/service code and unit of measure. Documents can be linked to each other with a relation type. Access is restricted by company and by administrator rights.

Depends on

Required by other modules

Menus it adds

DocumentsCFDI EmitidosIssuersCFDISeriesPAC Settings
Models and fields (9)
  • res.company · extends an existing modell10n_mx_cfdi_auto (Create CFDI on post), l10n_mx_cfdi_enabled (Enable CFDI)
  • res.partner · extends an existing modeltax_regime (Fiscal Regime), cfdi_use_id (CFDI Usage), payment_form_id (Payment Form), payment_method_id (Payment Method)
  • product.template · extends an existing modell10n_mx_cfdi_product_code_id (Código de Producto), l10n_mx_cfdi_product_measurement_unit_id (Unidad de Medida)
  • l10n_mx_cfdi.issuer · new modelkey_file, logo_url (URL del logo), company_id, partner_id, registered, service_id, fiscal_name, key_password (Password), certificate_file
  • l10n_mx_cfdi.series · new modelcode
  • l10n_mx_cfdi.document · new modelname (Nombre), type, uuid (UUID), folio, serie, state (Estado), version, pdf_file (Archivo PDF), xml_file (Archivo XML), issuer_id (Emisor), tax_codes (Código de impuesto), company_id, standalone (Independiente), cert_number (Número de certificado), receiver_id (Receptor), tracking_id (ID del documento en el API), pac_provider (PAC Provider), pdf_filename (Nombre del archivo PDF), signing_date (Fecha de timbrado), xml_filename (Nombre del archivo XML), sat_signature (Firma del SAT), cert_data_json, cfdi_signature (Firma del CFDI), files_in_cache, is_global_note (Nota global), original_string (Cadena original), rfc_prov_certif (RFC del proveedor de certificación), sat_cert_number (Número de certificado del SAT), issuing_datetime (Fecha de emisión), verification_url (URL de verificación)
  • l10n_mx_cfdi.cfdi_service · new modelname, user, pac_rfc (PAC RFC), password, provider, pac_token (PAC Token), company_ids (Companies), pac_country (PAC Country), pac_contrato (PAC Contract), sandbox_mode, pac_client_id (PAC Client ID), pac_requestor (PAC Requestor), supports_issue, supports_cancel, stamps_available (Stamps available)
  • l10n_mx_cfdi.document_relation · new modelsource_id, target_id, relation_type_id
  • l10n_mx_cfdi.cfdi_service.topup · new modeltotal (Precio Total), partner_id (Contacto), service_id (Servicio), topup_date (Fecha de Adquisición), currency_id (Moneda), stamp_price (Precio por Folio), stamp_number (Cantidad de Folios)

Text generated by AI (DeepSeek) from reading the Odoo 19.0 code on GitHub; it may contain mistakes, so check the code before deciding. The module is very large and only part of the code was read. View the code on GitHub

Availability by version

Reviewed: 2026-11-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 3 confirmed, 6 with no information of 9 versions.

Sources · Odoo 15.0

Confirmed on 2026-11-03 in branch 15.0 of OCA/l10n-mexico.

terminal Installation and usage

OCA documentation · Odoo 19.0

This module works with any PAC supported by the satcfdi library:

  • Finkok
  • Diverza
  • Prodigia
  • Comercio Digital
  • SW Sapien
  • MYSuite
  • Facturama

Install the Python dependency:

pip install "satcfdi>=26.7.3"

PAC comparison

Indicative public list prices as of about 2026-07 (MXN). Amounts and packages change without notice — always confirm with the vendor before contracting. OCA and the module authors have no commercial relationship with these PACs; logos are property of their respective owners and are used for identification only.

Providers

Finkok — OnDemand: pay monthly for stamps issued. Public page states a minimum of about 500 stamps/month (not accumulable); unit rates via sales (historically cited about 150 MXN + IVA/month for the minimum block, then about 0.30 MXN + IVA per stamp — exact MXN rates were not listed on the public OnDemand page at verification time).

  • Contract / info: https://finkok.com/ · https://finkok.com/ondemand.html
  • Module notes: username/password; supports issue(); cancel requires a signer (company FIEL via l10n_mx_sat).

Diverza (Timbre Fiscal) — Pyme about 999 MXN + IVA/year (550 CFDIs); Empresarial about 1,599 MXN + IVA/year (1,100 CFDIs). Larger plans via sales.

  • Contract / info: https://portaldvz20.diverza.com/cfdi/timbre-fiscal/ · https://www.diverza.com/
  • Module notes: PAC RFC, client id, and token; supports issue().

Prodigia (PADE) — No public list prices; packages by volume / contact sales. Stamps without expiry (per vendor marketing).

  • Contract / info: https://www.prodigia.com.mx/soluciones/timbrado · https://facturacion.pade.mx/
  • Module notes: user/password/contrato; local seal + stamp() only (supports_issue=False); cancel not exposed in satcfdi.

Comercio Digital — Example stamp packs (+ IVA), 2-year validity: 200=400; 500=850; 1,000=1,400; 5,000=4,500; 10,000=7,800; 50,000=30,000; 100,000=45,000 MXN.

  • Contract / info: https://www.comercio-digital.mx/comprar.html
  • Module notes: user/password; local seal + stamp() only; cancel not exposed in satcfdi.

SW Sapien — Odoo-oriented stamp packs (public store, MXN; confirm IVA): 1,200=2,266; 5,000=5,530; 10,000=8,230; 20,000=9,930; 30,000=11,830; 60,000=18,130; 100,000=23,730. No expiry (per vendor).

  • Contract / info: https://tienda.sw.com.mx/shop/category/timbres-1 · https://sw.com.mx/ · https://info.sw.com.mx/sw-smarter-odoo
  • Module notes: token or user/password; supports issue().

MYSuite — Portal folio packs (WEB / PLUS / PREMIUM) for web billing; WS/API pricing is typically quote-based (confirm with sales).

  • Buy / info: https://comprar.mysuitemex.com/ · https://www.mysuitemex.com/ · https://www.portal.mysuitemex.com/
  • Module notes: requestor + user; local seal + stamp() only; cancel not exposed in satcfdi.

Facturama — API module about 1,650 MXN/year (incl. IVA), includes API Web + Multiemisor and 100 folios; additional API folios about 0.50 / 0.45 / 0.40 MXN (incl. IVA) by volume bands.

  • Contract / info: https://facturama.mx/planes-facturacion · https://facturama.mx/api-facturacion-electronica
  • Module notes: username/password; Multiemisor path used by this module — Registrar uploads the issuer CSD to the PAC before issue(); supports issue().

Module integration (stamp vs issue)

| PAC | Path | Cancel in satcfdi | Credentials (summary) | |-----|------|-------------------|------------------------| | Finkok | issue() (or stamp) | Yes (signer required) | user / password | | Diverza | issue() | Yes | PAC RFC, client id, token | | Prodigia | local seal + stamp() | No | user / password / contrato | | Comercio Digital | local seal + stamp() | No | user / password | | SW Sapien | issue() | Yes | token or user / password | | MYSuite | local seal + stamp() | No | requestor + user | | Facturama | issue() (Multiemisor) | Yes | user / password; CSD upload on Registrar |

Prefer PACs that implement issue() when possible. Otherwise the module signs locally with the issuer CSD and calls stamp().

After installing, follow Configuration to create CFDI > PAC Settings, enter credentials, register issuer CSDs with Registrar, and (when needed) configure series and company FIEL for Finkok cancel.

Breaking migration from legacy Facturama API

  • Existing documents that only store a Facturama tracking_id without the stamped XML cannot be cancelled or recovered through satcfdi. Cancel them at the SAT / previous PAC, or attach the CFDI XML on the document first.
  • Re-register issuers after switching to the satcfdi Facturama adapter so the Multiemisor CSD is uploaded again.
  • Prodigia, Comercio Digital, and MYSuite do not expose cancel in satcfdi; the Cancel button stays hidden for those providers.
  • Prefer PACs that implement issue() when possible; otherwise the module signs locally with the issuer CSD and calls stamp().

Follow these stages to connect Odoo to your PAC and prepare issuers for stamping. For provider pricing, signup links, and stamp vs issue notes, see Installation.

  • Create PAC Settings
  • Go to CFDI > PAC Settings and create a record (or open an existing one).
  • Set a name and choose the Provider (Finkok, Diverza, Prodigia, Comercio Digital, SW Sapien, MYSuite, or Facturama).
  • Assign the companies that will use this PAC connection (multi-company).
  • Enter credentials

Fill in the Credentials group fields that apply to your provider (Settings users / system group):

| Provider | Typical fields | |----------|----------------| | Finkok | User, Password | | Diverza | Password or PAC Token, PAC RFC, PAC Client ID | | Prodigia | User, Password, PAC Contract | | Comercio Digital | User, Password | | SW Sapien | PAC Token, or User and Password | | MYSuite | User, PAC Requestor, PAC Country (default MX) | | Facturama | User, Password |

Credential names and requirements can vary by PAC contract; confirm with the provider documentation if a field is unclear.

  • Select environment

Enable Sandbox Mode for the PAC test environment. Leave it disabled for production.

  • Configure CFDI issuer(s) and register the CSD
  • Go to CFDI > Issuers and create an issuer linked to the PAC Settings record.
  • Set RFC, fiscal name, ZIP, and tax regime.
  • Upload the CSD certificate, private key, and key password.
  • Click Registrar to validate the CSD locally (used for stamp() and for cancel where applicable).

Facturama Multiemisor

For Facturama, Registrar also uploads the issuer CSD to the PAC. That upload is required before issue(). Re-register issuers after switching to the satcfdi Facturama adapter so the Multiemisor CSD is uploaded again.

  • Configure series and folios

Go to CFDI > Series and define the series prefix and next folio when your company uses controlled series/folios.

  • Finkok cancel (company FIEL)

For cancellation with PACs that require a signer (for example Finkok), install l10n_mx_sat and configure the company FIEL.

  • Validate the connection

Confirm that the issuer shows as registered, then stamp a test CFDI in sandbox before switching to production. Prefer PACs that implement issue() when possible; otherwise the module signs locally with the issuer CSD and calls stamp().

No verified information in OCA: Usage.

info

Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.