El problema: generar PDFs de facturas CFDI a mano
Cada mes, el despacho contable de la C.P. Marcela necesita generar entre 180 y 250 facturas para sus 85 clientes. El flujo anterior era asi:
- Timbrar el CFDI con el PAC (Finkok) desde su sistema contable.
- Abrir una plantilla de Word con el formato de la factura.
- Copiar y pegar manualmente: RFC emisor, RFC receptor, razon social, conceptos, totales, UUID del timbrado, sello digital.
- Ajustar formato (tablas que se descuadran, paginacion, logo).
- Exportar a PDF.
- Renombrar el archivo (RFC_UUID.pdf).
- Enviar por email al cliente junto con el XML.
Este proceso tardaba entre 8 y 12 minutos por factura. Con 200 facturas al mes, eso son 26 a 40 horas de trabajo manual solo en generar PDFs. Trabajo repetitivo, propenso a errores de copia, y que no aporta valor contable.
La solucion: una llamada API por factura
Con Reportia, el flujo se reduce a 4 pasos automatizados:
Timbrar con el PAC
El sistema contable timbra el CFDI 4.0 con Finkok (o cualquier PAC: Facturapi, SW SmartWeb, Digipack). Se obtiene el XML con UUID, sello digital y cadena original. Este paso no cambia.
Armar el JSON con los datos del CFDI
Un script en Python parsea el XML timbrado y construye el JSON que Reportia necesita: emisor, receptor, conceptos, impuestos, totales y datos de timbrado.
POST a /v1/render
Una sola llamada HTTP. Reportia recibe el JSON, aplica la plantilla de factura (con logo, colores del despacho, pie de pagina legal) y devuelve el PDF en menos de 2 segundos.
Email automatico al cliente
El script adjunta el PDF + XML al email y lo envia. El cliente recibe su factura profesional sin que nadie toque nada. Todo el loop tarda 5 segundos por factura.
Ejemplo de codigo: del XML al PDF
Asi se ve el script en Python que conecta el PAC con Reportia. El despacho de Marcela lo corre en un cron cada noche a las 11pm, procesando todas las facturas del dia:
import requests
import xml.etree.ElementTree as ET
# 1. Parsear el XML timbrado del PAC
tree = ET.parse("cfdi_timbrado.xml")
ns = {"cfdi": "http://www.sat.gob.mx/cfd/4",
"tfd": "http://www.sat.gob.mx/TimbreFiscalDigital"}
comp = tree.getroot()
emisor = comp.find("cfdi:Emisor", ns)
receptor = comp.find("cfdi:Receptor", ns)
conceptos = comp.findall(".//cfdi:Concepto", ns)
timbre = comp.find(".//tfd:TimbreFiscalDigital", ns)
# 2. Armar el JSON para Reportia
data = {
"template": "factura",
"format": "pdf",
"data": {
"serie": comp.get("Serie", "A"),
"folio": comp.get("Folio", "001"),
"fecha": comp.get("Fecha"),
"emisor": {
"rfc": emisor.get("Rfc"),
"nombre": emisor.get("Nombre"),
"regimen": emisor.get("RegimenFiscal")
},
"receptor": {
"rfc": receptor.get("Rfc"),
"nombre": receptor.get("Nombre"),
"uso_cfdi": receptor.get("UsoCFDI"),
"domicilio_fiscal": receptor.get("DomicilioFiscalReceptor")
},
"conceptos": [
{
"descripcion": c.get("Descripcion"),
"cantidad": float(c.get("Cantidad")),
"precio_unitario": float(c.get("ValorUnitario")),
"importe": float(c.get("Importe")),
"clave_sat": c.get("ClaveProdServ")
}
for c in conceptos
],
"subtotal": float(comp.get("SubTotal")),
"iva": float(comp.get("SubTotal")) * 0.16,
"total": float(comp.get("Total")),
"uuid": timbre.get("UUID") if timbre is not None else "",
"sello_sat": (timbre.get("SelloSAT") or "")[:20] + "...",
"moneda": comp.get("Moneda", "MXN"),
"metodo_pago": comp.get("MetodoPago", "PUE"),
"forma_pago": comp.get("FormaPago", "03")
}
}
# 3. Generar el PDF con Reportia
resp = requests.post(
"https://reportia.4l3.org/v1/render",
json=data,
timeout=10
)
# 4. Guardar el PDF
filename = f"{data['data']['receptor']['rfc']}_{data['data']['uuid']}.pdf"
with open(filename, "wb") as f:
f.write(resp.content)
print(f"Factura generada: {filename} ({len(resp.content)//1024} KB)")
Anatomia de la factura generada
El PDF que Reportia genera incluye todos los elementos que el SAT requiere para una representacion impresa de CFDI 4.0:
Encabezado
- Logo del despacho
- Datos del emisor (RFC, razon social, regimen fiscal)
- Datos del receptor (RFC, nombre, uso CFDI, domicilio fiscal)
- Serie, folio y fecha de emision
Cuerpo
- Tabla de conceptos con clave SAT, descripcion, cantidad, precio unitario, importe
- Desglose de impuestos (IVA 16%, retenciones si aplica)
- Subtotal y total en MXN
- Metodo de pago, forma de pago, moneda
Pie de timbrado
- UUID del timbre fiscal
- Sello digital del SAT (truncado)
- Cadena original del complemento
- Fecha y hora de timbrado
Personalizacion
- Colores corporativos del despacho
- Pie de pagina legal configurable
- QR code opcional para verificacion SAT
- Layout responsive (carta o A4)
Resultados despues de 3 meses
Antes (manual)
- 8-12 min por factura
- 26-40 horas/mes en PDFs
- Errores de captura en ~5% de facturas
- Formato inconsistente entre facturas
- Auxiliar contable dedicada solo a esto
Despues (Reportia)
- 5 segundos por factura (end-to-end)
- 15 minutos/mes (cron nocturno)
- 0 errores de captura (datos del XML)
- Formato identico en todas las facturas
- Auxiliar reasignada a atencion al cliente
El ahorro directo es claro: de 30+ horas mensuales a 15 minutos. Pero el impacto real esta en la calidad y consistencia. Cada factura sale identica, con todos los campos del CFDI 4.0 en su lugar, sin errores de dedo, sin tablas descuadradas.
El costo: $9 USD/mes en el plan Pro de Reportia (1,000 PDFs). Antes del cambio, el despacho pagaba $4,500 MXN/mes (aprox. $250 USD) en horas de la auxiliar dedicada a esta tarea. El ROI es inmediato.
Flujo completo: del timbrado al email
Este es el flujo end-to-end que corre en el cron nocturno del despacho:
3 minutos y 25 segundos. Las 200 facturas del dia, generadas, enviadas y logueadas. Sin intervencion humana.
Plantilla personalizada del despacho
El despacho de Marcela usa una plantilla custom que hicieron en el builder visual de Reportia. Incluye:
- Logo del despacho en esquina superior izquierda
- Colores corporativos (azul marino + gris)
- Tabla de conceptos con bordes alternados para legibilidad
- Seccion de timbrado con UUID y sello en gris claro (no distrae pero cumple requisitos SAT)
- Pie de pagina con datos de contacto del despacho y leyenda fiscal
- Formato carta (216x279mm) que es el estandar en Mexico
La plantilla se creo una vez en el builder y se referencia por ID en cada llamada API. Si el despacho cambia de logo o colores, solo actualizan la plantilla en el builder y todas las facturas futuras salen con el nuevo diseno.
Compatibilidad con PACs mexicanos
Reportia no timbra CFDIs (eso lo hace tu PAC). Lo que hace es tomar los datos del CFDI ya timbrado y generar el PDF profesional. Funciona con cualquier PAC que genere XML valido de CFDI 4.0:
El XML del CFDI 4.0 es un estandar del SAT. No importa que PAC uses: el XML tiene la misma estructura y Reportia puede parsearlo para generar el PDF.
Costos y planes para despachos contables
Dependiendo del volumen de facturas de tu despacho:
| Plan | Precio | PDFs/mes | Ideal para |
|---|---|---|---|
| Free | $0 | 50 | Probar antes de comprar |
| Pro | $9 USD/mes | 1,000 | Despacho con 20-80 clientes |
| Scale | $29 USD/mes | 10,000 | Despacho grande o facturacion masiva |
| Lifetime | $49 pago unico | 1,000/mes para siempre | Despacho que quiere pagar una vez |
Para un despacho como el de Marcela (200 facturas/mes), el plan Pro a $9 USD es mas que suficiente. El Lifetime $49 es la opcion mas economica a largo plazo: un solo pago y nunca mas te preocupas.