CFDI por pagos al extranjero

CFDI de Retenciones con el complemento de Pagos a extranjeros

El complemento Pagos a extranjeros se agrega al CFDI de Retenciones e Información de Pagos cuando le pagas a una persona o empresa residente fuera de México y retienes impuestos por un ingreso con fuente de riqueza en territorio nacional. Se timbra con la clave de retención 18 (Pagos realizados a favor de residentes en el extranjero) e informa el país de residencia de quien cobra y el concepto del pago.

Quién lo emite

Quién debe emitirel complemento de Pagos a extranjeros

Regalías y licencias

Empresas que pagan por el uso de marcas, patentes o software a residentes en el extranjero.

Servicios y asistencia técnica

Quien contrata servicios o asesoría técnica con una persona o empresa del extranjero.

Artistas y deportistas

Organizadores que pagan a artistas o deportistas residentes en el extranjero.

Bahía con edificios frente al mar, un barco remolcador y palmeras

Qué datos lleva

Qué datos llevael complemento de Pagos a extranjeros

  1. Beneficiario efectivo

    EsBenefEfectDelCobro

    Un campo (SI o NO) que determina qué datos de quien cobra se capturan.

  2. País de residencia

    PaisDeResidParaEfecFisc

    Dónde reside quien cobra, para efectos fiscales.

  3. Concepto del pago

    ConceptoPago

    La clasificación del pago según el tipo de contribuyente.

  4. Descripción del concepto

    DescripcionConcepto

    Un texto que explica el pago.

El receptor se captura como extranjero en el formulario: lleva su nombre y, si lo tiene, su número de registro de identificación fiscal, en lugar de RFC y CURP. En las facturas a extranjeros se usa el RFC genérico; en el CFDI de retenciones, no.

¿Resides en el extranjero y te pagan desde México? No emites este CFDI: lo emite la empresa mexicana que te paga y retiene.

Ejemplo

Ejemplo de CFDIpor pagos al extranjero

Una empresa mexicana paga por una licencia de software a una compañía con residencia en otro país. En Facturama captura al receptor como extranjero, elige la clave 18, indica el país de residencia, el concepto y una descripción del pago, y registra la retención que haya determinado.

Como le paga directamente a la compañía extranjera, el campo de beneficiario efectivo va en NO y se llenan país, concepto y descripción. La tasa depende del tipo de pago y de si hay un tratado para evitar la doble tributación (Título V de la LISR).

Formulario de Nueva Retención en Facturama con la clave 18, Pagos realizados a favor de residentes en el extranjero
Facturama

Ejemplo de CFDI
emitido para quien cobra


Receptor
Empresa residente en el extranjero
Clave de retención
18 - Pagos realizados a favor de residentes en el extranjero
Complemento
Pagos a extranjeros
Impuestos retenidos
Según concepto y tratado aplicable
Resultado
CFDI con UUID para quien cobra

Para developers

Emisión por API del complemento de Pagos a extranjeros

Si ya tienes tu propio sistema o ERP, puedes timbrar el CFDI de retenciones por pagos al extranjero directamente desde tu software con la API de CFDI de retenciones de Facturama.

Ver documentación API
POSThttps://apisandbox.facturama.mx/2/retenciones
$usuario  = 'TU_USUARIO_API';
$password = 'TU_PASSWORD_API';

$payload = [
    'CveRetenc' => '18',
    'FechaExp' => '2026-10-01T12:44:09',
    'DescRetenc' => 'No aplica',
    'LugarExpRetenc' => '42501',
    'Folio' => null,
    'Emisor' => [
        'RfcEmisor' => 'EKU9003173C9',
        'NomDenRazSocE' => 'ESCUELA KEMPER URGATE',
        'RegimenFiscalE' => '601',
    ],
    'Receptor' => [
        'Nacionalidad' => 'Extranjero',
        'Extranjero' => [
            'NumRegIdTrib' => '998877665',
            'NomDenRazSocR' => 'SOFTWARE GLOBAL LLC',
        ],
    ],
    'Periodo' => [
        'MesIni' => 1,
        'MesFin' => 1,
        'Ejerc' => 2026,
    ],
    'Totales' => [
        'MontoTotOperacion' => 200,
        'MontoTotGrav' => 200,
        'MontoTotExent' => 0,
        'MontoTotRet' => 10,
        'ImpRetenidos' => [
            [
                'BaseRet' => 200,
                'Impuesto' => '01',
                'MontoRet' => 10,
                'TipoPagoRet' => '03',
            ],
        ],
    ],
    'Complemento' => [
        'PagosAExtranjeros' => [
            'Version' => '1.0',
            'EsBenefEfectDelCobro' => 'NO',
            'NoBeneficiario' => [
                'PaisDeResidParaEfecFisc' => 'US',
                'ConceptoPago' => 'Item1',
                'DescripcionConcepto' => 'Licencia de uso de software',
            ],
        ],
    ],
];

