[MX] Payment Invoice (Complemento de Pago)


Overview

A Payment Invoice in Mexico is a CFDI Complemento de Pago 2.0. Issue this document when a buyer pays a previously issued invoice — partially or in full.

FieldValue
invoice_typepayment
document_typepayment invoice
e_invoicetrue
currencyMXN

You only issue a Complemento de Pago for invoices originally issued with payment_method = PPD (deferred or split payment). If the original invoice was paid immediately (PUE), no payment complement is needed.


Payload Structure

The payload is organized in three levels. Following this order will match the Postman example:

  1. Root level — document metadata and aggregate totals
  2. relations[] — one entry per payment event (Payment Events)
  3. relations[].relations[] — one entry per original invoice settled in that payment (Invoices Paid)

Root Level Fields

Document Identifiers

FieldTypeRequiredDescription
supplier_company_idstringYesUUID of the issuing company in Brinta.
invoice_seriestringYesInvoice series (e.g. FE).
invoice_numberstringYesInvoice number.
invoice_datestringYesPayment date in YYYY-MM-DD format.
invoice_typestringYespayment
document_typestringYespayment invoice
currencystringYesMXN
exchange_ratenumberYes1 for MXN payments.
e_invoicebooleanYestrue
fiscal_statusstringYesSAT c_ObjetoImp code. See possible values in Invoice reasons.

buyer

The fiscal recipient of the original invoice. You can send company_id, company_external_id, or a full company object — only one of these.

buyer.company

FieldTypeRequiredDescription
namestringYesBuyer's name.
legal_namestringYesBuyer's legal name as registered with SAT.
typestringYesbusiness or person.
emailstringNoContact email of the buyer.
phonestringNoContact phone of the buyer.
external_idstringNoBuyer's ID in your own system.
regimestringNoFiscal regime of the buyer.

buyer.company.address

FieldTypeRequiredDescription
countrystringYesMX
postal_codestringYesBuyer's fiscal postal code registered with SAT.
address_line_1stringNoStreet and number.
address_line_2stringNoSuite, floor, or additional info.
neighborhoodstringNoNeighborhood (colonia).
citystringNoCity.
statestringNoState in ISO 3166-2 code (e.g. MX-CMX).

buyer.company.tax_registrations[]

FieldTypeRequiredDescription
typestringYesRFC
numberstringYesBuyer's RFC.
levelstringYescountry
locationstringYesMX
statusstringYesSAT fiscal regime (e.g. Regimen de Actividades Profesionales). Maps to c_RegimenFiscal.
activitystringNoBuyer's main registered activity.
authoritystringNoTax authority acronym (e.g. SAT).

amounts[]

Document-level total paid across all payment events in this CFDI. Always one entry.

FieldTypeRequiredDescription
amountnumberYesTotal amount received. Sum of all paid amount entries across all relations[].
namestringYestotal payment amount
typestringYespayment

taxes[]

Document-level tax totals, aggregated across all payment events. For values and examples, see the Postman example.

FieldTypeRequiredDescription
amountnumberYesTotal tax amount.
namestringYesTax label (e.g. total VAT).
typestringYesTax type (e.g. VAT).
taxable_amountnumberNoBase amount the rate applies to.
ratenumberNoTax rate (e.g. 0.16).
rate_typestringNopercentage
withholding_typestringNoUse withholding to mark this entry as withheld/retained. Omit for transferred taxes.

relations[] — Payment Events

relations[] is an array where each entry represents one real payment made by the buyer — for example, one bank transfer. A single payment event can settle more than one original invoice, which is represented in relations[].relations[].

FieldTypeRequiredDescription
invoice_typestringYespayment
document_typestringYespayment
currencystringYesCurrency of this payment event.
exchange_ratenumberYesExchange rate. 1 for MXN.

relations[].payment_method

Full payment method details for this payment event. Required when the payment involves a bank transfer.

FieldTypeRequiredDescription
typestringYesPayment form. Common values: bank transfer, cash, credit card, debit card, digital wallet.
namestringNoName of the payment method.
installmentintegerNoSAT NumParcialidad — installment number. Used at relations[].relations[] level, not here.

relations[].payment_method.bank_account_beneficiary

