MÓDULO DE RETENCIONES

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.

Formulario de Nueva Retención en Facturama con el complemento Premios
LO BÁSICO

¿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.

Leer la guía completa
obligados

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.

PASO A PASO

Cómo emitir un CFDI de retenciones
en Facturama paso a paso

Paso 1

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.

Paso 2

Elige Crear Retención

Ingresa la información con los datos y complementos necesarios para la retención que vas a timbrar.

Paso 3

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.

DENTRO DEL PRODUCTO

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.

Formulario del complemento Premios en Facturama con entidad federativa y montos gravado y exento

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.

Captura de un CFDI de retenciones a un residente en el extranjero con número de registro de identidad fiscal

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.

Complemento de intereses del CFDI de retenciones con 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.

Formulario base del CFDI de retenciones 2.0 en Facturama con emisor, receptor y totales
Para developers

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
POST  https://api.facturama.mx/2/retenciones
$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
antes de timbrar

Errores comunes
al emitir el CFDI de retenciones

ERROR 01

Emitir un solo comprobante para varios tipos de retención

Causa

El nodo ImpRetenidos se usa para operaciones distintas en vez de una sola.

Solución

Emitir un comprobante por cada tipo de retención, salvo que sea la misma operación.

ERROR 02

El comprobante es rechazado por el SAT

Causa

La clave de tipo de retención no corresponde al catálogo vigente.

Solución

Verificar la clave contra el catálogo c_CveRetenc antes de timbrar.

ERROR 03

Datos del receptor no coinciden

Causa

El RFC, la razón social o el régimen fiscal no son idénticos a la constancia de situación fiscal.

Solución

Solicitar la constancia actualizada antes de timbrar.

ERROR 04

Se intenta corregir un CFDI de Retenciones ya timbrado

Causa

Este tipo de CFDI no se edita: se cancela y se vuelve a emitir.

Solución

Cancelar dentro del mismo ejercicio fiscal y generar uno nuevo.

PRECIO

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 ahora
Dudas

Preguntas 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.

sigue explorando

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.