Plataformas de transporte y entrega
Apps que conectan a quienes ofrecen servicios de transporte de personas o de entrega con sus clientes.
El complemento de Servicios mediante plataformas tecnológicas se agrega al CFDI de Retenciones e Información de Pagos cuando una plataforma tecnológica o digital retiene impuestos a quienes prestan servicios o venden a través de ella. Se timbra con la clave de retención 26 y reúne en un solo comprobante al mes los servicios realizados y las retenciones correspondientes.
En Facturama está disponible solo por API: se integra desde el sistema de tu plataforma.
Quién lo emite
Plataformas de transporte y entrega
Apps que conectan a quienes ofrecen servicios de transporte de personas o de entrega con sus clientes.
Plataformas de hospedaje
Plataformas que intermedian la renta de alojamiento entre anfitriones y huéspedes.
Tiendas virtuales y apps de venta
Plataformas donde terceros venden bienes o prestan servicios y la plataforma retiene impuestos.
Qué datos lleva
Periodicidad
PeriodicidadCada cuánto calculas la retención (por ejemplo diaria, semanal, quincenal o mensual). El comprobante siempre abarca un mes.
Número de servicios
NumServCuántos servicios incluye el periodo.
Totales del periodo
MonTotServSIVAMonto de los servicios, IVA trasladado y retenido, e ISR retenido del periodo.
Detalle por servicio
DetallesDelServicioFecha, tipo de servicio, forma de pago, precio sin IVA e IVA trasladado de cada uno.
Uso de la plataforma
MonTotalporUsoPlataformaEl total que la plataforma cobró al vendedor en el periodo por usarla.
Contribución gubernamental
ContribucionGubernamentalContribuciones locales pagadas por el servicio, como el impuesto sobre hospedaje, con la entidad donde se pagan.
¿Vendes o prestas servicios en una plataforma? No emites este CFDI: lo emite la plataforma que te retiene, y tú lo usas en tu declaración.
Ejemplo de CFDI
emitido para el vendedor
Ejemplo
Una plataforma de venta cierra el mes y necesita informar las retenciones de cada vendedor. Para cada vendedor emite un CFDI de Retenciones con la clave 26. El complemento agrupa todas sus ventas del mes y las retenciones del periodo, en lugar de timbrar un comprobante por venta. La plataforma lo hace desde su propio sistema, con una llamada a la API de Facturama.
Para developers
Este complemento se emite solo por API. Intégralo en tu sistema y timbra un CFDI de retenciones al mes para cada persona que presta servicios o vende en tu plataforma.
$usuario = 'TU_USUARIO_API';
$password = 'TU_PASSWORD_API';
$payload = [
'FolioInt' => '0001',
'FechaExp' => '2024-04-17T12:00:01',
'CveRetenc' => '26',
'LugarExpRetenc' => '78180',
'Emisor' => [
'RFCEmisor' => 'EKU9003173C9',
'NomDenRazSocE' => 'ESCUELA KEMPER URGATE',
'RegimenFiscalE' => '601',
],
'Receptor' => [
'Nacionalidad' => 'Nacional',
'Nacional' => [
'RFCRecep' => 'CACX7605101P8',
'NomDenRazSocR' => 'XOCHILT CASAS CHAVEZ',
'DomicilioFiscalR' => '36257',
],
],
'Periodo' => [
'MesIni' => '01',
'MesFin' => '01',
'Ejerc' => '2024',
],
'Totales' => [
'montoTotOperacion' => '1681.06',
'montoTotGrav' => '1681.06',
'montoTotExent' => '0.00',
'montoTotRet' => '151.29',
'ImpRetenidos' => [
[
'BaseRet' => '1681.06',
'Impuesto' => '01',
'MontoRet' => '16.81',
'TipoPagoRet' => '03',
],
[
'BaseRet' => '268.96',
'Impuesto' => '02',
'MontoRet' => '134.48',
'TipoPagoRet' => '01',
],
],
],
'Complemento' => [
'ServiciosPlataformasTecnologicas' => [
'Servicios' => [
[
'ImpuestosTrasladadosdelServicio' => [
'Base' => '1681.06',
'Impuesto' => '02',
'TipoFactor' => 'Tasa',
'TasaCuota' => '0.160000',
'Importe' => '268.9696',
],
'ComisionDelServicio' => [
'Base' => '1681.06',
'Importe' => '14.66',
],
'FormaPagoServ' => '02',
'TipoDeServ' => '05',
'FechaServ' => '2024-01-01',
'PrecioServSinIva' => '1681.06',
],
],
'Periodicidad' => '02',
'NumServ' => 1,
'MontToServSIva' => '1681.06',
'TotalIvaTrasladado' => '268.9696',
'TotalIvaRetenido' => '134.48',
'TotalIsrRetenido' => '16.81',
'DifIvaEntregadoPrestServ' => '134.4896',
'MonTotalporUsoPlataforma' => '14.66',
],
],
];
$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: '2024-04-17T12:00:01',
CveRetenc: '26',
LugarExpRetenc: '78180',
Emisor: {
RFCEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RFCRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
DomicilioFiscalR: '36257',
},
},
Periodo: {
MesIni: '01',
MesFin: '01',
Ejerc: '2024',
},
Totales: {
montoTotOperacion: '1681.06',
montoTotGrav: '1681.06',
montoTotExent: '0.00',
montoTotRet: '151.29',
ImpRetenidos: [
{
BaseRet: '1681.06',
Impuesto: '01',
MontoRet: '16.81',
TipoPagoRet: '03',
},
{
BaseRet: '268.96',
Impuesto: '02',
MontoRet: '134.48',
TipoPagoRet: '01',
},
],
},
Complemento: {
ServiciosPlataformasTecnologicas: {
Servicios: [
{
ImpuestosTrasladadosdelServicio: {
Base: '1681.06',
Impuesto: '02',
TipoFactor: 'Tasa',
TasaCuota: '0.160000',
Importe: '268.9696',
},
ComisionDelServicio: {
Base: '1681.06',
Importe: '14.66',
},
FormaPagoServ: '02',
TipoDeServ: '05',
FechaServ: '2024-01-01',
PrecioServSinIva: '1681.06',
},
],
Periodicidad: '02',
NumServ: 1,
MontToServSIva: '1681.06',
TotalIvaTrasladado: '268.9696',
TotalIvaRetenido: '134.48',
TotalIsrRetenido: '16.81',
DifIvaEntregadoPrestServ: '134.4896',
MonTotalporUsoPlataforma: '14.66',
},
},
};
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': '2024-04-17T12:00:01',
'CveRetenc': '26',
'LugarExpRetenc': '78180',
'Emisor': {
'RFCEmisor': 'EKU9003173C9',
'NomDenRazSocE': 'ESCUELA KEMPER URGATE',
'RegimenFiscalE': '601',
},
'Receptor': {
'Nacionalidad': 'Nacional',
'Nacional': {
'RFCRecep': 'CACX7605101P8',
'NomDenRazSocR': 'XOCHILT CASAS CHAVEZ',
'DomicilioFiscalR': '36257',
},
},
'Periodo': {
'MesIni': '01',
'MesFin': '01',
'Ejerc': '2024',
},
'Totales': {
'montoTotOperacion': '1681.06',
'montoTotGrav': '1681.06',
'montoTotExent': '0.00',
'montoTotRet': '151.29',
'ImpRetenidos': [
{
'BaseRet': '1681.06',
'Impuesto': '01',
'MontoRet': '16.81',
'TipoPagoRet': '03',
},
{
'BaseRet': '268.96',
'Impuesto': '02',
'MontoRet': '134.48',
'TipoPagoRet': '01',
},
],
},
'Complemento': {
'ServiciosPlataformasTecnologicas': {
'Servicios': [
{
'ImpuestosTrasladadosdelServicio': {
'Base': '1681.06',
'Impuesto': '02',
'TipoFactor': 'Tasa',
'TasaCuota': '0.160000',
'Importe': '268.9696',
},
'ComisionDelServicio': {
'Base': '1681.06',
'Importe': '14.66',
},
'FormaPagoServ': '02',
'TipoDeServ': '05',
'FechaServ': '2024-01-01',
'PrecioServSinIva': '1681.06',
},
],
'Periodicidad': '02',
'NumServ': 1,
'MontToServSIva': '1681.06',
'TotalIvaTrasladado': '268.9696',
'TotalIvaRetenido': '134.48',
'TotalIsrRetenido': '16.81',
'DifIvaEntregadoPrestServ': '134.4896',
'MonTotalporUsoPlataforma': '14.66',
},
},
}
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": "2024-04-17T12:00:01",
"CveRetenc": "26",
"LugarExpRetenc": "78180",
"Emisor": {
"RFCEmisor": "EKU9003173C9",
"NomDenRazSocE": "ESCUELA KEMPER URGATE",
"RegimenFiscalE": "601"
},
"Receptor": {
"Nacionalidad": "Nacional",
"Nacional": {
"RFCRecep": "CACX7605101P8",
"NomDenRazSocR": "XOCHILT CASAS CHAVEZ",
"DomicilioFiscalR": "36257"
}
},
"Periodo": {
"MesIni": "01",
"MesFin": "01",
"Ejerc": "2024"
},
"Totales": {
"montoTotOperacion": "1681.06",
"montoTotGrav": "1681.06",
"montoTotExent": "0.00",
"montoTotRet": "151.29",
"ImpRetenidos": [
{
"BaseRet": "1681.06",
"Impuesto": "01",
"MontoRet": "16.81",
"TipoPagoRet": "03"
},
{
"BaseRet": "268.96",
"Impuesto": "02",
"MontoRet": "134.48",
"TipoPagoRet": "01"
}
]
},
"Complemento": {
"ServiciosPlataformasTecnologicas": {
"Servicios": [
{
"ImpuestosTrasladadosdelServicio": {
"Base": "1681.06",
"Impuesto": "02",
"TipoFactor": "Tasa",
"TasaCuota": "0.160000",
"Importe": "268.9696"
},
"ComisionDelServicio": {
"Base": "1681.06",
"Importe": "14.66"
},
"FormaPagoServ": "02",
"TipoDeServ": "05",
"FechaServ": "2024-01-01",
"PrecioServSinIva": "1681.06"
}
],
"Periodicidad": "02",
"NumServ": 1,
"MontToServSIva": "1681.06",
"TotalIvaTrasladado": "268.9696",
"TotalIvaRetenido": "134.48",
"TotalIsrRetenido": "16.81",
"DifIvaEntregadoPrestServ": "134.4896",
"MonTotalporUsoPlataforma": "14.66"
}
}
}
""";
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 = "2024-04-17T12:00:01",
CveRetenc = "26",
LugarExpRetenc = "78180",
Emisor = new
{
RFCEmisor = "EKU9003173C9",
NomDenRazSocE = "ESCUELA KEMPER URGATE",
RegimenFiscalE = "601",
},
Receptor = new
{
Nacionalidad = "Nacional",
Nacional = new
{
RFCRecep = "CACX7605101P8",
NomDenRazSocR = "XOCHILT CASAS CHAVEZ",
DomicilioFiscalR = "36257",
},
},
Periodo = new
{
MesIni = "01",
MesFin = "01",
Ejerc = "2024",
},
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 = "03",
},
new
{
BaseRet = "268.96",
Impuesto = "02",
MontoRet = "134.48",
TipoPagoRet = "01",
},
},
},
Complemento = new
{
ServiciosPlataformasTecnologicas = new
{
Servicios = new[]
{
new
{
ImpuestosTrasladadosdelServicio = new
{
Base = "1681.06",
Impuesto = "02",
TipoFactor = "Tasa",
TasaCuota = "0.160000",
Importe = "268.9696",
},
ComisionDelServicio = new
{
Base = "1681.06",
Importe = "14.66",
},
FormaPagoServ = "02",
TipoDeServ = "05",
FechaServ = "2024-01-01",
PrecioServSinIva = "1681.06",
},
},
Periodicidad = "02",
NumServ = 1,
MontToServSIva = "1681.06",
TotalIvaTrasladado = "268.9696",
TotalIvaRetenido = "134.48",
TotalIsrRetenido = "16.81",
DifIvaEntregadoPrestServ = "134.4896",
MonTotalporUsoPlataforma = "14.66",
},
},
};
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: '2024-04-17T12:00:01',
CveRetenc: '26',
LugarExpRetenc: '78180',
Emisor: {
RFCEmisor: 'EKU9003173C9',
NomDenRazSocE: 'ESCUELA KEMPER URGATE',
RegimenFiscalE: '601',
},
Receptor: {
Nacionalidad: 'Nacional',
Nacional: {
RFCRecep: 'CACX7605101P8',
NomDenRazSocR: 'XOCHILT CASAS CHAVEZ',
DomicilioFiscalR: '36257',
},
},
Periodo: {
MesIni: '01',
MesFin: '01',
Ejerc: '2024',
},
Totales: {
montoTotOperacion: '1681.06',
montoTotGrav: '1681.06',
montoTotExent: '0.00',
montoTotRet: '151.29',
ImpRetenidos: [
{
BaseRet: '1681.06',
Impuesto: '01',
MontoRet: '16.81',
TipoPagoRet: '03',
},
{
BaseRet: '268.96',
Impuesto: '02',
MontoRet: '134.48',
TipoPagoRet: '01',
},
],
},
Complemento: {
ServiciosPlataformasTecnologicas: {
Servicios: [
{
ImpuestosTrasladadosdelServicio: {
Base: '1681.06',
Impuesto: '02',
TipoFactor: 'Tasa',
TasaCuota: '0.160000',
Importe: '268.9696',
},
ComisionDelServicio: {
Base: '1681.06',
Importe: '14.66',
},
FormaPagoServ: '02',
TipoDeServ: '05',
FechaServ: '2024-01-01',
PrecioServSinIva: '1681.06',
},
],
Periodicidad: '02',
NumServ: 1,
MontToServSIva: '1681.06',
TotalIvaTrasladado: '268.9696',
TotalIvaRetenido: '134.48',
TotalIsrRetenido: '16.81',
DifIvaEntregadoPrestServ: '134.4896',
MonTotalporUsoPlataforma: '14.66',
},
},
}
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
Buscarlo en el formulario web
Causa
Este complemento solo está disponible por API; no aparece en el formulario de la web.
Solución
Intégralo con la API de Facturama. Para los complementos de la web, consulta el Módulo de Retenciones.
ERROR 02
Timbrar un CFDI por cada servicio
Causa
El complemento es acumulativo: agrupa todos los servicios del mes en un solo comprobante.
Solución
Agrupa los servicios por mes y por persona, y timbra un comprobante por cada grupo.
ERROR 03
Totales que no cuadran
Causa
Los totales del complemento deben coincidir con los impuestos retenidos del comprobante; si no, el PAC rechaza el timbrado.
Solución
Calcula ambos desde los mismos servicios del mes y verifícalos antes de enviar.
Precio
El módulo se contrata una vez y desbloquea los complementos disponibles. El de Plataformas tecnológicas se usa solo por API.
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
No. Está disponible solo por API: se integra desde el sistema de tu plataforma. Los complementos que sí puedes emitir desde la web están en la página del Módulo de Retenciones.
La 26, Servicios mediante plataformas tecnológicas, del catálogo c_CveRetenc del SAT.
No. Es un comprobante acumulativo: reúne todos los servicios del mes y las retenciones correspondientes.
Depende de la Ley del ISR (artículo 113-A), la Ley del IVA (artículos 1o.-A BIS y 18-J) y la Ley de Ingresos de la Federación del ejercicio, del tipo de servicio y de si el prestador proporcionó su RFC. Confírmalo con tu contador: el complemento documenta lo que ya determinaste.
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 en el sandbox de Facturama, que no tiene costo ni validez fiscal.
La retención cambia respecto a quien sí lo proporciona. Confirma con tu contador cómo tratarla y regístrala en el comprobante.
Incluidos en el mismo módulo
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.
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.