Automatizar reportería fiscal en México CFDI 2026 sigue un patrón claro: descarga masiva XML del SAT con e.firma o ingestión vía API del PAC autorizado, parseo XML con lxml o xmltodict, guardar en capa Bronze (Postgres o Supabase), normalizar en Silver (un registro por CFDI con campos limpios), agregar en Gold para reportes (DIOT mensual, complemento de pagos, balanza, retenciones). Stack open source típico: Python más pandas más lxml más Jinja2 más weasyprint. Costo entre 4,000 y 25,000 USD según alcance. Pyme mediana con más de 1,000 CFDI al mes ahorra 8 a 20 horas mensuales de su contador y obtiene auditabilidad completa. Sin licencias atadas cuando el código es tuyo.
Si tu pyme en México emite y recibe CFDI 4.0 y aún arma DIOT y reportes fiscales a mano cada mes, esta guía te da el patrón ganador.
Paso 1: Inventario fiscal de tu pyme
Antes de automatizar:
- Volumen mensual de CFDI emitidos y recibidos
- PAC actual (Solución Factible, EDICOM, FEL, Facturama, otros)
- Sistema contable (CONTPAQi, Aspel, ERP propio, Excel)
- Bancos donde tienes cuenta empresa
- Régimen fiscal y obligaciones (RESICO, General, Honorarios, etc.)
- Personas que arman reportes manuales hoy y horas que gastan
Pyme mediana típica: 500 a 5,000 CFDI al mes, 1 a 3 PAC distintos, contador que pierde 12 a 30 horas al mes en reportes.
Paso 2: Ingestar CFDI a tu Data Lake
Dos rutas:
Ruta 1: Descarga masiva SAT
SAT expone servicio de descarga masiva. Con e.firma autenticas, solicitas paquetes de CFDI por rango de fecha, SAT genera paquete (puede tardar 4 a 24 horas), descargas ZIP con XML.
Bibliotecas Python:
- satcfdi
- cfdiclient
- pysat
Ruta 2: Ingestión vía PAC
Si emites con un PAC, casi todos tienen API para listar CFDI emitidos y recibidos. Solicitas pull cada N horas y guardas XML crudo en Bronze.
import requests, json
from datetime import date, timedelta
def fetch_cfdi_emitidos(fecha_desde, fecha_hasta):
url = 'https://api.pac.com/v1/cfdi/emitidos'
params = {'desde': fecha_desde, 'hasta': fecha_hasta}
headers = {'Authorization': 'Bearer ' + PAC_TOKEN}
r = requests.get(url, params=params, headers=headers)
return r.json()
Paso 3: Parsear XML a tablas
CFDI 4.0 es XML con namespace. Stack típico Python:
from lxml import etree
ns = {
'cfdi': 'http://www.sat.gob.mx/cfd/4',
'tfd': 'http://www.sat.gob.mx/TimbreFiscalDigital',
'pagos20': 'http://www.sat.gob.mx/Pagos20',
}
def parse_cfdi(xml_str):
root = etree.fromstring(xml_str)
emisor = root.find('.//cfdi:Emisor', ns)
receptor = root.find('.//cfdi:Receptor', ns)
tfd = root.find('.//tfd:TimbreFiscalDigital', ns)
return {
'uuid': tfd.get('UUID'),
'fecha_emision': root.get('Fecha'),
'rfc_emisor': emisor.get('Rfc'),
'rfc_receptor': receptor.get('Rfc'),
'tipo_comprobante': root.get('TipoDeComprobante'),
'total': float(root.get('Total')),
'subtotal': float(root.get('SubTotal')),
'forma_pago': root.get('FormaPago'),
'metodo_pago': root.get('MetodoPago'),
'moneda': root.get('Moneda'),
}
Cada CFDI se vuelve una fila en Silver.
Paso 4: Generar DIOT mensual automática
DIOT es la Declaración Informativa de Operaciones con Terceros. Cada mes el contador la arma con CFDI recibidos de proveedores. El esquema:
- Una fila por RFC proveedor
- IVA acreditable 16 por ciento, IVA acreditable 0 por ciento, IVA acreditable exento
- Importe pagado en el mes (no solo facturado)
- Tipo de operación (prestación de servicios, arrendamiento, otros)
SQL para armar DIOT desde Silver:
select
rfc_emisor as rfc_proveedor,
sum(case when iva_tasa = 0.16 then importe_pagado_mes else 0 end) as iva_16,
sum(case when iva_tasa = 0.00 then importe_pagado_mes else 0 end) as iva_0,
sum(case when iva_tasa is null then importe_pagado_mes else 0 end) as iva_exento,
sum(importe_pagado_mes) as total_operacion
from gold.cfdi_recibidos_pagados
where mes_pago = '2026-05'
group by 1
order by 4 desc;
Exportar a Excel o el formato A29 que pide SAT.
Paso 5: Complemento de pagos automático
Cuando una factura PUE (Pago en Una sola Exhibición) se queda sin pagar en mes de emisión, se vuelve PPD (Pago en Parcialidades o Diferido). Por cada pago efectivo necesitas un complemento de pago timbrado.
Lógica automatizada:
- Detectar facturas PPD sin complemento al cierre de mes
- Cruzar contra movimientos bancarios para identificar pagos efectivos
- Disparar timbrado de complemento de pago vía PAC
- Notificar al cliente con CFDI del complemento
Paso 6: Dashboard y alertas
Una vez con todo en Data Lake, dashboards típicos:
- CFDI emitidos vs cobrados (cartera vencida)
- CFDI recibidos vs pagados (cuentas por pagar)
- DIOT preliminar vs DIOT presentada
- Tax provisión IVA e ISR mensual
- CFDI cancelados (alertar si supera 3 por ciento)
- Pagos sin CFDI (alertar inmediato)
- CFDI duplicados con mismo concepto (anomalía)
El caso real: cuando los datos se unifican, las anomalías aparecen
Una distribuidora multi país con 100 franquicias llegó con 13 millones de filas legacy y 197 tablas inconsistentes. Catalizadora implementó:
- Data Lake Bronze a Silver a Gold sobre Supabase
- 3.6 millones de filas migradas en 48 horas con verificación fila a fila
- 197 tablas snapshot más 825 vistas Silver más 75 vistas Gold materializadas
- 100 franquicias operativas
- Inversión 26,000 USD fija, sin retainers
Hallazgos invisibles típicos en este patrón:
- Anomalías financieras: inventario con cantidades negativas, esquemas de pago paralelos, entradas sin origen
- Fuga de ingresos: servicios prestados pero nunca cobrados, cientos de transacciones al año olvidadas
- Problemas de integridad: archivos bancarios editados manualmente, registros manipulados, balances que no cuadran
No buscamos problemas, los datos los revelan. Esto aplica directo a reportería fiscal CFDI: una vez con todos los CFDI consolidados, anomalías como facturas duplicadas, cancelaciones masivas en mes de cierre y complementos faltantes saltan solas.
Lo que NO debes hacer
- Armar DIOT en Excel manual cada mes: 8 a 20 horas perdidas más errores humanos en mes de cierre
- Sin guardar XML crudo: cuando SAT pide aclaración 3 años después y solo tienes PDF, no puedes responder
- Saltarte conciliación CFDI vs banco: descubres en auditoría que cobraste sin facturar o facturaste sin cobrar
- Pagar PAC sin extraer su API: el dato es tuyo y debe vivir en tu Data Lake
Próximos pasos
Si tu pyme México emite o recibe más de 200 CFDI al mes y tu contador gasta más de 12 horas al mes en reportería fiscal, automatizar amortiza en 6 a 12 meses. Stack Python más PAC más Postgres más dashboards.
Catalizadora arma ese diagnóstico en una llamada de 30 minutos, sin pitch deck, conversación real sobre tu operación.
- MAGIA Core construye sistemas a medida con Data Lake fiscal, integraciones PAC y SAT, DIOT automática, complementos y dashboards ejecutivos en 12 semanas por 15,000 USD. Código a tu nombre.
- Para casos enterprise con motor de IA y observabilidad de primer día, MAGIA Forge entrega en 12 semanas por 20,000 USD.