FiscalAPI
CFDI 4.0: guía técnica completa para desarrolladores

CFDI 4.0: guía técnica completa para desarrolladores

4 de abril de 2026

Desde enero de 2023, el CFDI 4.0 es la única versión que el SAT acepta para timbrar comprobantes fiscales en México. Si llevas tiempo integrando sistemas de facturación, recordarás el caos que fue la migración desde la versión 3.3. Campos nuevos, validaciones más estrictas, y un receptor que de pronto necesitaba datos que nadie recopilaba. Han pasado tres años y todavía me encuentro con integraciones que arrastran parches de la migración como si fueran deuda técnica heredada.

Si estás construyendo algo que toca facturación electrónica en México, necesitas entender el CFDI 4.0 a nivel de campos, validaciones y flujos. No a nivel de "qué botón presiono en el portal del SAT", sino a nivel de "qué campos manda mi API al PAC y por qué me lo rechaza". Eso es lo que cubre esta guía.

Qué es CFDI 4.0

CFDI significa Comprobante Fiscal Digital por Internet. Es un documento electrónico en formato XML que registra transacciones económicas con validez fiscal en México. Cada CFDI lleva una firma digital del emisor y un sello digital (timbre fiscal) que genera un Proveedor Autorizado de Certificación (PAC).

El CFDI 4.0 es la cuarta versión mayor de este estándar, publicada por el SAT en 2022 y obligatoria desde el 1 de enero de 2023. Reemplazó por completo a la versión 3.3 que llevaba vigente desde 2017. Si quieres entender los fundamentos del CFDI desde cero, tengo una guía que los cubre: qué es CFDI y cómo funciona.

La diferencia fundamental entre CFDI 4.0 y su predecesor no es un cambio cosmético de versión. El SAT decidió que quería saber más sobre el receptor de cada comprobante, endureció las validaciones de datos fiscales, y cambió las reglas de cancelación para que no pudieras borrar facturas sin que la otra parte se enterara. En la práctica, esto significó que el XML pasó de ser un formato relativamente flexible a uno donde un punto, una coma o un espacio de más hace que el PAC te rechace el timbrado.

Cambios principales de CFDI 3.3 a 4.0

Antes de entrar a la estructura campo por campo, vale la pena ver el panorama general de qué cambió. Si migraste desde 3.3, esta tabla te va a resultar familiar. Si estás empezando directo con 4.0, te sirve para entender por qué ciertos campos existen y son tan estrictos.

AspectoCFDI 3.3CFDI 4.0
Nombre del receptorOpcional (se podía omitir o poner cualquier texto)Obligatorio y debe coincidir exactamente con la Constancia de Situación Fiscal
Domicilio fiscal del receptorNo requeridoObligatorio (código postal registrado en SAT)
Régimen fiscal del receptorNo requeridoObligatorio y validado contra el catálogo del SAT
Campo de exportaciónNo existíaObligatorio en todos los CFDIs (01 si no aplica)
CancelaciónLibre, sin aprobación del receptorRequiere aceptación del receptor después de 24 horas (excepto montos menores a $1,000 MXN)
Motivo de cancelaciónNo se requeríaObligatorio con clave específica (01, 02, 03, 04)
CFDI que sustituyeOpcional al cancelarObligatorio cuando el motivo de cancelación es 01 (Comprobante emitido con errores con relación)
Validación de RFCBásicaEl PAC valida contra la lista de RFC vigentes del SAT (LRFC)
Complemento de pagoVersión 1.0Versión 2.0 con desglose de impuestos obligatorio

Lo que más dolió en producción fue el nombre del receptor. Parece trivial, pero "EMPRESA SA DE CV" no es lo mismo que "EMPRESA, S.A. DE C.V." para el timbrado. Miles de integraciones se rompieron por algo que a nivel de código es un string comparison.

Si estás manteniendo un sistema que migró de 3.3 a 4.0 en 2022-2023, revisa los registros de errores de timbrado. Es común encontrar parches que rellenan campos nuevos con valores por defecto sin validar contra los datos reales del receptor. Eso pasa auditorías... hasta que no pasa.

Estructura del CFDI 4.0

Un CFDI 4.0 es un archivo XML con una estructura jerárquica definida por el SAT. Tiene docenas de campos, pero estos son los nodos principales y sus campos más relevantes.