The account that receives the payment (your client's account or yours).

FieldTypeRequiredDescription
bank_namestringYesName of the beneficiary bank.
account_numberstringYesAccount number receiving the payment.
account_number_altstringNoCLABE or alias.
address.countrystringYesCountry of the bank in ISO 3166-1 alpha-2 (e.g. MX).

relations[].payment_method.bank_account_beneficiary.beneficiary.company

FieldTypeRequiredDescription
namestringYesName of the account holder.
legal_namestringNoLegal name of the account holder.
typestringYesbusiness or person.
address.countrystringYesMX
address.address_line_1stringNoStreet and number.
address.citystringNoCity.
address.statestringNoState in ISO 3166-2 code.
address.postal_codestringNoPostal code.
tax_registrations[].typestringYesRFC
tax_registrations[].numberstringYesAccount holder's RFC.
tax_registrations[].levelstringYescountry
tax_registrations[].locationstringYesMX

relations[].payment_method.bank_account_sender

The account that sends the payment (the buyer's account).

FieldTypeRequiredDescription
bank_namestringYesName of the sender's bank.
account_numberstringYesSender's account number.
address.countrystringYesCountry of the bank in ISO 3166-1 alpha-2.

relations[].payment_method.bank_account_sender.sender.company

FieldTypeRequiredDescription
namestringYesName of the account holder.
legal_namestringNoLegal name of the account holder.
typestringYesbusiness or person.
address.countrystringYesCountry code.
address.address_line_1stringNoStreet and number.
address.citystringNoCity.
address.statestringNoState in ISO 3166-2 code.
address.postal_codestringNoPostal code.
tax_registrations[].typestringYesTax ID type (e.g. RFC, NIT). Depends on sender's country.
tax_registrations[].numberstringYesTax ID number.
tax_registrations[].levelstringYescountry
tax_registrations[].locationstringYesCountry code of the sender.

relations[].amounts[]

Amount paid in this specific payment event. Always one entry.

FieldTypeRequiredDescription
amountnumberYesAmount paid in this event.
namestringYestotal payment amount
typestringYespayment

relations[].taxes[]

Taxes for this specific payment event. Same structure as root-level taxes[], but scoped to this payment. For values and examples, see the Postman example.

FieldTypeRequiredDescription
amountnumberYesTax amount.
namestringYesTax label (e.g. VAT).
typestringYesTax type (e.g. VAT).
taxable_amountnumberNoBase amount the rate applies to.
ratenumberNoTax rate (e.g. 0.16).
rate_typestringNopercentage
withholding_typestringNoUse withholding to mark this entry as withheld/retained.

relations[].relations[] — Invoices Paid

Each entry in relations[].relations[] represents one original invoice being settled by this payment event. A single payment can pay more than one invoice — add one entry per invoice.

FieldTypeRequiredDescription
invoice_typestringYesdebit
document_typestringYesinvoice
invoice_keystringYesFolio fiscal UUID of the original CFDI. This is the UUID assigned by SAT at the time of stamping — not the invoice number.
invoice_seriestringYesSeries of the original invoice.
invoice_numberstringYesNumber of the original invoice.
currencystringYesCurrency of the original invoice.
exchange_ratenumberYesExchange rate. 1 for MXN.

relations[].relations[].payment_method

FieldTypeRequiredDescription
installmentintegerYesSAT NumParcialidad — which installment this payment represents. Starts at 1. First payment = 1, second = 2, etc.
namestringNoName of the payment method.

relations[].relations[].amounts[]

Balance tracking for this original invoice. Always three entries:

nametypeDescription
previous balancebalanceAmount owed before this payment.
paid amountpaymentAmount being paid now toward this invoice.
remaining unpaid balancebalanceAmount still owed after this payment. Must be 0 if paid in full — do not omit.

relations[].relations[].taxes[]

Tax breakdown for this original invoice. Same structure as relations[].taxes[]. For values and examples, see the Postman example.


Example Payload

{
  "supplier_company_id": "43852d15-...",
  "invoice_number": "111122234",
  "invoice_serie": "FE",
  "invoice_type": "payment",
  "document_type": "payment invoice",
  "invoice_date": "2026-03-10",
  "currency": "MXN",
  "exchange_rate": 1,
  "e_invoice": true,
  "fiscal_status": "02",
  "buyer": {
    "company": {
      "name": "MARIA OLIVIA MARTINEZ SAGAZ",
      "legal_name": "MARIA OLIVIA MARTINEZ SAGAZ",
      "type": "person",
      "address": {
        "postal_code": "80290",
        "country": "MX"
      },
      "tax_registrations": [{
        "type": "RFC",
        "number": "MASO451221PM4",
        "level": "country",
        "location": "MX",
        "status": "Regimen de Actividades Profesionales"
      }]
    }
  },
  "amounts": [
    { "amount": 6240, "name": "total payment amount", "type": "payment" }
  ],
  "taxes": [
    {
      "amount": 640,
      "name": "total VAT",
      "withholding_type": "withholding",
      "type": "VAT"
    },
    {
      "taxable_amount": 4000,
      "amount": 640,
      "name": "total VAT",
      "rate": 0.16,
      "rate_type": "percentage",
      "type": "VAT"
    }
  ],
  "relations": [{
    "invoice_type": "payment",
    "document_type": "payment",
    "currency": "MXN",
    "exchange_rate": 1,
    "payment_method": {
      "type": "bank transfer",
      "bank_account_beneficiary": {
        "bank_name": "Banco de Mexico",
        "account_number": "3495593033",
        "account_number_alt": "alias_123",
        "address": { "country": "MX" },
        "beneficiary": {
          "company": {
            "name": "Bank Account Beneficiary",
            "type": "business",
            "address": { "country": "MX" },
            "tax_registrations": [{
              "type": "RFC",
              "level": "country",
              "location": "MX",
              "number": "HJO12345676"
            }]
          }
        }
      },
      "bank_account_sender": {
        "bank_name": "Test Bank Colombia",
        "account_number": "123456",
        "address": { "country": "CO" },
        "sender": {
          "company": {
            "name": "Bank Account Sender Company",
            "type": "business",
            "address": { "country": "CO" },
            "tax_registrations": [{
              "type": "NIT",
              "level": "country",
              "location": "CO",
              "number": "12345678-9"
            }]
          }
        }
      }
    },
    "amounts": [
      { "amount": 4680, "name": "total payment amount", "type": "payment" }
    ],
    "taxes": [
      {
        "taxable_amount": 3000,
        "amount": 480,
        "name": "VAT",
        "rate": 0.16,
        "rate_type": "percentage",
        "type": "VAT"
      },
      {
        "amount": 480,
        "name": "VAT",
        "withholding_type": "withholding",
        "type": "VAT"
      }
    ],
    "relations": [{
      "invoice_type": "debit",
      "document_type": "invoice",
      "currency": "MXN",
      "exchange_rate": 1,
      "invoice_key": "DD17F8F7-470C-53D6-BCE0-43CD5F12713E",
      "invoice_serie": "FE",
      "invoice_number": "123456112",
      "payment_method": { "installment": 1 },
      "amounts": [
        { "amount": 4680, "name": "previous balance", "type": "balance" },
        { "amount": 4680, "name": "paid amount", "type": "payment" },
        { "amount": 0, "name": "remaining unpaid balance", "type": "balance" }
      ],
      "taxes": [
        {
          "taxable_amount": 3000,
          "amount": 480,
          "name": "VAT",
          "rate": 0.16,
          "rate_type": "percentage",
          "type": "VAT"
        },
        {
          "taxable_amount": 3000,
          "amount": 480,
          "name": "VAT",
          "rate": 0.16,
          "rate_type": "percentage",
          "type": "VAT",
          "withholding_type": "withholding"
        }
      ]
    }]
  }]
}

Common Mistakes

MistakeWhat to do instead
payment_method at root levelpayment_method goes inside relations[], not at the root.
Forgetting root-level amounts[] and taxes[]These are required at document level even though the same fields also appear inside relations[].
invoice_key missing or wrongThis is the folio fiscal UUID assigned by SAT at stamping time — not the invoice number or Brinta ID.
installment starts at 0SAT NumParcialidad starts at 1. First payment = 1, second = 2, etc.
remaining unpaid balance missing on full paymentIf paying the full balance, this field must be 0 — not omitted.