MÓDULO DE RETENCIONES

Emite tu CFDI de Retenciones e Información de Pagos

Con Facturama lo timbras en minutos, sin instalar nada: contratas el Módulo de Retenciones una sola vez y quedas cubierto para los tipos de retención disponibles, sin pagar por separado cada uno.

Formulario de Nueva Retención en Facturama con la clave 20, Obtención de premios

Lo básico

¿Qué es el CFDI de Retenciones e Información de pagos?

El CFDI de Retenciones e Información de Pagos es uno de los comprobantes fiscales del Anexo 20 de la RMF, 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 de ISR o IVA, o un pago informado. Sustituye a las antiguas constancias de retención en papel y su versión vigente es la 2.0.

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 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. En esos casos el CFDI de ingresos de la persona física, con la retención desglosada, puede servir como constancia de retención, así que el CFDI de Retenciones independiente sigue siendo obligatorio 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.

Catálogo

En Facturama contamos con los complementos esenciales autorizados por el SAT para la emisión de tus comprobantes de retención.

Puedes emitir tus CFDI utilizando el formulario base sin complemento, o alguno de los 6 complementos soportados en nuestro catálogo: Pagos a extranjeros, Dividendos o Utilidades, Enajenación de acciones, Premios, Intereses y Plataformas tecnológicas.

Pagos a extranjeros

Residentes en el extranjero

Retenciones por pagos a residentes en el extranjero sin establecimiento permanente en México. Corresponde a la clave 18 de retención.

Ver complemento

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
Persona sonriendo frente a su laptop mientras revisa documentos

Paso a paso

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

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

  2. Paso 2. Elige Crear Retención

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

  3. Paso 3. Revisa y timbra

    El comprobante queda disponible para descarga y consulta en tu cuenta, con folio fiscal UUID, igual que cualquier CFDI.

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 CFDI de retenciones de Facturama.

Ver documentación API
POSThttps://apisandbox.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://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 = {
  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://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 = {
    '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://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 = """
    {
      "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://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
{
    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://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 = {
  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://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 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

Precio del Módulo de Retenciones: un pago al año, sin cobrar 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

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

Contratar ahora

Dudas

Preguntas frecuentes sobre el CFDI de Retenciones

Depende del tipo de operación: algunos pagos se emiten al momento de pagar y otros, como Premios, pueden emitirse de forma anualizada, a más tardar en enero del año siguiente a la retención, conforme a la regla 2.7.5.4 de la RMF.

Sí. El CFDI de Retenciones e Información de Pagos sustituye a las constancias en papel, como el formato 37-A, que se usaban antes de la factura electrónica.

Sí, se puede cancelar dentro del mismo ejercicio fiscal en que se emitió, siguiendo el proceso de cancelación del SAT.

Es una clave del catálogo c_CveRetenc del CFDI de Retenciones, y corresponde a Premios. Se usa cuando se retiene ISR por ganancias de rifas, sorteos o concursos. En Facturama, esta operación se completa con el complemento de Premios.

Es la clave 04 del catálogo c_CveRetenc y corresponde a Servicios prestados por comisionistas: se usa cuando una empresa retiene impuestos al pagar a un comisionista por su intermediación. Si buscas la clave de dividendos o utilidades distribuidas, es la 14, y la de obtención de premios, la 20.

Sí. Es un CFDI como tal, y se timbra ante el SAT con su propio folio fiscal (UUID), igual que una factura.

Depende del tipo de operación. En honorarios y arrendamiento pagados por una persona moral, el CFDI de ingresos de la persona física, con la retención desglosada, puede servir como constancia de retención, sin necesidad de un CFDI de Retenciones aparte. Pero esa facilidad no aplica a Premios, Intereses, Pagos a extranjeros, Dividendos ni Enajenación de acciones. Para esos, el CFDI de Retenciones sigue siendo obligatorio, y es justo lo que emites en Facturama.

El Módulo de Retenciones cuesta $1,650 MXN al año con IVA incluido e incluye 6 complementos: Premios, Intereses, Pagos a extranjeros, Dividendos, Enajenación de acciones y Plataformas tecnológicas en ambiente API, además del formulario base. Incluye 25 folios para timbrar; cuando los uses, los folios se descuentan de tu plan de facturación, que debe estar activo.