NodoCampoObligatorioDescripción
ComprobanteVersionSiempre 4.0
SerieNoIdentificador de la serie (ej: F, NC)
FolioNoNúmero consecutivo dentro de la serie
FechaFecha y hora de emisión en formato ISO 8601
FormaPagoCondicionalClave del catálogo de formas de pago (03, 01, 99, etc.)
MetodoPagoCondicionalPUE o PPD
TipoDeComprobanteI, E, T, P, N
Exportacion01 No aplica, 02 Definitiva, 03 Temporal
LugarExpedicionCódigo postal del emisor
MonedaClave ISO 4217 (MXN, USD, etc.)
EmisorRfcRFC del emisor
NombreNombre o razón social exacta
RegimenFiscalClave del régimen fiscal (601, 612, etc.)
ReceptorRfcRFC del receptor
NombreNombre o razón social exacta (validado contra SAT)
DomicilioFiscalReceptorCódigo postal del domicilio fiscal
RegimenFiscalReceptorRégimen fiscal del receptor
UsoCFDIClave del uso del CFDI (G03, G01, S01, etc.)
ConceptoClaveProdServClave del catálogo de productos del SAT
ClaveUnidadClave de unidad de medida
CantidadCantidad del producto o servicio
DescripcionDescripción libre del concepto
ValorUnitarioPrecio unitario antes de impuestos
ImporteCantidad x Valor Unitario
ObjetoImp01 No objeto, 02 Sí objeto, 03 Sí objeto, no obligado a desglose
ImpuestosTotalImpuestosTrasladadosCondicionalSuma de impuestos trasladados
TotalImpuestosRetenidosCondicionalSuma de impuestos retenidos

El campo ObjetoImp (Objeto de Impuesto) es uno de los que llegó con CFDI 4.0 y genera errores silenciosos. Si un concepto tiene impuestos trasladados o retenidos, debe ser 02. Si no tiene impuestos (como una partida exenta), debe ser 01. Poner 02 sin incluir nodos de impuesto en ese concepto causa rechazo del PAC.

Tipos de CFDI 4.0

El campo TipoDeComprobante define la naturaleza del CFDI. Cada tipo tiene reglas propias sobre qué campos son obligatorios y cuáles no aplican.

El comprobante de venta. Lo emites cuando cobras por un producto o servicio. Es lo que todos llaman "factura" aunque técnicamente es un CFDI de tipo Ingreso. Requiere forma de pago, método de pago, conceptos con impuestos, y todos los datos del receptor.

Si tu sistema solo emite un tipo de CFDI, es este. El 90% de las integraciones que he visto manejan exclusivamente Ingresos, y delegan el resto a contabilidad.

Campos obligatorios específicos: FormaPago, MetodoPago, Conceptos con desglose de impuestos, datos completos del receptor. Más detalles sobre el uso de CFDI para cada caso.

Campos obligatorios a detalle: emisor, receptor y conceptos

Estos tres nodos concentran el 80% de los errores de timbrado que he visto en producción. No por ser difíciles, sino porque requieren datos que no siempre están disponibles en el momento de facturar.

1

Emisor: tus datos fiscales#

El nodo Emisor lleva tu RFC, tu nombre o razón social, y tu régimen fiscal. Los tres deben coincidir con lo que el SAT tiene registrado. Si cambiaste de régimen fiscal y no actualizaste tu sistema, el PAC rechaza el timbrado sin una explicación particularmente útil.

El nombre del emisor debe ser exactamente como aparece en tu Constancia de Situación Fiscal. Mayúsculas, acentos, puntos, comas. Todo cuenta. Guarda esa cadena como un valor de configuración, no como algo que un usuario pueda editar libremente.

2

Receptor: los datos de tu cliente#

Aquí es donde CFDI 4.0 subió la barra. Necesitas: RFC, nombre exacto (igual que en su Constancia de Situación Fiscal), código postal de su domicilio fiscal, régimen fiscal, y uso del CFDI.

Si tu cliente es público en general, usas el RFC genérico XAXX010101000, régimen 616 (Sin Obligaciones Fiscales), y uso S01 (Sin Efectos Fiscales). Para extranjeros, el RFC es XEXX010101000.

La recomendación práctica: pídele a cada cliente su Constancia de Situación Fiscal la primera vez y guarda esos datos. No les preguntes "cuál es tu RFC y nombre". Que te manden el PDF del SAT y lo capturas tú. Evitas el 90% de los rechazos.

3

Conceptos: lo que vendes#

Cada concepto necesita una clave de producto del SAT (ClaveProdServ), una clave de unidad (ClaveUnidad), cantidad, descripción, valor unitario, y el campo ObjetoImp. Si el concepto es objeto de impuesto (02), debe incluir nodos de impuestos trasladados y/o retenidos.