$ch = curl_init('https://apisandbox.facturama.mx/2/retenciones');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERPWD, "$usuario:$password");
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$respuesta = curl_exec($ch);
curl_close($ch);

echo $respuesta;
const usuario  = 'TU_USUARIO_API';
const password = 'TU_PASSWORD_API';

const payload = {
  CveRetenc: '18',
  FechaExp: '2026-10-01T12:44:09',
  DescRetenc: 'No aplica',
  LugarExpRetenc: '42501',
  Folio: null,
  Emisor: {
    RfcEmisor: 'EKU9003173C9',
    NomDenRazSocE: 'ESCUELA KEMPER URGATE',
    RegimenFiscalE: '601',
  },
  Receptor: {
    Nacionalidad: 'Extranjero',
    Extranjero: {
      NumRegIdTrib: '998877665',
      NomDenRazSocR: 'SOFTWARE GLOBAL LLC',
    },
  },
  Periodo: {
    MesIni: 1,
    MesFin: 1,
    Ejerc: 2026,
  },
  Totales: {
    MontoTotOperacion: 200,
    MontoTotGrav: 200,
    MontoTotExent: 0,
    MontoTotRet: 10,
    ImpRetenidos: [
      {
        BaseRet: 200,
        Impuesto: '01',
        MontoRet: 10,
        TipoPagoRet: '03',
      },
    ],
  },
  Complemento: {
    PagosAExtranjeros: {
      Version: '1.0',
      EsBenefEfectDelCobro: 'NO',
      NoBeneficiario: {
        PaisDeResidParaEfecFisc: 'US',
        ConceptoPago: 'Item1',
        DescripcionConcepto: 'Licencia de uso de software',
      },
    },
  },
};

fetch('https://apisandbox.facturama.mx/2/retenciones', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'Basic ' + btoa(`${usuario}:${password}`),
  },
  body: JSON.stringify(payload),
})
  .then((res) => res.json())
  .then((data) => console.log(data.Complemento.TimbreFiscalDigital.UUID));
import requests
from requests.auth import HTTPBasicAuth

usuario  = 'TU_USUARIO_API'
password = 'TU_PASSWORD_API'

payload = {
    'CveRetenc': '18',
    'FechaExp': '2026-10-01T12:44:09',
    'DescRetenc': 'No aplica',
    'LugarExpRetenc': '42501',
    'Folio': None,
    'Emisor': {
        'RfcEmisor': 'EKU9003173C9',
        'NomDenRazSocE': 'ESCUELA KEMPER URGATE',
        'RegimenFiscalE': '601',
    },
    'Receptor': {
        'Nacionalidad': 'Extranjero',
        'Extranjero': {
            'NumRegIdTrib': '998877665',
            'NomDenRazSocR': 'SOFTWARE GLOBAL LLC',
        },
    },
    'Periodo': {
        'MesIni': 1,
        'MesFin': 1,
        'Ejerc': 2026,
    },
    'Totales': {
        'MontoTotOperacion': 200,
        'MontoTotGrav': 200,
        'MontoTotExent': 0,
        'MontoTotRet': 10,
        'ImpRetenidos': [
            {
                'BaseRet': 200,
                'Impuesto': '01',
                'MontoRet': 10,
                'TipoPagoRet': '03',
            },
        ],
    },
    'Complemento': {
        'PagosAExtranjeros': {
            'Version': '1.0',
            'EsBenefEfectDelCobro': 'NO',
            'NoBeneficiario': {
                'PaisDeResidParaEfecFisc': 'US',
                'ConceptoPago': 'Item1',
                'DescripcionConcepto': 'Licencia de uso de software',
            },
        },
    },
}

respuesta = requests.post(
    'https://apisandbox.facturama.mx/2/retenciones',
    json=payload,
    auth=HTTPBasicAuth(usuario, password),
)

print(respuesta.json())
String usuario  = "TU_USUARIO_API";
String password = "TU_PASSWORD_API";
String credenciales = Base64.getEncoder()
    .encodeToString((usuario + ":" + password).getBytes());

