Regalías y licencias
Empresas que pagan por el uso de marcas, patentes o software a residentes en el extranjero.
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
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.
Qué datos lleva
Beneficiario efectivo
EsBenefEfectDelCobroUn campo (SI o NO) que determina qué datos de quien cobra se capturan.
País de residencia
PaisDeResidParaEfecFiscDónde reside quien cobra, para efectos fiscales.
Concepto del pago
ConceptoPagoLa clasificación del pago según el tipo de contribuyente.
Descripción del concepto
DescripcionConceptoUn 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
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).
Ejemplo de CFDI
emitido para quien cobra
Para developers
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.
$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
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
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.
Dudas
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
Empresas que distribuyen utilidades
Reparto de dividendos o utilidades a personas físicas o morales. Corresponde a la clave 14 de retención.
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.
Rifas, sorteos y concursos
Captura entidad federativa, monto gravado y exento. Corresponde a la clave 20 de retención.
Bancos, fintechs y casas de bolsa
Interés nominal, real y pérdida. Corresponde a la clave 16 de retención.
Solo para API
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.