Emite tu CFDI de Retenciones
e Información de Pagos
El CFDI de Retenciones e Información de Pagos es el comprobante fiscal del Anexo 20 con el que documentas los impuestos que retienes al pagarle a alguien —ISR, IVA o ambos— y los pagos que debes informar al SAT. No ampara una venta ni un gasto: sustituye a las antiguas constancias de retención en papel y su versión vigente es la 2.0.
Con Facturama lo timbras en minutos, sin instalar nada: contratas el Módulo de Retenciones y quedas cubierto para los tipos de retención y complementos disponibles, sin pagar por separado cada uno.
¿Qué es el CFDI de
Retenciones e Información de Pagos?
Es uno de los comprobantes fiscales del Anexo 20 de la Resolución Miscelánea Fiscal, y es distinto de las facturas de Ingresos, Egresos, Pago, Traslado o Nómina: no ampara una venta ni un gasto, sino que documenta una retención o un pago informado.
Un comprobante por cada retención
Se debe expedir un comprobante por cada tipo de retención; solo si es la misma operación se pueden incorporar varios nodos de impuestos retenidos en un mismo documento.
No sustituye a la nómina
No sustituye a la factura de nómina: los sueldos y salarios se documentan aparte.
Se puede emitir una vez al año
Conforme a la regla 2.7.5.4 de la RMF, puede emitirse de forma anualizada en enero del año siguiente a la retención o el pago y no necesariamente al momento de cada transacción.
Quién está obligado
a emitir un CFDI de retenciones
Retenciones de ISR e IVA a personas físicas
Personas morales que pagan honorarios profesionales o arrendamiento suelen tener la obligación de retener ISR e IVA. Desde 2022, en la mayoría de estos casos la retención puede declararse en el propio recibo de honorarios o de arrendamiento, así que el CFDI de Retenciones independiente sigue siendo obligatorio solo para los tipos de operación sin esa facilidad.
Pagos a residentes en el extranjero
Empresas que pagan regalías, servicios o cualquier otro concepto a personas físicas o morales residentes fuera de México.
Dividendos, intereses y enajenación de acciones
Personas morales que distribuyen dividendos o utilidades, instituciones del sistema financiero que pagan intereses, e intermediarios en la compraventa de acciones.
Cómo emitir un CFDI de retenciones
en Facturama paso a paso
Contrata el Módulo de Retenciones
Inicia sesión en tu cuenta de Facturama y contrata el Módulo desde Comprar, en la categoría Retenciones.
Elige Crear Retención
Ingresa la información con los datos y complementos necesarios para la retención que vas a timbrar.
Revisa y timbra
El comprobante queda disponible para descarga y consulta en tu cuenta, con folio fiscal UUID, igual que cualquier CFDI.
¿Necesitas calcular antes cuánto tienes que retener de ISR e IVA? Usa la calculadora de retenciones, gratuita y sin registro.
Así se ven las retenciones
dentro de Facturama
El módulo vive en el mismo lugar donde ya facturas: Crear · Nueva retención. Cambias el tipo de complemento y el formulario se adapta.
Premios, con la entidad y los montos en una sola pantalla
Eliges el complemento Premios y capturas entidad federativa, monto total del pago, monto gravado y monto exento. Los totales del comprobante se calculan mientras escribes.
Receptores nacionales y residentes en el extranjero
Cambia la nacionalidad del receptor y el formulario pide lo que corresponde: número de registro de identidad fiscal para el extranjero, CURP para personas físicas nacionales.
Intereses del sistema financiero, sin hojas de cálculo
Indicas si provienen del sistema financiero, si se retiraron en el periodo y si son de operaciones financieras derivadas; luego capturas interés nominal, interés real y pérdida.
La retención base, en un formulario que ya conoces
Emisor, receptor, clave de retención, periodo, totales e impuestos retenidos. Timbras en CFDI de Retenciones 2.0 y guardas el comprobante junto a tus facturas.
Emisión por API
para integrar retenciones en tu sistema
Si ya tienes tu propio sistema de administración o ERP, puedes timbrar el CFDI de Retenciones
directamente desde tu software con la API de Facturama: un POST con el JSON del
comprobante y te regresa el UUID timbrado. Autenticación HTTP Basic, sin OAuth.
El detalle completo de la integración —campos obligatorios, ciclo de vida del comprobante y SDKs en seis lenguajes— está en la página de la API de CFDI de retenciones.
Ver documentación API$usuario = 'TU_USUARIO_API';
$password = 'TU_PASSWORD_API';
$payload = [
'FolioInt' => '0001',
'FechaExp' => '2026-08-10T08:08:01',
'CveRetenc' => '01',
'LugarExpRetenc' => '26015',
'Emisor' => [
'RFCEmisor' => 'EKU9003173C9',
'NomDenRazSocE' => 'ESCUELA KEMPER URGATE',
'RegimenFiscalE' => '601',
],
'Receptor' => [
'Nacionalidad' => 'Nacional',
'Nacional' => [
'RFCRecep' => 'CACX7605101P8',
'NomDenRazSocR' => 'XOCHILT CASAS CHAVEZ',
'DomicilioFiscalR' => '10740',
],
],
'Periodo' => ['MesIni' => '01', 'MesFin' => '01', 'Ejerc' => '2026'],
'Totales' => [
'montoTotOperacion' => '1681.06',
'montoTotGrav' => '1681.06',
'montoTotExent' => '0.00',
'montoTotRet' => '151.29',
'ImpRetenidos' => [
[
'BaseRet' => '1681.06',
'Impuesto' => '01',
'MontoRet' => '16.81',
'TipoPagoRet' => '04',
],
[
'BaseRet' => '268.96',
'Impuesto' => '02',
'MontoRet' => '134.48',
'TipoPagoRet' => '01',
],
],
],
];
$ch = curl_init('https://api.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 = {
FolioInt: '0001',
FechaExp: '2026-08-10T08:08:01',
CveRetenc: '01',
LugarExpRetenc: '26015',
Emisor: {
RFCEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RFCRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
DomicilioFiscalR: '10740',
},
},
Periodo: { MesIni: '01', MesFin: '01', Ejerc: '2026' },
Totales: {
montoTotOperacion: '1681.06',
montoTotGrav: '1681.06',
montoTotExent: '0.00',
montoTotRet: '151.29',
ImpRetenidos: [
{
BaseRet: '1681.06',
Impuesto: '01',
MontoRet: '16.81',
TipoPagoRet: '04',
},
{
BaseRet: '268.96',
Impuesto: '02',
MontoRet: '134.48',
TipoPagoRet: '01',
},
],
},
};
fetch('https://api.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 = {
'FolioInt': '0001',
'FechaExp': '2026-08-10T08:08:01',
'CveRetenc': '01',
'LugarExpRetenc': '26015',
'Emisor': {
'RFCEmisor': 'EKU9003173C9',
'NomDenRazSocE': 'ESCUELA KEMPER URGATE',
'RegimenFiscalE': '601',
},
'Receptor': {
'Nacionalidad': 'Nacional',
'Nacional': {
'RFCRecep': 'CACX7605101P8',
'NomDenRazSocR': 'XOCHILT CASAS CHAVEZ',
'DomicilioFiscalR': '10740',
},
},
'Periodo': {'MesIni': '01', 'MesFin': '01', 'Ejerc': '2026'},
'Totales': {
'montoTotOperacion': '1681.06',
'montoTotGrav': '1681.06',
'montoTotExent': '0.00',
'montoTotRet': '151.29',
'ImpRetenidos': [
{
'BaseRet': '1681.06',
'Impuesto': '01',
'MontoRet': '16.81',
'TipoPagoRet': '04',
},
{
'BaseRet': '268.96',
'Impuesto': '02',
'MontoRet': '134.48',
'TipoPagoRet': '01',
},
],
},
}
respuesta = requests.post(
'https://api.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 = """
{
"FolioInt": "0001",
"FechaExp": "2026-08-10T08:08:01",
"CveRetenc": "01",
"LugarExpRetenc": "26015",
"Emisor": {
"RFCEmisor": "EKU9003173C9",
"NomDenRazSocE": "ESCUELA KEMPER URGATE",
"RegimenFiscalE": "601"
},
"Receptor": {
"Nacionalidad": "Nacional",
"Nacional": {
"RFCRecep": "CACX7605101P8",
"NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
"DomicilioFiscalR": "10740"
}
},
"Periodo": { "MesIni": "01", "MesFin": "01", "Ejerc": "2026" },
"Totales": {
"montoTotOperacion": "1681.06",
"montoTotGrav": "1681.06",
"montoTotExent": "0.00",
"montoTotRet": "151.29",
"ImpRetenidos": [
{
"BaseRet": "1681.06",
"Impuesto": "01",
"MontoRet": "16.81",
"TipoPagoRet": "04"
},
{
"BaseRet": "268.96",
"Impuesto": "02",
"MontoRet": "134.48",
"TipoPagoRet": "01"
}
]
}
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.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
{
FolioInt = "0001",
FechaExp = "2026-08-10T08:08:01",
CveRetenc = "01",
LugarExpRetenc = "26015",
Emisor = new
{
RFCEmisor = "EKU9003173C9",
NomDenRazSocE = "ESCUELA KEMPER URGATE",
RegimenFiscalE = "601",
},
Receptor = new
{
Nacionalidad = "Nacional",
Nacional = new
{
RFCRecep = "CACX7605101P8",
NomDenRazSocR = "XOCHILT CASAS CHAVEZ",
DomicilioFiscalR = "10740",
},
},
Periodo = new { MesIni = "01", MesFin = "01", Ejerc = "2026" },
Totales = new
{
montoTotOperacion = "1681.06",
montoTotGrav = "1681.06",
montoTotExent = "0.00",
montoTotRet = "151.29",
ImpRetenidos = new[]
{
new
{
BaseRet = "1681.06",
Impuesto = "01",
MontoRet = "16.81",
TipoPagoRet = "04",
},
new
{
BaseRet = "268.96",
Impuesto = "02",
MontoRet = "134.48",
TipoPagoRet = "01",
},
},
},
};
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(Encoding.UTF8.GetBytes($"{usuario}:{password}")));
var response = await client.PostAsJsonAsync("https://api.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 = {
FolioInt: '0001',
FechaExp: '2026-08-10T08:08:01',
CveRetenc: '01',
LugarExpRetenc: '26015',
Emisor: {
RFCEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RFCRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
DomicilioFiscalR: '10740',
},
},
Periodo: { MesIni: '01', MesFin: '01', Ejerc: '2026' },
Totales: {
montoTotOperacion: '1681.06',
montoTotGrav: '1681.06',
montoTotExent: '0.00',
montoTotRet: '151.29',
ImpRetenidos: [
{
BaseRet: '1681.06',
Impuesto: '01',
MontoRet: '16.81',
TipoPagoRet: '04',
},
{
BaseRet: '268.96',
Impuesto: '02',
MontoRet: '134.48',
TipoPagoRet: '01',
},
],
},
}
uri = URI.parse('https://api.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
Errores comunes
al emitir el CFDI de retenciones
Emitir un solo comprobante para varios tipos de retención
El nodo ImpRetenidos se usa para operaciones distintas en vez de una sola.
Emitir un comprobante por cada tipo de retención, salvo que sea la misma operación.
El comprobante es rechazado por el SAT
La clave de tipo de retención no corresponde al catálogo vigente.
Verificar la clave contra el catálogo c_CveRetenc antes de timbrar.
Datos del receptor no coinciden
El RFC, la razón social o el régimen fiscal no son idénticos a la constancia de situación fiscal.
Solicitar la constancia actualizada antes de timbrar.
Se intenta corregir un CFDI de Retenciones ya timbrado
Este tipo de CFDI no se edita: se cancela y se vuelve a emitir.
Cancelar dentro del mismo ejercicio fiscal y generar uno nuevo.
Un precio,
sin pagar por cada retención
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
- Tipos de retención disponibles hoy: Premios, Intereses y Servicios de Plataformas Tecnológicas
- Próximamente sin costo adicional: Dividendos o Utilidades distribuidas
- Vigencia de 12 meses, renovable
- Timbrado en CFDI de Retenciones 2.0, conforme al Anexo 20 de la RMF
- Requiere un plan de facturación activo (Folios, Ilimitado o API). Se vende por separado
Los folios que timbres se descuentan de tu suscripción principal. ¿Ya eres cliente? Inicia sesión y contrátalo desde Comprar · Retenciones.
Contratar ahoraPreguntas frecuentes
sobre el CFDI de retenciones
¿Cuándo debo emitir el CFDI de retenciones?
Depende del tipo de operación: algunos complementos se emiten al momento del pago, y otros —conforme a la regla 2.7.5.4 de la Resolución Miscelánea Fiscal— se pueden emitir de forma anualizada, a más tardar en enero del año siguiente a la retención o el pago.
¿El CFDI de retenciones sustituye a la constancia del formato 37-A?
Sí. El CFDI de Retenciones e Información de Pagos digital sustituyó a las constancias en papel (como el formato 37-A) que se usaban antes de la factura electrónica.
¿Se puede cancelar un CFDI de retenciones?
Sí, se puede cancelar dentro del mismo ejercicio fiscal en el que se emitió, siguiendo el proceso de cancelación del SAT. No se edita: se cancela y se emite uno nuevo.
¿Qué es el tipo de retención 04?
Es la clave 04 del catálogo c_CveRetenc del CFDI de Retenciones e Información de Pagos, y corresponde a Servicios prestados por comisionistas: se usa cuando una empresa retiene impuestos al pagar a un comisionista por su intermediación. Si lo que buscas es la clave de dividendos o utilidades distribuidas, es la 14, y la de obtención de premios es la 20.
¿El CFDI de retenciones lleva folio fiscal (UUID)?
Sí. Es un CFDI y, como tal, se timbra ante el SAT con folio fiscal (UUID), igual que una factura.
¿La constancia de retenciones ya no es obligatoria?
Depende del tipo de operación. Desde 2022, el SAT permite que en honorarios y arrendamiento la retención se declare en el propio recibo de la persona física, sin necesidad de un CFDI de Retenciones aparte. Esa facilidad no aplica a todos los casos: para premios, intereses, dividendos y servicios de plataformas tecnológicas el CFDI de Retenciones sigue siendo obligatorio, y es justo lo que puedes emitir con Facturama.
¿Cuánto cuesta emitir un CFDI de retenciones en Facturama?
El Módulo de Retenciones cuesta $1,650 MXN al año con IVA incluido y desbloquea todos los tipos de retención disponibles, sin pagar por separado cada complemento. Requiere un plan de facturación activo, y los folios que timbres se descuentan de esa suscripción.
Todo lo relacionado con retenciones
API de CFDI de retenciones
Endpoint, JSON de ejemplo, campos obligatorios y SDKs para integrar el timbrado en tu sistema.
Complemento de intereses
El que usan bancos, fintechs y casas de bolsa para las constancias anuales de intereses.
Complemento de plataformas tecnológicas
Obligatorio para marketplaces y apps que pagan a conductores, repartidores o anfitriones.
Calculadora de retenciones
Calcula la retención de ISR e IVA en servicios profesionales y arrendamiento, gratis.
Complementos de CFDI
Todos los complementos del SAT que puedes emitir desde la plataforma web de Facturama.
¿Qué es una retención de impuestos?
La guía de fondo sobre retenciones de ISR e IVA: quién retiene, cuánto y cuándo se entera al SAT.