[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.
| Field | Value |
|---|---|
invoice_type | payment |
document_type | payment invoice |
e_invoice | true |
currency | MXN |
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:
- Root level — document metadata and aggregate totals
relations[]— one entry per payment event (Payment Events)relations[].relations[]— one entry per original invoice settled in that payment (Invoices Paid)
Root Level Fields
Document Identifiers
| Field | Type | Required | Description |
|---|---|---|---|
supplier_company_id | string | Yes | UUID of the issuing company in Brinta. |
invoice_serie | string | Yes | Invoice series (e.g. FE). |
invoice_number | string | Yes | Invoice number. |
invoice_date | string | Yes | Payment date in YYYY-MM-DD format. |
invoice_type | string | Yes | payment |
document_type | string | Yes | payment invoice |
currency | string | Yes | MXN |
exchange_rate | number | Yes | 1 for MXN payments. |
e_invoice | boolean | Yes | true |
fiscal_status | string | Yes | SAT 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
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Buyer's name. |
legal_name | string | Yes | Buyer's legal name as registered with SAT. |
type | string | Yes | business or person. |
email | string | No | Contact email of the buyer. |
phone | string | No | Contact phone of the buyer. |
external_id | string | No | Buyer's ID in your own system. |
regime | string | No | Fiscal regime of the buyer. |
buyer.company.address
| Field | Type | Required | Description |
|---|---|---|---|
country | string | Yes | MX |
postal_code | string | Yes | Buyer's fiscal postal code registered with SAT. |
address_line_1 | string | No | Street and number. |
address_line_2 | string | No | Suite, floor, or additional info. |
neighborhood | string | No | Neighborhood (colonia). |
city | string | No | City. |
state | string | No | State in ISO 3166-2 code (e.g. MX-CMX). |
buyer.company.tax_registrations[]
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | RFC |
number | string | Yes | Buyer's RFC. |
level | string | Yes | country |
location | string | Yes | MX |
status | string | Yes | SAT fiscal regime (e.g. Regimen de Actividades Profesionales). Maps to c_RegimenFiscal. |
activity | string | No | Buyer's main registered activity. |
authority | string | No | Tax authority acronym (e.g. SAT). |
amounts[]
Document-level total paid across all payment events in this CFDI. Always one entry.
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Total amount received. Sum of all paid amount entries across all relations[]. |
name | string | Yes | total payment amount |
type | string | Yes | payment |
taxes[]
Document-level tax totals, aggregated across all payment events. For values and examples, see the Postman example.
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Total tax amount. |
name | string | Yes | Tax label (e.g. total VAT). |
type | string | Yes | Tax type (e.g. VAT). |
taxable_amount | number | No | Base amount the rate applies to. |
rate | number | No | Tax rate (e.g. 0.16). |
rate_type | string | No | percentage |
withholding_type | string | No | Use 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[].
| Field | Type | Required | Description |
|---|---|---|---|
invoice_type | string | Yes | payment |
document_type | string | Yes | payment |
currency | string | Yes | Currency of this payment event. |
exchange_rate | number | Yes | Exchange rate. 1 for MXN. |
relations[].payment_method
Full payment method details for this payment event. Required when the payment involves a bank transfer.
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Payment form. Common values: bank transfer, cash, credit card, debit card, digital wallet. |
name | string | No | Name of the payment method. |
installment | integer | No | SAT 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).
| Field | Type | Required | Description |
|---|---|---|---|
bank_name | string | Yes | Name of the beneficiary bank. |
account_number | string | Yes | Account number receiving the payment. |
account_number_alt | string | No | CLABE or alias. |
address.country | string | Yes | Country of the bank in ISO 3166-1 alpha-2 (e.g. MX). |
relations[].payment_method.bank_account_beneficiary.beneficiary.company
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name of the account holder. |
legal_name | string | No | Legal name of the account holder. |
type | string | Yes | business or person. |
address.country | string | Yes | MX |
address.address_line_1 | string | No | Street and number. |
address.city | string | No | City. |
address.state | string | No | State in ISO 3166-2 code. |
address.postal_code | string | No | Postal code. |
tax_registrations[].type | string | Yes | RFC |
tax_registrations[].number | string | Yes | Account holder's RFC. |
tax_registrations[].level | string | Yes | country |
tax_registrations[].location | string | Yes | MX |
relations[].payment_method.bank_account_sender
The account that sends the payment (the buyer's account).
| Field | Type | Required | Description |
|---|---|---|---|
bank_name | string | Yes | Name of the sender's bank. |
account_number | string | Yes | Sender's account number. |
address.country | string | Yes | Country of the bank in ISO 3166-1 alpha-2. |
relations[].payment_method.bank_account_sender.sender.company
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Name of the account holder. |
legal_name | string | No | Legal name of the account holder. |
type | string | Yes | business or person. |
address.country | string | Yes | Country code. |
address.address_line_1 | string | No | Street and number. |
address.city | string | No | City. |
address.state | string | No | State in ISO 3166-2 code. |
address.postal_code | string | No | Postal code. |
tax_registrations[].type | string | Yes | Tax ID type (e.g. RFC, NIT). Depends on sender's country. |
tax_registrations[].number | string | Yes | Tax ID number. |
tax_registrations[].level | string | Yes | country |
tax_registrations[].location | string | Yes | Country code of the sender. |
relations[].amounts[]
Amount paid in this specific payment event. Always one entry.
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Amount paid in this event. |
name | string | Yes | total payment amount |
type | string | Yes | payment |
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.
| Field | Type | Required | Description |
|---|---|---|---|
amount | number | Yes | Tax amount. |
name | string | Yes | Tax label (e.g. VAT). |
type | string | Yes | Tax type (e.g. VAT). |
taxable_amount | number | No | Base amount the rate applies to. |
rate | number | No | Tax rate (e.g. 0.16). |
rate_type | string | No | percentage |
withholding_type | string | No | Use 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.
| Field | Type | Required | Description |
|---|---|---|---|
invoice_type | string | Yes | debit |
document_type | string | Yes | invoice |
invoice_key | string | Yes | Folio fiscal UUID of the original CFDI. This is the UUID assigned by SAT at the time of stamping — not the invoice number. |
invoice_serie | string | Yes | Series of the original invoice. |
invoice_number | string | Yes | Number of the original invoice. |
currency | string | Yes | Currency of the original invoice. |
exchange_rate | number | Yes | Exchange rate. 1 for MXN. |
relations[].relations[].payment_method
| Field | Type | Required | Description |
|---|---|---|---|
installment | integer | Yes | SAT NumParcialidad — which installment this payment represents. Starts at 1. First payment = 1, second = 2, etc. |
name | string | No | Name of the payment method. |
relations[].relations[].amounts[]
Balance tracking for this original invoice. Always three entries:
name | type | Description |
|---|---|---|
previous balance | balance | Amount owed before this payment. |
paid amount | payment | Amount being paid now toward this invoice. |
remaining unpaid balance | balance | Amount 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
| Mistake | What to do instead |
|---|---|
payment_method at root level | payment_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 wrong | This is the folio fiscal UUID assigned by SAT at stamping time — not the invoice number or Brinta ID. |
installment starts at 0 | SAT NumParcialidad starts at 1. First payment = 1, second = 2, etc. |
remaining unpaid balance missing on full payment | If paying the full balance, this field must be 0 — not omitted. |
Updated 12 days ago