La clave de producto del SAT es un catálogo con más de 50,000 entradas. Para software, la más común es 81112500 (Servicios de software). Para servicios profesionales, 80101500. El SAT publica el catálogo completo en sat.gob.mx.

Sobre impuestos: el IVA al 16% es un impuesto trasladado con base Importe, tipo 002 (IVA), tipo factor Tasa, tasa 0.160000. Si retienes ISR al 10%, es un impuesto retenido con tipo 001 (ISR), tipo factor Tasa, tasa 0.100000. Las tasas van con 6 decimales.

4

Campos de pago#

La forma de pago (FormaPago) indica cómo te pagaron: 01 efectivo, 03 transferencia, 04 tarjeta de crédito. El método de pago (MetodoPago) indica cuándo: PUE si ya te pagaron, PPD si te van a pagar después. Forma 99 solo es válida con PPD. Si pones cualquier otra forma con PPD, o 99 con PUE, el PAC rechaza.

Ciclo de vida del CFDI 4.0

Un CFDI no es solo crearlo y olvidarlo. Tiene un ciclo de vida que va desde su creación hasta su cancelación, y cada etapa tiene reglas y tiempos específicos.

El cambio más significativo en el ciclo de vida con CFDI 4.0 fue la cancelación. Ya no puedes cancelar unilateralmente después de 24 horas. El receptor tiene que aprobar la cancelación, y si no responde en 72 horas, se aprueba automáticamente. Las excepciones son CFDIs con monto menor a $1,000 MXN, CFDIs de nómina, CFDIs de Egreso, y CFDIs de Traslado.

Además, al cancelar necesitas indicar un motivo:

  • 01 Comprobante emitido con errores con relación (debes indicar el UUID del CFDI que lo sustituye)
  • 02 Comprobante emitido con errores sin relación
  • 03 No se llevó a cabo la operación
  • 04 Operación nominativa relacionada en una factura global

El timbrado de facturas en ambiente de pruebas te permite probar todo el ciclo de vida, incluyendo cancelaciones, sin consecuencias fiscales. Siempre prueba tus flujos de cancelación antes de ir a producción. El error más caro es descubrir que tu lógica de cancelación no funciona cuando ya tienes un CFDI real que necesitas anular.

Complementos disponibles para CFDI 4.0

Los complementos son nodos XML adicionales que se insertan dentro del CFDI para casos específicos. Cada complemento tiene su propio esquema XSD y versión.

Complemento de pago 2.0

Registra pagos recibidos de facturas emitidas con método PPD. Obligatorio incluir desglose de impuestos proporcional por documento relacionado. Versión actual: 2.0, vigente desde enero 2022.

Carta Porte 3.1

Obligatorio para el traslado de mercancías por carreteras federales. Incluye origen, destino, mercancías, tipo de transporte, y datos del operador. Aplica a CFDIs de tipo Ingreso y Traslado.

Nómina 1.2

Detalla percepciones, deducciones, horas extra, incapacidades, y datos del trabajador. Va dentro de CFDIs de tipo Nómina. No ha cambiado de versión con CFDI 4.0, pero las validaciones del PAC se endurecieron.

Comercio Exterior 2.0

Para operaciones de exportación definitiva. Incluye datos del destinatario extranjero, mercancías con fracción arancelaria, y valor en aduana. Se usa con el campo Exportacion en valor 02.

INE 1.1

Para contabilizar aportaciones y gastos de campañas electorales. Muy nicho, pero obligatorio para partidos políticos y proveedores de servicios electorales.

Leyendas Fiscales 1.0

Permite agregar textos obligatorios que ciertas disposiciones fiscales requieren. Por ejemplo, leyendas para operaciones con público en general o para ciertos regímenes especiales.

Cómo generar un CFDI 4.0 con la API de Fiscalapi

Construir el XML de un CFDI 4.0 a mano es una receta para el sufrimiento. Son docenas de campos con validaciones cruzadas, catálogos con miles de claves, y un esquema XSD que no perdona un atributo fuera de orden. La forma práctica es usar una API que se encargue de armar el XML, validarlo, enviarlo al PAC, y devolverte el CFDI timbrado listo para entregar.

Con Fiscalapi, la emisión de un CFDI 4.0 se reduce a una llamada a la API con los datos de la transacción. El SDK se encarga del resto.

