Skip to main content

Overview

CFDI (Comprobante Fiscal Digital por Internet) is Mexico’s electronic invoicing system mandated by SAT. All business transactions in Mexico must be documented using CFDI invoices, which are digitally signed XML documents that can also have PDF representations.

What are CFDI Invoices?

CFDI invoices are the foundation of Mexico’s digital tax system. Every sale, purchase, service, or transfer of goods must be documented with a CFDI that:
  • Contains structured data in XML format
  • Is digitally signed by the issuer
  • Is validated and stamped by SAT
  • Includes unique fiscal identifiers (UUID)
Every CFDI contains essential fiscal information:
<cfdi:Comprobante>
  <cfdi:Emisor Rfc="GACJ841128A87" Nombre="Empresa Emisora"/>
  <cfdi:Receptor Rfc="XAXX010101000" Nombre="Receptor"/>
  <cfdi:Conceptos>
    <cfdi:Concepto Descripcion="Product/Service" Importe="1000.00"/>
  </cfdi:Conceptos>
  <cfdi:Impuestos TotalImpuestosTrasladados="160.00"/>
  <tfd:TimbreFiscalDigital UUID="12345678-1234-1234-1234-123456789012"/>
</cfdi:Comprobante>
CFDI invoices include multiple digital signatures:
  • Issuer Signature: Created by the issuer using their FIEL
  • SAT Stamp: Applied by SAT’s authorized providers (PAC)
  • UUID: Unique identifier assigned by SAT for each CFDI
CFDI invoices can be retrieved in multiple formats:
  • XML: Original structured data with all fiscal information
  • PDF: Human-readable representation for printing and sharing
  • Metadata: Extracted key fields for integration

CFDI Types and Use Cases

Invoice Directions

Inbound Invoices

Received by your company
  • Supplier invoices
  • Expense documentation
  • Accounts payable
  • Tax deductible expenses

Outbound Invoices

Issued by your company
  • Customer invoices
  • Revenue documentation
  • Accounts receivable
  • Tax obligations

Common CFDI Document Types

Type CodeDescriptionUse Case
IIngreso (Income)Sales invoices, service billing
EEgreso (Expense)Credit notes, refunds
TTraslado (Transfer)Goods movement, inventory transfers
PPago (Payment)Payment complements
NNómina (Payroll)Employee salary payments

Extracting CFDI Invoices

Basic Extraction Request

{
  "subject": {
    "identifier": "GACJ841128A87"
  },
  "credentials": {
    "SAT": {
      "type": "USERNAME_PASSWORD",
      "username": "GACJ841128A87",
      "password": "CIEC_PASSWORD"
    }
  },
  "options": {
    "informationType": "INVOICE",
    "direction": "INBOUND",
    "period": {
      "from": "2024-01-01",
      "to": "2024-01-31"
    }
  }
}

Advanced Filtering

{
  "filters": {
    "emitter": {
      "operator": "equals",
      "value": "ABC123456789"
    }
  }
}

CFDI Data Fields

Key Invoice Information

When you extract CFDI invoices, you get access to structured data including:
  • UUID: Unique fiscal identifier
  • Issue Date: When the invoice was created
  • Certification Date: When SAT validated the invoice
  • Total Amount: Invoice total including taxes
  • Currency: Usually MXN (Mexican Peso)
Issuer (Emisor):
  • RFC, business name, address
  • Tax regime information
Recipient (Receptor):
  • RFC, name, address
  • CFDI usage purpose
Each invoice contains detailed line items:
  • Product/service description
  • Quantity and unit price
  • Tax classifications
  • Discount information
Detailed tax breakdown:
  • VAT (IVA) calculations
  • Retention taxes
  • Other applicable taxes
  • Tax rates and amounts

Best Practices for CFDI Processing

Data Validation

Always validate CFDI invoices against SAT’s official schemas to ensure data integrity.
// Example validation check
function validateCFDI(cfdiData) {
  // Check required fields
  if (!cfdiData.uuid || !cfdiData.issueDate) {
    throw new Error('Missing required CFDI fields');
  }
  
  // Validate RFC format
  if (!isValidRFC(cfdiData.emitter.rfc)) {
    throw new Error('Invalid issuer RFC format');
  }
  
  // Check tax calculations
  if (!validateTaxCalculations(cfdiData.taxes)) {
    throw new Error('Tax calculation mismatch');
  }
}

Duplicate Detection

// Prevent duplicate processing using UUID
function isDuplicateCFDI(uuid, processedInvoices) {
  return processedInvoices.has(uuid);
}

// Track processed invoices
const processedInvoices = new Set();

invoices.forEach(invoice => {
  if (!isDuplicateCFDI(invoice.uuid, processedInvoices)) {
    processInvoice(invoice);
    processedInvoices.add(invoice.uuid);
  }
});

Storage Recommendations

Legal Requirement: Mexican law requires businesses to store CFDI invoices for at least 5 years in their original XML format.
  • Store both XML and PDF versions
  • Maintain original digital signatures
  • Implement backup and disaster recovery
  • Use secure, encrypted storage solutions

Integration Examples

Accounting System Integration

// Extract and process CFDI invoices for accounting
async function syncCFDIToAccounting(extractionId) {
  const status = await getExtractionStatus(extractionId);
  
  if (status.status === 'COMPLETED') {
    for (const doc of status.documents) {
      if (doc.type === 'INVOICE') {
        // Download XML for structured data
        const xmlData = await downloadDocument(extractionId, doc.id, 'XML');
        
        // Parse CFDI data
        const cfdiData = parseCFDI(xmlData);
        
        // Create accounting entry
        await createAccountingEntry({
          invoiceNumber: cfdiData.uuid,
          vendor: cfdiData.emitter.name,
          amount: cfdiData.total,
          taxAmount: cfdiData.taxes.total,
          date: cfdiData.issueDate,
          status: 'pending_payment'
        });
      }
    }
  }
}

Expense Management

// Process inbound invoices for expense tracking
async function processExpenseInvoices(invoices) {
  const expenses = invoices.map(invoice => ({
    id: invoice.uuid,
    vendor: invoice.emitter.name,
    amount: invoice.total,
    category: categorizeExpense(invoice.items),
    taxDeductible: isDeductible(invoice),
    approvalRequired: invoice.total > 5000
  }));
  
  await bulkCreateExpenseRecords(expenses);
}

Troubleshooting CFDI Issues

Common Problems

Symptoms: XML parsing errors, missing required fieldsSolutions:
  • Verify CFDI was properly issued by authorized PAC
  • Check for complete digital signatures
  • Validate against SAT’s official XSD schemas
Symptoms: Only XML available, no PDF formatSolutions:
  • Some CFDIs may not have PDF representations
  • Generate PDF from XML data if needed
  • Check with issuer for PDF availability
Symptoms: Timeouts, memory issues with large extractionsSolutions:
  • Process invoices in smaller date ranges
  • Implement pagination for large datasets
  • Use streaming processing for XML parsing

Next Steps