String payload = """
      {
        "CveRetenc": "18",
        "FechaExp": "2026-10-01T12:44:09",
        "DescRetenc": "No aplica",
        "LugarExpRetenc": "42501",
        "Folio": null,
        "Emisor": {
          "RfcEmisor": "EKU9003173C9",
          "NomDenRazSocE": "ESCUELA KEMPER URGATE",
          "RegimenFiscalE": "601"
        },
        "Receptor": {
          "Nacionalidad": "Extranjero",
          "Extranjero": {
            "NumRegIdTrib": "998877665",
            "NomDenRazSocR": "SOFTWARE GLOBAL LLC"
          }
        },
        "Periodo": {
          "MesIni": 1,
          "MesFin": 1,
          "Ejerc": 2026
        },
        "Totales": {
          "MontoTotOperacion": 200,
          "MontoTotGrav": 200,
          "MontoTotExent": 0,
          "MontoTotRet": 10,
          "ImpRetenidos": [
            {
              "BaseRet": 200,
              "Impuesto": "01",
              "MontoRet": 10,
              "TipoPagoRet": "03"
            }
          ]
        },
        "Complemento": {
          "PagosAExtranjeros": {
            "Version": "1.0",
            "EsBenefEfectDelCobro": "NO",
            "NoBeneficiario": {
              "PaisDeResidParaEfecFisc": "US",
              "ConceptoPago": "Item1",
              "DescripcionConcepto": "Licencia de uso de software"
            }
          }
        }
      }
    """;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://apisandbox.facturama.mx/2/retenciones"))
    .header("Content-Type", "application/json")
    .header("Authorization", "Basic " + credenciales)
    .POST(HttpRequest.BodyPublishers.ofString(payload))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
var usuario  = "TU_USUARIO_API";
var password = "TU_PASSWORD_API";

var payload = new
{
    CveRetenc = "18",
    FechaExp = "2026-10-01T12:44:09",
    DescRetenc = "No aplica",
    LugarExpRetenc = "42501",
    Folio = (string?)null,
    Emisor = new
    {
        RfcEmisor = "EKU9003173C9",
        NomDenRazSocE = "ESCUELA KEMPER URGATE",
        RegimenFiscalE = "601",
    },
    Receptor = new
    {
        Nacionalidad = "Extranjero",
        Extranjero = new
        {
            NumRegIdTrib = "998877665",
            NomDenRazSocR = "SOFTWARE GLOBAL LLC",
        },
    },
    Periodo = new
    {
        MesIni = 1,
        MesFin = 1,
        Ejerc = 2026,
    },
    Totales = new
    {
        MontoTotOperacion = 200,
        MontoTotGrav = 200,
        MontoTotExent = 0,
        MontoTotRet = 10,
        ImpRetenidos = new[]
        {
            new
            {
                BaseRet = 200,
                Impuesto = "01",
                MontoRet = 10,
                TipoPagoRet = "03",
            },
        },
    },
    Complemento = new
    {
        PagosAExtranjeros = new
        {
            Version = "1.0",
            EsBenefEfectDelCobro = "NO",
            NoBeneficiario = new
            {
                PaisDeResidParaEfecFisc = "US",
                ConceptoPago = "Item1",
                DescripcionConcepto = "Licencia de uso de software",
            },
        },
    },
};

using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(Encoding.UTF8.GetBytes($"{usuario}:{password}")));

var response = await client.PostAsJsonAsync("https://apisandbox.facturama.mx/2/retenciones", payload);
Console.WriteLine(await response.Content.ReadAsStringAsync());
require 'net/http'
require 'json'
require 'uri'

usuario  = 'TU_USUARIO_API'
password = 'TU_PASSWORD_API'

payload = {
  CveRetenc: '18',
  FechaExp: '2026-10-01T12:44:09',
  DescRetenc: 'No aplica',
  LugarExpRetenc: '42501',
  Folio: nil,
  Emisor: {
    RfcEmisor: 'EKU9003173C9',
    NomDenRazSocE: 'ESCUELA KEMPER URGATE',
    RegimenFiscalE: '601',
  },
  Receptor: {
    Nacionalidad: 'Extranjero',
    Extranjero: {
      NumRegIdTrib: '998877665',
      NomDenRazSocR: 'SOFTWARE GLOBAL LLC',
    },
  },
  Periodo: {
    MesIni: 1,
    MesFin: 1,
    Ejerc: 2026,
  },
  Totales: {
    MontoTotOperacion: 200,
    MontoTotGrav: 200,
    MontoTotExent: 0,
    MontoTotRet: 10,
    ImpRetenidos: [
      {
        BaseRet: 200,
        Impuesto: '01',
        MontoRet: 10,
        TipoPagoRet: '03',
      },
    ],
  },
  Complemento: {
    PagosAExtranjeros: {
      Version: '1.0',
      EsBenefEfectDelCobro: 'NO',
      NoBeneficiario: {
        PaisDeResidParaEfecFisc: 'US',
        ConceptoPago: 'Item1',
        DescripcionConcepto: 'Licencia de uso de software',
      },
    },
  },
}