var fiscalapi = FiscalApiClient.Create(settings => {
    settings.ApiUrl = "https://test.fiscalapi.com";
    settings.ApiKey = "TU_API_KEY";
    settings.Tenant = "TU_TENANT";
});

var invoice = await fiscalapi.Invoices.CreateAsync(new Invoice {
    VersionCode = "4.0",
    Series = "F",
    TypeCode = "I",
    PaymentFormCode = "03",
    PaymentMethodCode = "PUE",
    CurrencyCode = "MXN",
    ExportCode = "01",
    ExpeditionZipCode = "42501",
    Issuer = new InvoiceIssuer { Id = "ID_DEL_EMISOR" },
    Recipient = new InvoiceRecipient {
        Id = "ID_DEL_RECEPTOR",
        CfdiUseCode = "G03"
    },
    Items = new List<InvoiceItem> {
        new InvoiceItem {
            Id = "ID_DEL_PRODUCTO",
            Quantity = 1,
            Taxes = new List<InvoiceItemTax> {
                new InvoiceItemTax {
                    TaxCode = "002",
                    TaxRate = 0.16m,
                    TaxTypeCode = "Tasa",
                    IsFederalTax = true
                }
            }
        }
    }
});

// invoice.Data.Id contiene el UUID del CFDI timbrado
Console.WriteLine($"UUID: {invoice.Data.Id}");

Fiscalapi se encarga del timbrado, la generación del PDF, y el almacenamiento del XML. En el ambiente de pruebas (test.fiscalapi.com) puedes timbrar sin costo y sin consecuencias fiscales. El sandbox simula las validaciones del SAT completas, incluyendo RFC, régimen fiscal, y nombre del receptor. La documentación completa de la API cubre todos los endpoints.

Lo que distingue a este enfoque es que no necesitas conocer la estructura interna del XML. Fiscalapi mapea los campos de la API a los nodos del CFDI 4.0, calcula impuestos, valida catálogos, y maneja los complementos automáticamente. Tú te preocupas por la lógica de negocio; la API se preocupa por el SAT.

Migración de CFDI 3.3 a 4.0

Si por alguna razón todavía tienes código que referencia la versión 3.3 (integraciones legadas, scripts de generación de XML, templates), esto es lo que necesitas corregir.

La versión 3.3 dejó de ser aceptada para timbrado el 1 de enero de 2023. Cualquier intento de timbrar un CFDI 3.3 después de esa fecha es rechazado por todos los PACs. Si tu sistema tiene un campo version hardcodeado en 3.3, ese es tu primer fix.

1

Actualizar el campo Version a 4.0#

Cambia Version="3.3" a Version="4.0" en tu template o constructor de XML. Parece obvio, pero he visto sistemas donde este valor estaba en un archivo de configuración que nadie tocó.

2

Agregar datos completos del receptor#

En 3.3 bastaba el RFC y el uso de CFDI. En 4.0 necesitas: nombre exacto, código postal del domicilio fiscal, y régimen fiscal. Actualiza tu formulario de alta de clientes y tu modelo de datos para almacenar estos campos.

3

Incluir el campo Exportacion#

Nuevo y obligatorio en todos los CFDIs. Si no exportas, pon 01 (No aplica). Si armas el XML manualmente, agrega el atributo Exportacion al nodo raíz Comprobante.

4

Agregar ObjetoImp en cada concepto#

Cada nodo Concepto necesita el atributo ObjetoImp. Si el concepto tiene impuestos, va 02. Si no tiene, va 01. Este campo no existía en 3.3.

5

Actualizar la lógica de cancelación#

Las cancelaciones en 4.0 requieren motivo (01, 02, 03, 04) y, en el caso del motivo 01, el UUID del CFDI sustituto. Si tu sistema cancelaba con una sola llamada al PAC sin parámetros adicionales, necesitas refactorizar ese flujo.

6

Migrar complementos de pago a versión 2.0#

Si emites complementos de pago, actualiza a la versión 2.0 con desglose de impuestos por documento relacionado. La estructura de impuestos cambió completamente. No es un bump de versión: es una reescritura del nodo de impuestos dentro del complemento.

No hagas la migración en producción directamente. Usa un ambiente de pruebas como el sandbox de Fiscalapi para validar que tus CFDIs timbran correctamente con la nueva estructura antes de apuntar a producción. Los errores de timbrado en producción significan facturas que no se emiten, clientes que no reciben sus comprobantes, y un equipo de soporte saturado.

Preguntas frecuentes sobre CFDI 4.0