Every check our CFDI validator runs
This page lists the 437 checks the engine runs, generated straight from its source code: it never promises a rule the validator doesn't actually run.
Summary by family
Structure and required fields
32 checks
| Code | What it checks | Severity |
|---|---|---|
| CFDI40101 | Date does not have the correct format (YYYY-MM-DDThh:mm:ss). | error |
| CFDI40110 | Descuento () cannot be greater than SubTotal (). | error |
| CRP20107 | CondicionesDePago must not exist in Payment type vouchers. | error |
| CRP20108 | Descuento must not exist in Payment type vouchers. | error |
| DEPRECATED_VERSION | CFDI version 3.3 is no longer valid for issuance. Only version 4.0 is accepted. | warning |
| INVALID_VERSION | The CFDI version is not supported; only 3.3 and 4.0 are accepted. | error |
| MISSING_ATTR_FECHA | Missing required attribute 'Fecha' in the Comprobante node. | error |
| MISSING_ATTR_LUGAREXPEDICION | Missing required attribute 'LugarExpedicion' in the Comprobante node. | error |
| MISSING_ATTR_MONEDA | Missing required attribute 'Moneda' in the Comprobante node. | error |
| MISSING_ATTR_SUBTOTAL | Missing required attribute 'SubTotal' in the Comprobante node. | error |
| MISSING_ATTR_TIPODECOMPROBANTE | Missing required attribute 'TipoDeComprobante' in the Comprobante node. | error |
| MISSING_ATTR_TOTAL | Missing required attribute 'Total' in the Comprobante node. | error |
| MISSING_CONCEPTO_CANTIDAD | Missing 'Cantidad' attribute in a Concepto. | error |
| MISSING_CONCEPTO_CLAVEPRODSERV | Missing 'ClaveProdServ' attribute in a Concepto. | error |
| MISSING_CONCEPTO_CLAVEUNIDAD | Missing 'ClaveUnidad' attribute in a Concepto. | error |
| MISSING_CONCEPTO_DESCRIPCION | Missing 'Descripcion' attribute in a Concepto. | error |
| MISSING_CONCEPTO_IMPORTE | Missing 'Importe' attribute in a Concepto. | error |
| MISSING_CONCEPTO_OBJETOIMP | Missing 'ObjetoImp' attribute in a Concepto. | error |
| MISSING_CONCEPTO_VALORUNITARIO | Missing 'ValorUnitario' attribute in a Concepto. | error |
| MISSING_EMISOR_NOMBRE | Missing Issuer Name. | error |
| MISSING_EMISOR_REGIMEN | Missing Issuer Tax Regime. | error |
| MISSING_EMISOR_RFC | Missing Issuer RFC. | error |
| MISSING_EXPORTACION | Missing required attribute 'Exportacion' (required in CFDI 4.0). | error |
| MISSING_RECEPTOR_DOMICILIO | Missing Receiver Tax Domicile (required in CFDI 4.0). | error |
| MISSING_RECEPTOR_NOMBRE | Missing Receiver Name. | error |
| MISSING_RECEPTOR_REGIMEN | Missing Receiver Tax Regime (required in CFDI 4.0). | error |
| MISSING_RECEPTOR_RFC | Missing Receiver RFC. | error |
| MISSING_RECEPTOR_USOCFDI | Missing Receiver CFDI Usage. | error |
| MISSING_VERSION | Missing 'Version' attribute in Comprobante node. | error |
| NO_COMPROBANTE | Root node 'Comprobante' not found in the XML. | error |
| NO_CONCEPTOS | No line items (Conceptos) found in the CFDI. | error |
| XML_PARSE_ERROR | The file is not valid XML. | error |
SAT catalogs
32 checks
| Code | What it checks | Severity |
|---|---|---|
| CFDI40103 | FormaPago must not exist for type vouchers. | error |
| CFDI40104 | Payment Form is not valid in the c_FormaPago catalog. | error |
| CFDI40105 | When MetodoPago is PPD, FormaPago must be 99 (To be defined). | error |
| CFDI40105_PUE99 | FormaPago '99' (To be defined) is not appropriate for MetodoPago PUE. Should indicate the actual payment form. | warning |
| CFDI40113 | Currency is not valid in the SAT c_Moneda catalog. | error |
| CFDI40114 | When currency is MXN, TipoCambio must be '1'. | error |
| CFDI40115 | For currency (different from MXN), TipoCambio is required. | error |
| CFDI40116 | When currency is XXX, TipoCambio must not exist. | error |
| CFDI40121 | Voucher Type is not valid in the c_TipoDeComprobante catalog. | error |
| CFDI40123 | Export is not valid in the c_Exportacion catalog. | error |
| CFDI40124 | Payment Method is not valid. | error |
| CFDI40125 | MetodoPago must not exist for type vouchers. | error |
| CFDI40126 | Place of Issue is not a valid postal code in the c_CodigoPostal catalog. | error |
| CFDI40140 | Issuer Tax Regime is not valid. | error |
| CFDI40141 | Tax Regime does not apply to (RFC:). | error |
| CFDI40147 | Tax Domicile does not have valid format (must be 5 digits). | error |
| CFDI40147_HINT | The receiver's postal code is valid, but must exactly match their Tax Status Certificate. | info |
| CFDI40148 | Receiver's postal code does not exist in the SAT catalog (c_CodigoPostal). | error |
| CFDI40149 | For generic RFCs, DomicilioFiscalReceptor must equal LugarExpedicion. | error |
| CFDI40157 | Receiver Tax Regime is not valid. | error |
| CFDI40158 | Tax Regime does not apply to (RFC:). | error |
| CFDI40159 | For generic RFCs, RegimenFiscalReceptor must be 616. | error |
| CFDI40160 | CFDI Usage is not valid in the c_UsoCFDI catalog. | error |
| CFDI40161 | CFDI Usage is not compatible with person type and tax regime . The SAT will reject this CFDI. | error |
| CFDI40162 | ClaveProdServ of Concepto does not exist in the c_ClaveProdServ catalog. | error |
| CFDI40165 | ClaveUnidad of Concepto does not exist in the c_ClaveUnidad catalog. | error |
| CFDI40170 | ObjetoImp of Concepto is not valid. | error |
| CFDI40171 | Concepto has ObjetoImp='02' but does not include Impuestos node. | error |
| CFDI40172 | Concepto has ObjetoImp= but includes Impuestos node (must not exist). | error |
| CFDI40201 | Impuestos node must not exist for type vouchers. | error |
| CRP20_USOCFDI_NOMINA | For Payroll (N) type vouchers, UsoCFDI must be CN01. | error |
| CRP20_USOCFDI_PAGO | For Payment (P) type vouchers, UsoCFDI must be CP01. | error |
Amounts and totals
13 checks
| Code | What it checks | Severity |
|---|---|---|
| CFDI40197 | ValorUnitario of Parte of Concepto must be greater than zero; found. | error |
| CFDI40198 | Importe of Parte of Concepto () is outside the range SAT accepts for that part's Cantidad × ValorUnitario ( ×): to. | error |
| CONCEPTO_DESCUENTO_EXCEEDS | A concepto's Descuento is greater than its Importe. | error |
| CONCEPTO_IMPORTE_MISMATCH | A concepto's Importe doesn't match Cantidad × ValorUnitario. | error |
| DESCUENTO_MISMATCH | The global Descuento doesn't match the sum of the concepts' Descuentos. | warning |
| NEGATIVE_TOTAL | The voucher Total cannot be negative. | error |
| PAGO_SUBTOTAL_NOT_ZERO | In Payment vouchers, SubTotal must be 0. | error |
| PAGO_TOTAL_NOT_ZERO | In Payment vouchers, Total must be 0. | error |
| PARTE_IMPORTE_NO_EXACTO | A Parte's Importe is within SAT's range but not exactly Cantidad × ValorUnitario; some PACs require exact equality. | warning |
| PARTE_INCOMPLETA | A concepto Parte has no ValorUnitario or Importe; the schema allows it, but some PACs reject it. | warning |
| SUBTOTAL_MISMATCH | SubTotal doesn't match the sum of the concepts' Importes. | error |
| TOTAL_MISMATCH | Total doesn't match SubTotal − Descuento + Traslados − Retenciones. | error |
| TOTAL_NO_TAXES | With no Impuestos node, Total doesn't match SubTotal − Descuento. | warning |
Tax amounts and rates
36 checks
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| CFDI40164 | ClaveProdServ in Concepto requires a VAT traslado per the c_ClaveProdServ catalog, and the concept does not include one. | error | — |
| CFDI40173 | Concepto includes the Impuestos node but has no Traslado or Retencion. | error | — |
| CFDI40174 | Concepto Traslado Base must be greater than zero (found:). | error | — |
| CFDI40175 | Traslado Impuesto in Concepto is not in the c_Impuesto catalog. | error | — |
| CFDI40176 | Traslado TipoFactor in Concepto is not in the c_TipoFactor catalog. | error | — |
| CFDI40177 | Concepto Traslado is Exento and must not include TasaOCuota or Importe. | error | — |
| CFDI40178 | Concepto Traslado has TipoFactor and must include TasaOCuota and Importe. | error | — |
| CFDI40179 | TasaOCuota in Concepto Traslado does not match the c_TasaOCuota catalog for Impuesto=, TipoFactor=, valid on. | error | — |
| CFDI40180 | A tax traslado's Importe is outside the permitted Base × TasaOCuota limits. | error | — |
| CFDI40181 | Concepto Retencion Base must be greater than zero (found:). | error | — |
| CFDI40182 | Retencion Impuesto in Concepto is not in the c_Impuesto catalog. | error | — |
| CFDI40183 | Retencion TipoFactor in Concepto is not in the c_TipoFactor catalog. | error | — |
| CFDI40184 | Concepto Retencion cannot have TipoFactor Exento: withholding an exempt tax makes no sense. | error | — |
| CFDI40185 | TasaOCuota in Concepto Retencion does not match the c_TasaOCuota catalog for Impuesto=, TipoFactor=, valid on. | error | — |
| CFDI40186 | Importe () of Concepto Retencion is outside the allowed range [, ] for Base × TasaOCuota. | error | — |
| CFDI40202 | TotalImpuestosRetenidos has more decimals () than currency supports (). | error | — |
| CFDI40203 | TotalImpuestosRetenidos () does not equal the sum of Retencion.Importe (). | error | — |
| CFDI40204 | TotalImpuestosTrasladados has more decimals () than currency supports (). | error | — |
| CFDI40205 | TotalImpuestosTrasladados () does not equal the sum of Traslado.Importe (). | error | — |
| CFDI40206 | The Retenciones node exists but the TotalImpuestosRetenidos attribute is missing on cfdi:Impuestos. | error | — |
| CFDI40207 | Comprobante Retencion Impuesto is not in the c_Impuesto catalog. | error | — |
| CFDI40208 | There is more than one comprobante-level Retencion for tax. | error | — |
| CFDI40209 | A Retencion exists but the Impuestos node's TotalImpuestosRetenidos attribute is missing. | error | — |
| CFDI40210 | The comprobante Retencion Importe has more decimals () than currency supports (). | error | — |
| CFDI40211 | The Importe () of the Retencion does not match the sum of the concepts' Retencion for that tax (). | error | — |
| CFDI40212 | There are concepts with a non-Exento Traslado but the TotalImpuestosTrasladados attribute is missing. | error | — |
| CFDI40213 | A comprobante-level Exento Traslado must only carry Base, Impuesto and TipoFactor; it must not include TasaOCuota or Importe. | error | — |
| CFDI40214 | The comprobante Traslado Base has more decimals () than currency supports (). | error | — |
| CFDI40215 | The Base () of the Traslado grouped by Impuesto=/TipoFactor= does not match the sum of the concepts' Base (). | error | — |
| CFDI40216 | The Base () of the Traslado grouped by Impuesto=/TipoFactor= does not match the sum of the concepts' Base (). | error | — |
| CFDI40217 | Comprobante Traslado Impuesto is not in the c_Impuesto catalog. | error | — |
| CFDI40218 | There is more than one comprobante-level Traslado with the same combination Impuesto=, TipoFactor=, TasaOCuota=. | error | — |
| CFDI40219 | TasaOCuota in the comprobante Traslado does not match the c_TasaOCuota catalog for Impuesto=, TipoFactor=. | error | — |
| CFDI40220 | The comprobante Traslado Importe has more decimals () than currency supports (). | error | — |
| CFDI40221 | The Importe () of the Traslado grouped by Impuesto=/TipoFactor=/TasaOCuota= does not match the sum of the concepts' Importe (). | error | — |
| LIVA12_BASE_IVA | A concept's VAT Base doesn't match Importe − Discount + that concept's transferred IEPS. | warning | LIVA Art. 12 |
Digital seal, certificate and stamp
24 checks
| Code | What it checks | Severity |
|---|---|---|
| CSD_EXPIRED | The Digital Seal Certificate (CSD) has expired. | error |
| CSD_NOT_YET_VALID | The CSD is not yet valid. | error |
| CSD_PARSE_ERROR | Could not parse the embedded X.509 certificate. It may be corrupted or have incorrect format. | warning |
| CSD_RFC_MISMATCH | The certificate's (CSD) RFC doesn't match the issuer's RFC. | error |
| CSD_RFC_OK | The certificate's RFC matches the issuer's. | info |
| CSD_VALID | CSD is valid (expires). | info |
| INVALID_CERTIFICADO_FORMAT | The Certificate does not have a valid Base64 format. | error |
| INVALID_NO_CERTIFICADO_FORMAT | Certificate Number does not have the correct format (must be 20 digits). | error |
| INVALID_SELLO_FORMAT | The Seal does not have a valid Base64 format. | error |
| INVALID_UUID_FORMAT | UUID does not have a valid format. | error |
| MISSING_CERTIFICADO | Missing CFDI Certificate. | error |
| MISSING_FECHA_TIMBRADO | Missing stamp date. | warning |
| MISSING_NO_CERTIFICADO | Missing CFDI Certificate Number. | error |
| MISSING_NO_CERTIFICADO_SAT | Missing SAT Certificate Number. | warning |
| MISSING_SELLO | Missing CFDI digital seal. | error |
| MISSING_SELLO_SAT | Missing SAT Seal in the Digital Tax Stamp. | warning |
| MISSING_UUID | Missing UUID (Tax Receipt ID) in the Digital Tax Stamp. | error |
| NO_CERTIFICADO_MISMATCH | NoCertificado doesn't match the embedded certificate's serial number. | error |
| NO_TIMBRE | Digital Tax Stamp not found. The CFDI has not been stamped by a PAC. | warning |
| SELLO_INVALID | The CFDI digital seal is NOT valid. The cryptographic signature does not match the content. | error |
| SELLO_MISMATCH | SelloCFD in the Digital Tax Stamp does not match the Comprobante Seal. | error |
| SELLO_NO_VERIFICABLE | The seal could not be checked because the CFDI has a complement the validator does not rebuild yet; it does not indicate tampering. | warning |
| SELLO_VALID | The CFDI digital seal is valid. The cryptographic signature matches the content. | info |
| SELLO_VERIFY_ERROR | Could not cryptographically verify the seal. The certificate or seal may be corrupted. | warning |
RFC (tax ID)
9 checks
| Code | What it checks | Severity |
|---|---|---|
| RFC_EMISOR_GENERICO | Issuer RFC cannot be a generic RFC. | error |
| RFC_INVALID_FORMAT_EMISOR | The issuer's RFC does not have a valid format. | error |
| RFC_INVALID_FORMAT_RECEPTOR | The receiver's RFC does not have a valid format. | error |
| RFC_INVALID_LENGTH_EMISOR | The issuer's RFC has an invalid length (12 for a legal entity, 13 for an individual). | error |
| RFC_INVALID_LENGTH_RECEPTOR | The receiver's RFC has an invalid length (12 for a legal entity, 13 for an individual). | error |
| RFC_LOWERCASE_EMISOR | The issuer's RFC must be uppercase. | error |
| RFC_LOWERCASE_RECEPTOR | The receiver's RFC must be uppercase. | error |
| RFC_SUSPICIOUS_DATE_EMISOR | The date portion of the issuer's RFC looks invalid. | warning |
| RFC_SUSPICIOUS_DATE_RECEPTOR | The date portion of the receiver's RFC looks invalid. | warning |
SAT blacklists (69-B and 69)
7 checks
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| ART69_NO_VERIFICADO | Could not check the issuer against one or more CFF Article 69 lists: the SAT listing is unavailable or a list is missing. | info | CFF Art. 69 |
| EFOS_DEFINITIVO | The issuer is on the SAT blacklist (69-B) as definitive: the invoice is likely not tax-deductible. | error | — |
| EFOS_DESVIRTUADO | The issuer was on the SAT blacklist but has since cleared it: no action required. | info | — |
| EFOS_NO_VERIFICADO | Could not check the issuer against the EFOS list: the SAT listing is unavailable. | info | — |
| EFOS_PRESUNTO | The issuer is on the SAT blacklist (69-B) as presumed: verify before deducting. | warning | — |
| EFOS_SENTENCIA_FAVORABLE | Issuer () was on the 69-B list but obtained a favorable ruling: the SAT act was set aside. | info | — |
| EMISOR_EN_LISTAS_ART69 | The issuer appears in the CFF Article 69 non-compliance register (final debts, not located, etc.). | warning | CFF Art. 69 |
Product key and unit consistency
11 checks
| Code | What it checks | Severity |
|---|---|---|
| PRODSERV_UNIT_LOW_CONFIDENCE_REVIEW | Could not reliably determine whether the product/service key and unit are consistent; manual review recommended. | info |
| PRODSERV_UNIT_SEMANTIC_INCOMPATIBLE | The product/service key and the unit of measure used are not semantically compatible. | warning |
| PRODSERV_UNIT_SEMANTIC_MISMATCH | The unit of measure used is atypical for this product/service key type. | warning |
| SAT_PYS_CLASSIFICATION_FOUND | No specific unit suggestion exists, but SAT's PyS classification helps verify whether the unit used is consistent. | info |
| SAT_PYS_CLASSIFICATION_MISSING | No PyS classification was found for this product/service key; low-confidence semantic rules were used instead. | info |
| SAT_UNIT_NOT_SUGGESTED_FOR_PRODSERV | The unit of measure used doesn't match SAT's base suggestion for that product/service key. | warning |
| SAT_UNIT_RANGE_SUGGESTION_MATCH | The unit of measure used matches SAT's base suggestion for that key range. | info |
| SAT_UNIT_RANGE_SUGGESTION_MISMATCH | The unit of measure used doesn't match SAT's base suggestion for that key range. | warning |
| SAT_UNIT_SUGGESTION_MATCH | The unit of measure used matches SAT's base suggestion for that product/service key. | info |
| TENANT_UNIT_PREFERENCE_MATCH | The unit of measure matches this account's custom configuration. | info |
| TENANT_UNIT_PREFERENCE_MISMATCH | The unit of measure doesn't match this account's custom configuration. | warning |
Income, credit note and transfer
13 checks
| Code | What it checks | Severity |
|---|---|---|
| EGRESO_MISSING_FORMA_PAGO | Credit Note (Egreso) type vouchers must include the Payment Form. | error |
| EGRESO_MISSING_METODO_PAGO | Credit Note (Egreso) type vouchers must include the Payment Method. | error |
| EGRESO_NO_RELACIONADOS | It is recommended that Credit Note vouchers include CfdiRelacionados referencing the original Income CFDI. | warning |
| EGRESO_TIPO_RELACION_INVALID | A CfdiRelacionado's TipoRelacion is not valid. | error |
| EGRESO_UUID_RELACIONADO_INVALID | Related UUID does not have valid format. | error |
| INGRESO_GENERIC_CLAVEPRODSERV | Concepto uses the generic ClaveProdServ 84111506 (Billing services). Consider using a more specific key. | warning |
| INGRESO_MISSING_FORMA_PAGO | Income type vouchers must include the Payment Form. | error |
| INGRESO_MISSING_METODO_PAGO | Income type vouchers must include the Payment Method. | error |
| INGRESO_PPD_FORMA_PAGO | When Payment Method is PPD, Payment Form must be 99 (To be defined). | error |
| TRASLADO_DESCUENTO | Transfer type vouchers must not include Descuento. | error |
| TRASLADO_FORMA_PAGO | Transfer type vouchers must not include FormaPago. | error |
| TRASLADO_METODO_PAGO | Transfer type vouchers must not include MetodoPago. | error |
| TRASLADO_VU_NEGATIVE | Concepto ValorUnitario cannot be negative. | error |
Payment complement 2.0
52 checks
| Code | What it checks | Severity |
|---|---|---|
| CRP20114 | In Payment vouchers, NoIdentificacion must not exist. | error |
| CRP20115 | In Payment vouchers, Cantidad must be '1'. | error |
| CRP20116 | In Payment vouchers, ClaveUnidad must be 'ACT'. | error |
| CRP20117 | In Payment vouchers, Unidad must not exist. | error |
| CRP20118 | In Payment vouchers, Descripcion must be 'Pago'. | error |
| CRP20119 | In Payment vouchers, ValorUnitario must be 0. | error |
| CRP20120 | In Payment vouchers, Importe must be 0. | error |
| CRP20121 | In Payment vouchers, Descuento must not exist in Concepto. | error |
| CRP20122 | In Payment vouchers, ObjetoImp must be '01'. | error |
| CRP20205 | Pago transfer rate ImporteP () is inconsistent with the SAT's full-precision calculation (). The SAT recalculates ImporteDR = BaseDR × TasaOCuotaDR with 6 decimals. When ImporteDR is rounded to document currency decimals, precision is lost causing Totales rejection. | error |
| CRP20212 | Pago FormaDePagoP must not be '99'. | error |
| CRP20213 | Pago MonedaP must not be 'XXX'. | error |
| CRP20214 | TipoCambioP is required when MonedaP () is not MXN. | error |
| CRP20215 | When MonedaP is MXN, TipoCambioP must be '1'. | error |
| CRP20217 | Sum of ImpPagado () exceeds Pago Monto (). Monto must be greater than or equal to the sum of paid amounts. | error |
| CRP20218 | Pago Monto must be greater than 0. | error |
| CRP20236 | DoctoRelacionado MonedaDR must not be 'XXX'. | error |
| CRP20237 | EquivalenciaDR is required when MonedaDR () differs from MonedaP (). | error |
| CRP20238 | When MonedaDR = MonedaP, EquivalenciaDR must be '1'. | error |
| CRP20239 | DoctoRelacionado ImpSaldoAnt must be > 0. | error |
| CRP20241 | DoctoRelacionado ImpPagado must be > 0. | error |
| CRP20244 | ImpSaldoInsoluto must equal ImpSaldoAnt minus ImpPagado, and cannot be negative. | error |
| CRP20244_NEG | ImpSaldoInsoluto cannot be negative. | error |
| CRP20246 | ObjetoImpDR='02' requires ImpuestosDR node. | error |
| CRP20247 | ObjetoImpDR= prohibits ImpuestosDR node. | error |
| CRP20254 | Retention ImporteDR () is not within permitted limits. Expected: (BaseDR × TasaOCuotaDR). | error |
| CRP20261 | Transfer rate ImporteDR () is not within permitted limits. Expected: (BaseDR × TasaOCuotaDR). | error |
| CRP20265 | Pago retention ImporteP () does not equal the sum () of retained amounts from related documents. | error |
| CRP20268 | A payment complement traslado's BaseP doesn't equal the sum of the related documents' bases. | error |
| CRP20274 | Pago transfer rate ImporteP () does not match the sum of transfer ImporteDR from related documents (). | error |
| CRP20275 | A related document's ImpPagado is outside the range SAT computes for multi-currency payments. | error |
| CRP20275-PRECISION | EquivalenciaDR has fewer than 6 decimals, which can cause SAT to reject the CFDI. | warning |
| CRP20276 | The Pago's Monto is outside the permitted limits for multi-currency operations. | error |
| EQUIV_DR_INCORRECT | The declared EquivalenciaDR appears incorrect based on the taxes the payment reports. | error |
| PAGO_CLAVEPRODSERV | In Payment vouchers, ClaveProdServ must be '84111506'. | error |
| PAGO_CONCEPTOS_COUNT | Payment vouchers must have exactly one Concepto. | error |
| PAGO_INVALID_VERSION | The Payment complement version is not 2.0. | error |
| PAGO_MISSING_COMPLEMENT | Payment type vouchers must include the Payment complement. | error |
| PAGO_MONEDA | In Payment vouchers, the Comprobante Moneda must be 'XXX'. | error |
| PAGO_NO_DOCTOS | Pago has no related documents. | error |
| PAGO_NO_PAGO_NODES | The Payment complement contains no Pago nodes. | error |
| PAGO_TOTALES_MONTOTOTALPAGOS | MontoTotalPagos doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALRETENCIONESIEPS | TotalRetencionesIEPS doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALRETENCIONESISR | TotalRetencionesISR doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALRETENCIONESIVA | TotalRetencionesIVA doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSBASEIVA0 | TotalTrasladosBaseIVA0 doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSBASEIVA16 | TotalTrasladosBaseIVA16 doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSBASEIVA8 | TotalTrasladosBaseIVA8 doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSBASEIVAEXENTO | TotalTrasladosBaseIVAExento doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSIMPUESTOIVA0 | TotalTrasladosImpuestoIVA0 doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSIMPUESTOIVA16 | TotalTrasladosImpuestoIVA16 doesn't match the calculated sum of the payments. | error |
| PAGO_TOTALES_TOTALTRASLADOSIMPUESTOIVA8 | TotalTrasladosImpuestoIVA8 doesn't match the calculated sum of the payments. | error |
Payroll 1.2
115 checks
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| NOM105 | The payroll Comprobante has a TipoCambio; the 4.0 guide says it must not exist. A value of 1 is only a warning. | errorwarning | Guía de llenado de nómina p. 9 (TipoCambio no debe existir); Matriz de errores Nómina 1.2 (NOM105, admite 1) |
| NOM106 | The Comprobante SubTotal does not equal TotalPercepciones plus TotalOtrosPagos in the complement. | error | Matriz de errores Nómina 1.2 (NOM106); Guía de llenado de nómina pp. 8 y 19 |
| NOM107 | The Comprobante Descuento does not match TotalDeducciones, or it exists even though the payroll has no TotalDeducciones. | error | Matriz de errores Nómina 1.2 (NOM107); Guía de llenado de nómina p. 8 |
| NOM108 | The Comprobante Total does not follow the XSD amount format (up to 18 integer digits and 6 decimals, no sign). More than 2 decimals is only a warning. | errorwarning | Matriz de errores Nómina 1.2 (NOM108); XSD nomina12 (t_Importe) |
| NOM109 | The Comprobante Total does not equal TotalPercepciones plus TotalOtrosPagos minus TotalDeducciones. | error | Matriz de errores Nómina 1.2 (NOM109); Guía de llenado de nómina p. 10 |
| NOM112 | The payroll Comprobante has CondicionesDePago, an attribute the 4.0 guide does not allow on payroll. | error | Matriz de errores Nómina 1.2 (NOM112); Guía de llenado de nómina p. 8 (CondicionesDePago no debe existir) |
| NOM132 | The payroll Comprobante Moneda is not MXN. | error | Matriz de errores Nómina 1.2 (NOM132); Guía de llenado de nómina p. 8 |
| NOM134 | The CFDI has a Payroll complement but its TipoDeComprobante is not N. | error | Matriz de errores Nómina 1.2 (NOM134); Guía de llenado de nómina p. 10 |
| NOM135 | The issuer is a legal entity (12-character RFC) but the complement has an issuer Curp, which must not exist. | error | Matriz de errores Nómina 1.2 (NOM135); Guía de llenado de nómina pp. 13 y 28 |
| NOM136 | The issuer is an individual (13-character RFC) but the complement has no issuer Curp, which must exist. | error | Matriz de errores Nómina 1.2 (NOM136); Guía de llenado de nómina p. 28 |
| NOM137 | The Receptor RFC of the payroll CFDI is not 13 characters long, so it is not an individual's RFC. | error | Matriz de errores Nómina 1.2 (NOM137, equivalente a NOM121); Guía de llenado de nómina p. 15 |
| NOM139 | The payroll Comprobante does not have exactly one Concepto, or the Concepto has nodes the guide prohibits (Impuestos, InformacionAduanera, CuentaPredial, ComplementoConcepto, Parte or ACuentaTerceros). | error | Matriz de errores Nómina 1.2 (NOM139); Guía de llenado de nómina p. 17 |
| NOM140 | The Concepto ClaveProdServ is not 84111505, the key for payroll. | error | Matriz de errores Nómina 1.2 (NOM140); Guía de llenado de nómina p. 18 |
| NOM141 | The Concepto has NoIdentificacion, an attribute that must not exist on a payroll. | error | Matriz de errores Nómina 1.2 (NOM141); Guía de llenado de nómina p. 18 |
| NOM142 | The Concepto Cantidad is not 1. | error | Matriz de errores Nómina 1.2 (NOM142); Guía de llenado de nómina p. 18 |
| NOM143 | The Concepto ClaveUnidad is not ACT. | error | Matriz de errores Nómina 1.2 (NOM143); Guía de llenado de nómina p. 18 |
| NOM144 | The Concepto has Unidad, an attribute that must not exist on a payroll. | error | Matriz de errores Nómina 1.2 (NOM144); Guía de llenado de nómina p. 18 |
| NOM145 | The Concepto Descripcion is not 'Pago de nómina'. The comparison ignores accents and case, and a difference is reported as a warning. | warning | Matriz de errores Nómina 1.2 (NOM145); Guía de llenado de nómina p. 18 y pregunta 19 (p. 92) |
| NOM146 | The Concepto ValorUnitario does not equal TotalPercepciones plus TotalOtrosPagos. | error | Matriz de errores Nómina 1.2 (NOM146); Guía de llenado de nómina p. 19 |
| NOM147 | The Concepto Importe does not equal TotalPercepciones plus TotalOtrosPagos. | error | Matriz de errores Nómina 1.2 (NOM147); Guía de llenado de nómina p. 19 |
| NOM148 | The Concepto Descuento does not match TotalDeducciones, or it exists even though the payroll has no TotalDeducciones. | error | Matriz de errores Nómina 1.2 (NOM148); Guía de llenado de nómina p. 19 |
| NOM149 | The Comprobante has an Impuestos node, which must not exist on a payroll; withholdings go in the complement. | error | Matriz de errores Nómina 1.2 (NOM149); Guía de llenado de nómina p. 19 (Impuestos no debe existir en el Concepto) |
| NOM151 | The Nomina node has neither TotalPercepciones nor TotalOtrosPagos; at least one of them must be present. | error | Matriz de errores Nómina 1.2 (NOM151); Guía de llenado de nómina p. 21 |
| NOM152 | TipoNomina is not a key of the c_TipoNomina catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM152); Guía de llenado de nómina p. 22 |
| NOM153 | An ordinary payroll (TipoNomina O) has PeriodicidadPago 99. The rule requires any key other than 99, as the guide says, not 01 to 09 as the matrix says. | error | Matriz de errores Nómina 1.2 (NOM153); Guía de llenado de nómina p. 42 |
| NOM154 | In an extraordinary payroll (TipoNomina E) PeriodicidadPago is not 99 (Other periodicity). | error | Matriz de errores Nómina 1.2 (NOM154); Guía de llenado de nómina p. 42 |
| NOM155 | FechaInicialPago is after FechaFinalPago. | error | Matriz de errores Nómina 1.2 (NOM155); Guía de llenado de nómina p. 24 |
| NOM156 | The Nomina node has TotalPercepciones, but the complement has no Percepciones node. | error | Matriz de errores Nómina 1.2 (NOM156); Guía de llenado de nómina p. 26 |
| NOM157 | TotalPercepciones does not equal the sum of TotalSueldos, TotalSeparacionIndemnizacion and TotalJubilacionPensionRetiro in the Percepciones node. A missing attribute counts as zero. | error | Matriz de errores Nómina 1.2 (NOM157); Guía de llenado de nómina p. 26 |
| NOM158 | The Nomina node has TotalDeducciones, but the complement has no Deducciones node. | error | Matriz de errores Nómina 1.2 (NOM158); Guía de llenado de nómina p. 26 |
| NOM159 | TotalDeducciones does not equal the sum of TotalOtrasDeducciones and TotalImpuestosRetenidos in the Deducciones node. A missing attribute counts as zero. | error | Matriz de errores Nómina 1.2 (NOM159); Guía de llenado de nómina pp. 26-27 |
| NOM160 | The OtrosPagos node does not match TotalOtrosPagos: the attribute is missing or does not equal the sum of the OtroPago Importe values. | error | Matriz de errores Nómina 1.2 (NOM160); Guía de llenado de nómina p. 27 |
| NOM162 | TipoContrato 01 to 08 (employment) has no RegistroPatronal in the Emisor. The guide allows exceptions that cannot be told apart here, so it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM162); Guía de llenado de nómina p. 29 |
| NOM163 | TipoContrato 09, 10 or 99 (assimilated or without employment relationship) has a RegistroPatronal in the Emisor, which must not exist. | error | Matriz de errores Nómina 1.2 (NOM163); Guía de llenado de nómina p. 29 |
| NOM164 | With RegistroPatronal in the Emisor, IMSS attributes are missing from the Receptor: NumSeguridadSocial, FechaInicioRelLaboral, Antigüedad, RiesgoPuesto or SalarioDiarioIntegrado. | error | Matriz de errores Nómina 1.2 (NOM164); Guía de llenado de nómina p. 29 |
| NOM167 | The EntidadSNCF OrigenRecurso is not a c_OrigenRecurso key (IP, IF or IM) in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM167); Guía de llenado de nómina p. 31 |
| NOM168 | OrigenRecurso is IM (mixed income) and EntidadSNCF is missing MontoRecursoPropio. | error | Matriz de errores Nómina 1.2 (NOM168); Guía de llenado de nómina p. 31 |
| NOM169 | OrigenRecurso is IP or IF, but EntidadSNCF has MontoRecursoPropio, which only applies to IM. | error | Matriz de errores Nómina 1.2 (NOM169); Guía de llenado de nómina p. 31 |
| NOM170 | EntidadSNCF MontoRecursoPropio is not less than TotalPercepciones plus TotalOtrosPagos. | error | Matriz de errores Nómina 1.2 (NOM170); Guía de llenado de nómina p. 32 |
| NOM171 | TipoContrato is not a key of the c_TipoContrato catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM171); Guía de llenado de nómina p. 36 |
| NOM172 | TipoJornada is not a key of the c_TipoJornada catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM172); Guía de llenado de nómina p. 37 |
| NOM173 | The Payroll Receptor's FechaInicioRelLaboral is after FechaFinalPago. | error | Matriz de errores Nómina 1.2 (NOM173); Guía de llenado de nómina p. 34 |
| NOM174 | Antigüedad in weeks exceeds (days between FechaInicioRelLaboral and FechaFinalPago, plus one) divided by seven. | error | Matriz de errores Nómina 1.2 (NOM174); Guía de llenado de nómina p. 35 |
| NOM175 | Antigüedad in years, months and days doesn't match the time between FechaInicioRelLaboral and FechaFinalPago, counting the start date. | warning | Matriz de errores Nómina 1.2 (NOM175); Guía de llenado de nómina p. 35 |
| NOM176 | TipoRegimen is not a key of the c_TipoRegimen catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM176); Guía de llenado de nómina p. 38 |
| NOM177 | With TipoContrato 01 to 08, TipoRegimen is not 02, 03 or 04. It is only a warning, since the guide also uses regime 13 for severance payments. | warning | Matriz de errores Nómina 1.2 (NOM177); Guía de llenado de nómina p. 39 |
| NOM178 | With TipoContrato 09 or higher, TipoRegimen is outside the 05 to 99 range. It is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM178); Guía de llenado de nómina p. 39 |
| NOM179 | RiesgoPuesto is not a key of the c_RiesgoPuesto catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM179); Guía de llenado de nómina p. 40 |
| NOM180 | PeriodicidadPago is not a key of the c_PeriodicidadPago catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM180); Guía de llenado de nómina p. 41 |
| NOM181 | Banco is not a key of the c_Banco catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM181); Guía de llenado de nómina p. 43 |
| NOM182 | CuentaBancaria has non-digit characters or is outside the 10 to 18 character range. A length other than 10, 11, 15, 16 or 18 is only a warning. | errorwarning | Matriz de errores Nómina 1.2 (NOM182); Guía de llenado de nómina p. 43 |
| NOM183 | CuentaBancaria is an 18-digit CLABE and the Receptor has Banco, which must not exist in that case. It is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM183); Guía de llenado de nómina p. 43 |
| NOM184 | The check digit of the 18-digit CLABE is not correct. | error | Matriz de errores Nómina 1.2 (NOM184); Guía de llenado de nómina p. 43 |
| NOM185 | CuentaBancaria with 10, 11 or 16 digits (not a CLABE) has no Banco. With 15 digits it is only a warning, since the rule does not name that length. | errorwarning | Matriz de errores Nómina 1.2 (NOM185); Guía de llenado de nómina p. 44 |
| NOM186 | ClaveEntFed is not a valid Mexican state in c_Estado in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM186); Guía de llenado de nómina p. 45 |
| NOM188 | The sum of PorcentajeTiempo across the SubContratacion nodes is not 100. | error | Matriz de errores Nómina 1.2 (NOM188); Guía de llenado de nómina p. 48 |
| NOM189 | The sum of TotalSueldos, TotalSeparacionIndemnizacion and TotalJubilacionPensionRetiro does not equal TotalGravado plus TotalExento. | error | Matriz de errores Nómina 1.2 (NOM189); Guía de llenado de nómina p. 48 |
| NOM190 | TotalSueldos does not equal the sum of ImporteGravado plus ImporteExento of the earnings other than 022, 023, 025, 039 and 044. | error | Matriz de errores Nómina 1.2 (NOM190); Guía de llenado de nómina p. 49 |
| NOM191 | TotalSeparacionIndemnizacion does not equal the sum of ImporteGravado plus ImporteExento of earnings 022, 023 and 025. | error | Matriz de errores Nómina 1.2 (NOM191); Guía de llenado de nómina p. 49 |
| NOM192 | TotalJubilacionPensionRetiro does not equal the sum of ImporteGravado plus ImporteExento of earnings 039 and 044. | error | Matriz de errores Nómina 1.2 (NOM192); Guía de llenado de nómina p. 50 |
| NOM193 | TotalGravado does not equal the sum of the earnings' ImporteGravado. | error | Matriz de errores Nómina 1.2 (NOM193); Guía de llenado de nómina p. 50 |
| NOM194 | TotalExento does not equal the sum of the earnings' ImporteExento. | error | Matriz de errores Nómina 1.2 (NOM194); Guía de llenado de nómina p. 51 |
| NOM195 | The sum of ImporteGravado plus ImporteExento of an earning is zero or negative. The rule reads the sum of both amounts, not each one separately. | error | Matriz de errores Nómina 1.2 (NOM195); Guía de llenado de nómina p. 56 |
| NOM196 | TipoPercepcion is not a key of the c_TipoPercepcion catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM196); Guía de llenado de nómina pp. 52-53 |
| NOM197 | There are earnings other than 022, 023, 025, 039 and 044, but TotalSueldos is missing from Percepciones. | error | Matriz de errores Nómina 1.2 (NOM197); Guía de llenado de nómina p. 49 |
| NOM198 | The payslip has a 022, 023 or 025 earning and TotalSeparacionIndemnizacion or the SeparacionIndemnizacion node is missing. | error | Matriz de errores Nómina 1.2 (NOM198); Guía de llenado de nómina p. 53 |
| NOM199 | The payslip has a 039 or 044 earning and TotalJubilacionPensionRetiro or the JubilacionPensionRetiro node is missing. A retirement total or node with no 039 or 044 earning behind it is only a warning. | errorwarning | Matriz de errores Nómina 1.2 (NOM199); Guía de llenado de nómina p. 53 |
| NOM200 | With a 039 earning (retirement paid in one payment), the JubilacionPensionRetiro node lacks TotalUnaExhibicion or has TotalParcialidad or MontoDiario. If the payslip also has 044, it is not evaluated. | error | Matriz de errores Nómina 1.2 (NOM200); Guía de llenado de nómina p. 53 |
| NOM201 | With a 044 earning (retirement paid in installments), the JubilacionPensionRetiro node lacks TotalParcialidad and MontoDiario or has TotalUnaExhibicion. If the payslip also has 039, it is not evaluated. | error | Matriz de errores Nómina 1.2 (NOM201); Guía de llenado de nómina p. 53 |
| NOM202 | The AccionesOTitulos node is missing from earning 045 (income in shares or securities). | error | Matriz de errores Nómina 1.2 (NOM202); Guía de llenado de nómina p. 54 |
| NOM203 | An earning other than 045 has an AccionesOTitulos node, which only belongs to earning 045. | error | Matriz de errores Nómina 1.2 (NOM203); Guía de llenado de nómina p. 54 |
| NOM204 | The HorasExtra node is missing from earning 019 (overtime). | error | Matriz de errores Nómina 1.2 (NOM204); Guía de llenado de nómina p. 54 |
| NOM205 | An earning other than 019 has a HorasExtra node. According to the matrix it only belongs to earning 019, and the guide does not prohibit it, so it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM205); Guía de llenado de nómina p. 54 |
| NOM206 | Earning 014 (disability subsidies) has no Incapacidades node. | error | Matriz de errores Nómina 1.2 (NOM206); Guía de llenado de nómina p. 54 y 89 |
| NOM207 | The sum of the Incapacidad ImporteMonetario values does not equal ImporteGravado plus ImporteExento of the 014 earnings. It is not evaluated when 014 and 006 coexist on the same payslip, and it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM207); Guía de llenado de nómina p. 54 |
| NOM208 | HorasExtra@TipoHoras is not a key of the c_TipoHoras catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM208); Guía de llenado de nómina p. 58 |
| NOM209 | JubilacionPensionRetiro has TotalUnaExhibicion together with TotalParcialidad or MontoDiario, which are mutually exclusive payment forms. | error | Matriz de errores Nómina 1.2 (NOM209); Guía de llenado de nómina p. 59 |
| NOM210 | JubilacionPensionRetiro has TotalParcialidad without MontoDiario, or also has TotalUnaExhibicion. | error | Matriz de errores Nómina 1.2 (NOM210); Guía de llenado de nómina p. 60 |
| NOM211 | TotalImpuestosRetenidos is missing or does not equal the sum of the 002 (ISR) deductions. | error | Matriz de errores Nómina 1.2 (NOM211); Guía de llenado de nómina p. 66 |
| NOM212 | The Deducciones node has TotalImpuestosRetenidos, but there are no 002 (ISR) deductions. | error | Matriz de errores Nómina 1.2 (NOM212); Guía de llenado de nómina p. 66 |
| NOM213 | TipoDeduccion is not a key of the c_TipoDeduccion catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM213); Guía de llenado de nómina pp. 66-67 |
| NOM214 | Deduction 006 (disability discount) has no Incapacidades node. | error | Matriz de errores Nómina 1.2 (NOM214); Guía de llenado de nómina p. 67 y 89 |
| NOM215 | The Importe of deduction 006 does not equal the sum of the Incapacidad ImporteMonetario values. It is not evaluated when 014 and 006 coexist on the same payslip, and it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM215); Guía de llenado de nómina p. 69 |
| NOM216 | A deduction has an Importe equal to or less than zero. The matrix and the guide require more than zero, but the XSD accepts 0.00, so it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM216); Guía de llenado de nómina p. 69; el XSD admite 0.00 |
| NOM217 | TipoOtroPago is not a key of the c_TipoOtroPago catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM217); Guía de llenado de nómina p. 69 |
| NOM218 | OtroPago 004 (balance in favor compensation) has no CompensacionSaldosAFavor node. | error | Matriz de errores Nómina 1.2 (NOM218); Guía de llenado de nómina p. 73 |
| NOM219 | OtroPago 002 (employment subsidy) has no SubsidioAlEmpleo node. | error | Matriz de errores Nómina 1.2 (NOM219); Guía de llenado de nómina p. 73 |
| NOM220 | An OtroPago has an Importe equal to or less than zero. The XSD accepts it and an unpaid 002 is common, so it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM220); Guía de llenado de nómina p. 76 |
| NOM221 | SubsidioCausado is less than the OtroPago Importe: more subsidy was paid than was accrued. | error | Matriz de errores Nómina 1.2 (NOM221); Guía de llenado de nómina p. 77 |
| NOM222 | RemanenteSalFav is greater than SaldoAFavor in CompensacionSaldosAFavor. | error | Matriz de errores Nómina 1.2 (NOM222); Guía de llenado de nómina p. 77 |
| NOM223 | The CompensacionSaldosAFavor Año is not the year before FechaPago, nor the FechaPago year for a December pay period. It is checked against the payslip date, not today, and it is only a warning. | warning | Matriz de errores Nómina 1.2 (NOM223); Guía de llenado de nómina p. 78 |
| NOM224 | TipoIncapacidad is not a key of the c_TipoIncapacidad catalog in force on the CFDI date. | errorwarning | Matriz de errores Nómina 1.2 (NOM224); Guía de llenado de nómina p. 79 |
| NOMINA_ANTIGUEDAD_CERO | The Payroll Receptor's Antigüedad is P0W or P0D; the schema accepts it, but some PACs reject it. | warning | — |
| NOMINA_ANTIGUEDAD_FORMATO | The Payroll Receptor's Antigüedad doesn't follow the PnW or PnYnMnD format. | error | — |
| NOMINA_EXPORTACION | The payroll Comprobante Exportacion is not 01 (Not applicable). | error | Guía de llenado de nómina p. 10 (Exportacion se debe registrar 01) |
| NOMINA_INFORMACION_GLOBAL | The payroll Comprobante has an InformacionGlobal node, which must not exist. | error | Guía de llenado de nómina p. 12 (el nodo InformacionGlobal no debe existir) |
| NOMINA_INVALID_VERSION | The Payroll complement version is not 1.2. | error | — |
| NOMINA_METODO_PAGO | The payroll Comprobante MetodoPago is not PUE. If it is missing, it is only a warning. | errorwarning | Guía de llenado de nómina p. 10 (MetodoPago se debe registrar PUE) |
| NOMINA_MISSING_COMPLEMENT | Payroll type vouchers must include the Payroll complement. | error | — |
| NOMINA_MISSING_FECHAFINALPAGO | Missing required attribute 'FechaFinalPago' in the Payroll complement. | error | — |
| NOMINA_MISSING_FECHAINICIALPAGO | Missing required attribute 'FechaInicialPago' in the Payroll complement. | error | — |
| NOMINA_MISSING_FECHAPAGO | Missing required attribute 'FechaPago' in the Payroll complement. | error | — |
| NOMINA_MISSING_NUMDIASPAGADOS | Missing required attribute 'NumDiasPagados' in the Payroll complement. | error | — |
| NOMINA_MISSING_RECEPTOR | The Receptor node is missing from the Payroll complement. | error | — |
| NOMINA_MISSING_TIPONOMINA | Missing required attribute 'TipoNomina' in the Payroll complement. | error | — |
| NOMINA_OBJETO_IMP | The payroll Concepto ObjetoImp is not 01 (Not subject to tax). | error | Guía de llenado de nómina p. 19 (ObjetoImp se debe registrar 01) |
| NOMINA_RECEPTOR_MISSING_CLAVEENTFED | Missing required attribute 'ClaveEntFed' in the Nomina Receptor. | error | — |
| NOMINA_RECEPTOR_MISSING_CURP | Missing required attribute 'Curp' in the Nomina Receptor. | error | — |
| NOMINA_RECEPTOR_MISSING_NUMEMPLEADO | Missing required attribute 'NumEmpleado' in the Nomina Receptor. | error | — |
| NOMINA_RECEPTOR_MISSING_PERIODICIDADPAGO | Missing required attribute 'PeriodicidadPago' in the Nomina Receptor. | error | — |
| NOMINA_RECEPTOR_MISSING_TIPOCONTRATO | Missing required attribute 'TipoContrato' in the Nomina Receptor. | error | — |
| NOMINA_RECEPTOR_MISSING_TIPOREGIMEN | Missing required attribute 'TipoRegimen' in the Nomina Receptor. | error | — |
| NOMINA_REGISTRO_PATRONAL_RECIPROCO | Without RegistroPatronal in the Emisor, the Receptor has IMSS attributes the guide asks to omit. It is only a warning, since the guide requires it but the matrix does not. | warning | Guía de llenado de nómina p. 29 |
| NOMINA_TIPO_RELACION | CfdiRelacionados on a payroll Comprobante has a TipoRelacion other than 04 (substitution of earlier CFDI). | error | Guía de llenado de nómina p. 12 (TipoRelacion se debe registrar 04) |
| NOMINA_TOTAL_OTRAS_DEDUCCIONES | TotalOtrasDeducciones doesn't match the calculated sum of the deductions. | error | Guía de llenado de nómina p. 66 (TotalOtrasDeducciones = deducciones sin la clave 002); sin código NOM en la matriz |
Carta Porte 3.1
32 checks
| Code | What it checks | Severity |
|---|---|---|
| CP001_VERSION | The Carta Porte Complement version is not '3.1'. | error |
| CP002_DISTANCIA_CERO | Total distance traveled (TotalDistRec) is 0 or not set. | error |
| CP003_SIN_DESTINO | No Ubicación with TipoUbicacion='Destino' was found. | error |
| CP003_SIN_ORIGEN | No Ubicación with TipoUbicacion='Origen' was found. | error |
| CP004_DISTANCIA_DESTINO | Destination has no DistanciaRecorrida or it is 0. | error |
| CP005_SIN_MERCANCIA | The Mercancias node exists but contains no Mercancia. | error |
| CP005_SIN_MERCANCIAS | Carta Porte Complement is missing the Mercancias node. | error |
| CP006_PESO_BRUTO_CERO | Mercancia has PesoBruto as 0 or empty. This is one of the most frequent SAT rejection errors. | error |
| CP007_SIN_PERMISO_SCT | Missing SCT permit number (NumPermisoSCT) for road transport. | error |
| CP008_ANIO_INVALIDO | Vehicle model year is not valid. | error |
| CP008_SIN_PLACA | Missing vehicle license plate (PlacaVM). | error |
| CP009_SIN_SEGURO | Missing civil liability insurance data (AseguraRespCivil and PolizaRespCivil are required). | error |
| CP010_OPERADOR_SIN_RFC | The vehicle operator (TipoFigura='01') has no RFC. | error |
| CP010_RFC_OPERADOR_IGUAL_EMISOR | The vehicle operator's RFC is the same as the issuer's, unusual for transfers. | warning |
| CP010_SIN_FIGURA | Carta Porte Complement is missing the FiguraTransporte node. | error |
| CP010_SIN_TIPOS_FIGURA | FiguraTransporte node exists but contains no TiposFigura. | error |
| CP_CONFIG_VEH_INVALIDA | Vehicle configuration doesn't exist in the SAT catalog. | error |
| CP_DIST_SUMA | TotalDistRec doesn't match the sum of the destinations' DistanciaRecorrida. | warning |
| CP_EMBALAJE_INVALIDO | Packaging type doesn't exist in the SAT catalog. | error |
| CP_FIGURA_RFC_FORMATO | RFC of transport figure has invalid format. | error |
| CP_FIGURA_TIPO_INVALIDO | TipoFigura doesn't exist in the SAT catalog. | error |
| CP_MAT_CLAVE_INVALIDA | Hazardous material code doesn't exist in the SAT catalog. | error |
| CP_MAT_SIN_CLAVE | Mercancia indicates MaterialPeligroso='Sí' but has no CveMaterialPeligroso. | error |
| CP_MAT_SIN_EMBALAJE | Mercancia is hazardous material but has no Embalaje type. | warning |
| CP_OPERADOR_SIN_LICENCIA | Operator has no license number (NumLicencia). | warning |
| CP_PERM_INVALIDO | SCT permit type doesn't exist in the SAT catalog. | error |
| CP_PESO_TOTAL | PesoBrutoTotal doesn't match the sum of the goods' PesoBruto. | warning |
| CP_REMOLQUE_REQUERIDO | Vehicle configuration typically requires a trailer, but none was found. | warning |
| CP_REMOLQUE_SIN_PLACA | Trailer has no license plate. | error |
| CP_REMOLQUE_TIPO_INVALIDO | Trailer subtype doesn't exist in the SAT catalog. | error |
| CP_SEGURO_MAT_PELIGROSO | Hazardous material is being transported but environmental insurance data is missing (AseguraMedAmbiente and PolizaMedAmbiente). | error |
| CP_UBIC_CP_INVALIDO | Postal code of location doesn't exist in the SAT catalog. | error |
Foreign trade
31 checks
| Code | What it checks | Severity |
|---|---|---|
| CCE101 | The Commerce Exterior complement only applies to Ingreso (I), Egreso (E), or Traslado (T) type receipts. | error |
| CCE104 | Commerce Exterior complement requires Exportacion to be '02' (Definitive) or '03' (Temporary). | error |
| CCE120 | Incoterm does not exist in the SAT catalog. | error |
| CCE121 | Missing TipoCambioUSD. Must be the MXN/USD exchange rate per article 20 of the CFF. | warning |
| CCE122 | TotalUSD doesn't match the sum of the goods' ValorDolares. | error |
| CCE125 | The Issuer's country in the Commerce Exterior complement must be 'MEX'. | error |
| CCE126 | The Issuer's state is not valid for Mexico. | error |
| CCE127 | Municipality does not belong to state per the SAT catalog. | error |
| CCE129 | Missing the Colonia attribute in the Issuer's Domicilio for that postal code. | error |
| CCE130 | The postal code doesn't match the Issuer's state and municipality. | error |
| CCE133 | Tax Registration Number is required for foreign receivers (generic RFC XEXX010101000). | error |
| CCE136 | Missing the Colonia attribute in the Receiver's Domicilio for that postal code. | error |
| CCE138 | Municipality does not belong to state per the SAT catalog. | error |
| CCE139 | The Receiver's state is not valid for Mexico. | error |
| CCE141 | The postal code doesn't match the Receiver's state and municipality. | error |
| CCE143 | Tax Registration Number is required for foreign recipients. | error |
| CCE145 | Missing the Colonia attribute in the Destinatario's Domicilio for that postal code. | error |
| CCE147 | Municipality does not belong to state per the SAT catalog. | error |
| CCE148 | The Destinatario's state is not valid for Mexico. | error |
| CCE150 | The postal code doesn't match the Destinatario's state and municipality. | error |
| CCE151 | Concept is missing NoIdentificacion. It is required when using the Commerce Exterior complement. | error |
| CCE152 | Merchandise has NoIdentificacion that doesn't match any CFDI Concept. | error |
| CCE161 | Tariff fraction does not exist or is no longer valid in the SAT catalog. | error |
| CCE165 | Missing fields on a Mercancia: CantidadAduana, UnidadAduana and ValorUnitarioAduana must all be present together or not at all. | error |
| CCE167 | UnidadAduana doesn't match the tariff fraction's unit. | error |
| CCE168 | ValorUnitarioAduana must be greater than 0 when UnidadAduana is not '99' (Service). | error |
| CCE_CLAVE_PEDIMENTO | Customs entry key does not exist in the SAT catalog. | error |
| CCE_DESTINATARIO_PAIS | The Destinatario's country doesn't exist in the SAT catalog. | error |
| CCE_EMISOR_PAIS | The Issuer's country doesn't exist in the SAT catalog. | error |
| CCE_RECEPTOR_PAIS | The Receiver's country doesn't exist in the SAT catalog. | error |
| CCE_UNIDAD_ADUANA | UnidadAduana does not exist in the SAT catalog. | error |
Income Tax Law: deductibility and withholdings
13 checks
These are tax-legality findings: they don't change whether the CFDI is technically valid for the SAT, only whether the expense is deductible or the tax creditable.
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| LISR106_RETENCION_HONORARIOS | Missing the 10% ISR withholding on professional fees from an individual to a corporate taxpayer. | warning | LISR Art. 106, último párrafo |
| LISR106_RETENCION_HONORARIOS_TASA | The ISR withholding on professional fees has a rate other than the expected 10%. | warning | LISR Art. 106, último párrafo |
| LISR113J_RETENCION_RESICO | Missing the 1.25% ISR withholding when a corporate taxpayer pays an individual under RESICO. | warning | LISR Art. 113-J |
| LISR113J_RETENCION_RESICO_TASA | The ISR withholding to an individual under RESICO has a rate other than the expected 1.25%. | warning | LISR Art. 113-J |
| LISR116_RETENCION_ARRENDAMIENTO | Missing the 10% ISR withholding on leasing from an individual to a corporate taxpayer. | warning | LISR Art. 116 |
| LISR116_RETENCION_ARRENDAMIENTO_TASA | The ISR withholding on leasing has a rate other than the expected 10%. | warning | LISR Art. 116 |
| LISR151_I_EFECTIVO | Medical or hospital expense (UsoCFDI D01/D02) paid in cash: not a valid personal deduction. | warning | LISR Art. 151 fr. I |
| LISR27_III_COMBUSTIBLE_EFECTIVO | Vehicle fuel paid in cash: never deductible, regardless of the amount. | warning | LISR Art. 27 fr. III, 2º párr. |
| LISR27_III_EFECTIVO | The invoice was paid in cash above the legal threshold ($2,000 MXN): not deductible. | warning | LISR Art. 27 fr. III |
| LISR27_III_EFECTIVO_REP | A REP payment was received in cash above the legal threshold: the invoice it covers is not deductible. | warning | LISR Art. 27 fr. III |
| LISR28_XX_RESTAURANTE | Restaurant expense: only 8.5% is deductible, and none of it if paid in cash. | infowarning | LISR Art. 28 fr. XX |
| LISR36_II_AUTOMOVIL | A car's amount exceeds the LISR's per-unit deduction cap. | info | LISR Art. 36 fr. II |
| USO_S01_SIN_EFECTOS | The voucher declares UsoCFDI 'S01' (no tax effects): it cannot be deducted or credited. | info | Anexo 20, c_UsoCFDI |
VAT Law: credit and withholdings
9 checks
These are tax-legality findings: they don't change whether the CFDI is technically valid for the SAT, only whether the expense is deductible or the tax creditable.
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| LIVA1A_RETENCION_FLETES | Missing the 4% IVA withholding on a road freight service. | warning | LIVA Art. 1-A fr. II inciso c) |
| LIVA1A_RETENCION_FLETES_TASA | The IVA withholding on freight has a rate other than the expected 4%. | warning | LIVA Art. 1-A fr. II inciso c) |
| LIVA1A_RETENCION_IVA | Missing the two-thirds IVA withholding when a corporate taxpayer pays an individual subject to withholding (leasing, fees or RESICO). | warning | LIVA Art. 1-A fr. II inciso a); RLIVA Art. 3 |
| LIVA1A_RETENCION_IVA_TASA | The IVA withholding does not equal two-thirds of the transferred IVA. | warning | LIVA Art. 1-A fr. II inciso a); RLIVA Art. 3 |
| LIVA29_EXPORTACION_TASA | The voucher declares a definitive export but transferred IVA at 16% instead of the 0% rate. | warning | LIVA Art. 29 |
| LIVA2A_TASA_CERO_SERVICIO | A service transferred IVA at the 0% rate, an unusual case worth verifying with the issuer. | info | LIVA Art. 2-A |
| LIVA5_III_PPD | PPD invoice that transfers IVA: the IVA is only creditable once paid (with the corresponding REP). | info | LIVA Arts. 1-B y 5 fr. III |
| LIVA5_II_NO_DESGLOSADO | The IVA wasn't transferred expressly and separately: it isn't creditable. | warning | LIVA Art. 5 fr. II |
| LIVA_TASA_FRONTERA | The 8% border-region IVA rate was used without the address or product/service key appearing to qualify for the incentive. | warning | Decreto de estímulos fiscales región fronteriza |
Checks using your RFC and your other CFDIs
8 checks
These are tax-legality findings: they don't change whether the CFDI is technically valid for the SAT, only whether the expense is deductible or the tax creditable.
| Code | What it checks | Severity | Legal basis |
|---|---|---|---|
| CFDI_AJENO_AL_CONTRIBUYENTEAccount or API key | Neither the issuer nor the recipient is one of your registered RFCs. | warning | LISR Art. 27 fr. IV; CFF Art. 29-A |
| CFDI_CANCELADO_EN_SATAccount or API key | SAT has this voucher marked as cancelled: it has no tax effects. | warning | CFF Art. 29-A |
| ESTATUS_SAT_NO_VERIFICADOAccount or API key | This voucher's status has never been verified directly with SAT. | info | CFF Art. 29-A |
| LISR113E_RESICO_SIN_DEDUCCIONESAccount or API key | You're taxed under individuals' RESICO: this expense doesn't reduce your ISR (the regime allows no deductions). | info | LISR Art. 113-E |
| NC_IVA_MAYOR_QUE_ORIGINALAccount or API key | The credit note transfers more IVA than the original invoice it adjusts transferred. | warning | LIVA Art. 7 |
| PPD_RECIBIDO_SIN_PAGOAccount or API key | PPD invoice with no REP on record, or only partially paid: the tax effect only covers what's actually been paid. | infowarning | LIVA Arts. 1-B y 5 fr. III; LISR Art. 105 |
| REP_IVA_DESPROPORCIONADOAccount or API key | The IVA transferred in this REP isn't proportional to the payment against the original invoice. | warning | LIVA Art. 1-B |
| RETENCION_A_CARGO_DEL_CONTRIBUYENTEAccount or API key | As the corporate recipient, you were required to withhold and remit the tax this CFDI doesn't show. | warning | LISR Art. 27 fr. V; LIVA Art. 5 fr. IV |