uri  = URI.parse('https://apisandbox.facturama.mx/2/retenciones')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri, { 'Content-Type' => 'application/json' })
request.basic_auth(usuario, password)
request.body = payload.to_json

puts http.request(request).body

Antes de timbrar

Errores frecuentes con el complemento de Pagos a extranjeros

ERROR 01

Dejar el receptor como nacional

Causa

Con el receptor como nacional, el formulario pide RFC y el comprobante no refleja un pago al extranjero.

Solución

Cambia el receptor a Extranjero antes de llenar el complemento.

ERROR 02

Aplicar un tratado sin acreditar la residencia

Causa

Un tratado puede cambiar la retención, pero solo si el residente acredita su residencia.

Solución

Confirma con tu contador si aplica antes de timbrar.

ERROR 03

Confundir el concepto con su descripción

Causa

El concepto clasifica el pago y la descripción lo explica; el complemento pide ambos.

Solución

Llena los dos campos.

Precio

Precio del complemento de Pagos a extranjeros

El módulo se contrata una vez y desbloquea los complementos disponibles. Funciona distinto a los complementos individuales: esto es lo que cambia.

Módulo de Retenciones

$1,650 MXN / año

IVA incluido · vigencia de 12 meses a partir de la compra

Cuando uses los 25 folios incluidos, los que timbres se descuentan de tu suscripción principal.

Contratar ahora

Dudas

Preguntas frecuentes sobre el complemento de Pagos a extranjeros

La 18, Pagos realizados a favor de residentes en el extranjero, del catálogo c_CveRetenc del SAT. Sobre esa clave se agrega el complemento Pagos a extranjeros.

Depende del tipo de ingreso: el Título V de la Ley del ISR (artículos 153 y siguientes) fija tasas distintas para regalías, servicios, intereses o arrendamiento, y los tratados para evitar la doble tributación pueden reducirlas si el beneficiario acredita su residencia (artículo 4). El complemento no calcula la tasa: documenta la retención que determinaste con tu contador.

No. En el CFDI de Retenciones el residente en el extranjero se identifica con su nombre o razón social y, si lo tiene, con su número de registro de identificación fiscal.

El SAT lo define como si el beneficiario del pago es la misma persona que retiene. En la práctica va en NO cuando le pagas directamente al residente en el extranjero, y se llenan su país de residencia, el tipo de contribuyente y la descripción del pago. Va en SI cuando el cobro se hace a través de un representante en México, y se capturan su RFC, CURP y nombre, además del concepto y la descripción del pago.

Cambia el receptor a Extranjero: el formulario sustituye RFC, CURP y código postal por el nombre y el número de registro de identificación fiscal del extranjero.

Va incluido en el Módulo de Retenciones: $1,650 MXN al año (IVA incluido), sin cobro adicional por complemento, e incluye 25 folios para timbrar. Cuando los uses, los folios se descuentan de tu plan de Facturación, que debe estar activo. Puedes probarlo antes en el sandbox de Facturama, que no tiene costo ni validez fiscal.

Sí. Cuando una persona moral paga honorarios o arrendamiento a una persona física, el CFDI de ingresos de esta, con la retención desglosada, puede servir como constancia de retención; esa facilidad no aplica a los pagos a residentes en el extranjero: quien paga y retiene sigue emitiendo el CFDI de Retenciones.

Incluidos en el mismo módulo

Otros complementos del CFDI de retenciones

Enajenación de acciones

Casas de bolsa e intermediarios bursátiles

Retenciones derivadas de la compraventa o enajenación de títulos accionarios. Corresponde a las claves 06 y 19 de retención.

Ver complemento

Premios

Rifas, sorteos y concursos

Captura entidad federativa, monto gravado y exento. Corresponde a la clave 20 de retención.

Ver complemento

Intereses

Bancos, fintechs y casas de bolsa

Interés nominal, real y pérdida. Corresponde a la clave 16 de retención.

Ver complemento

Solo para API

Plataformas tecnológicas

Marketplaces y apps que integran por API

Retenciones de ISR e IVA a quienes prestan servicios o venden a través de tu plataforma. Corresponde a la clave 26 de retención.

Ver complemento