Automatizar facturación electrónica con n8n te ahorra entre 15 y 40 horas mensuales si emites más de 100 CFDIs al mes. Stripe cobra → n8n detecta el evento → consulta datos fiscales del cliente → llama a FacturAPI → envía PDF al cliente. Sin que tu equipo capture nada.
En esta guía construimos el workflow completo paso a paso. El mismo que tenemos corriendo en producción para varios clientes mexicanos. Tiempo de implementación: 3-5 horas si conoces n8n; 1-2 días desde cero.
Lo que vamos a construir
Flujo end-to-end:
- Cliente paga con Stripe (suscripción mensual o cobro único)
- Stripe envía webhook a n8n con el evento
invoice.paidocharge.succeeded - n8n busca los datos fiscales del cliente en tu CRM (HubSpot/Pipedrive/DB)
- Si faltan datos fiscales, envía email pidiendo capturarlos via formulario
- Cuando tiene datos completos, llama a FacturAPI para timbrar
- FacturAPI regresa UUID, PDF y XML
- n8n envía PDF + XML por email al cliente
- n8n guarda la factura en tu CRM y en Google Drive como respaldo
- Si algo falla, notifica al equipo por Telegram o Slack
Lo que necesitas antes de empezar
- n8n instalado: self-hosted (ver guía Docker) o n8n Cloud (desde 20 USD/mes)
- Cuenta de Stripe con productos configurados
- Cuenta de FacturAPI con CSD subido y API key
- CRM o DB donde almacenas clientes (HubSpot, Pipedrive, Notion, Supabase, lo que uses)
- Cuenta de email transaccional (Mailgun, SendGrid, o SMTP de tu hosting)
Paso 1: Webhook de Stripe a n8n
En n8n crea workflow nuevo y agrega nodo Webhook:
- HTTP Method: POST
- Path:
/stripe-paid - Response Mode: When last node finishes
- Response:
{"received": true}
n8n te da una URL tipo https://tu-n8n.com/webhook/stripe-paid. Cópiala.
En el dashboard de Stripe → Developers → Webhooks → Add endpoint:
- URL: la de n8n
- Events:
invoice.paid,charge.succeeded,checkout.session.completed - Guarda el signing secret de Stripe (lo usarás para validar firma)
Paso 2: Validar firma de Stripe (seguridad)
Cualquiera podría llamar a tu webhook con datos falsos. Agrega un nodo Function después del webhook:
const crypto = require('crypto');
const stripeSecret = $env.STRIPE_WEBHOOK_SECRET;
const signature = $input.first().headers['stripe-signature'];
const payload = JSON.stringify($input.first().body);
const timestamp = signature.split(',')[0].split('=')[1];
const sig = signature.split(',')[1].split('=')[1];
const signedPayload = timestamp + '.' + payload;
const expectedSig = crypto
.createHmac('sha256', stripeSecret)
.update(signedPayload)
.digest('hex');
if (sig !== expectedSig) {
throw new Error('Invalid Stripe signature');
}
return $input.first();
Paso 3: Filtrar solo eventos relevantes
Nodo IF:
- Condition:
{{ $json.body.type }}===invoice.paidOR ===charge.succeeded
Paso 4: Buscar datos fiscales del cliente
El customer_id de Stripe lo cruzas con tu CRM. Si usas HubSpot, agrega nodo HubSpot:
- Operation: Search Contact
- Search by: email del cliente (que viene en el webhook de Stripe)
- Get properties: rfc, regimen_fiscal, razon_social, codigo_postal, uso_cfdi
Si no usas HubSpot, sustituye por nodo de tu CRM o DB.
Paso 5: Manejar caso “sin datos fiscales”
Nodo IF después del CRM:
- Condition:
{{ $json.properties.rfc }}está vacío - True branch: enviar email al cliente con link a formulario donde captura sus datos fiscales
- False branch: continuar con el timbrado
El formulario puede ser un Google Form, Typeform, o página propia. Cuando el cliente lo llena, otro workflow de n8n actualiza el CRM y dispara el timbrado pendiente.
Paso 6: Llamar a FacturAPI
Nodo HTTP Request:
- Method: POST
- URL:
https://www.facturapi.io/v2/invoices - Authentication: Basic Auth → User:
sk_live_TU_API_KEY, Password: vacío - Body: JSON con el payload
Payload de ejemplo:
{
"customer": {
"legal_name": "{{ $json.properties.razon_social }}",
"tax_id": "{{ $json.properties.rfc }}",
"tax_system": "{{ $json.properties.regimen_fiscal }}",
"address": {
"zip": "{{ $json.properties.codigo_postal }}"
}
},
"items": [
{
"quantity": 1,
"product": {
"description": "{{ $('Webhook').first().json.body.data.object.description }}",
"product_key": "81111500",
"price": {{ $('Webhook').first().json.body.data.object.amount / 100 }},
"tax_included": true,
"taxes": [{ "type": "IVA", "rate": 0.16 }]
}
}
],
"payment_form": "03",
"payment_method": "PUE",
"use": "{{ $json.properties.uso_cfdi }}",
"type": "I"
}
Paso 7: Enviar PDF al cliente
Después del nodo HTTP de FacturAPI, agrega nodo Send Email (Mailgun, SMTP, etc.):
- To: email del cliente
- Subject:
Tu factura - {{ $json.folio_number }} - Body HTML con link al PDF:
{{ $json.pdf }} - Attachments: descargar PDF y XML desde URLs de FacturAPI y adjuntar
Paso 8: Respaldar en Google Drive
Para auditoría futura, guarda copia en Drive:
- Nodo Google Drive → Upload File
- Folder: estructura por año/mes
- Archivo: PDF + XML descargados
Paso 9: Manejo de errores
Conecta un nodo Error Trigger al workflow:
- Cuando cualquier paso falle, este nodo se dispara
- Nodo siguiente: enviar mensaje a Telegram/Slack con detalles del error
- Nodo adicional: registrar el evento en una tabla “facturas_pendientes” para reintento manual
Errores típicos y qué hacer:
- RFC inválido (CFDI40104): notificar al cliente para corregir, dejar pendiente
- SAT caído (503/504): reintentar en 5 minutos hasta 6 veces
- Rate limit FacturAPI: esperar 60 segundos y reintentar
- Email cliente rebota: notificar al equipo, no reintentar
Paso 10: Testing antes de producción
Antes de activar el workflow en prod:
- Usa el sandbox de FacturAPI (API key
sk_test_) - Usa el modo test de Stripe con tarjetas de prueba
- Crea 5-10 facturas de prueba con datos reales pero RFCs de prueba (XAXX010101000)
- Valida que PDF llega al email, XML está bien formado, datos cuadran
- Solo después cambia API keys a producción
Workflow completo (exportable)
Tenemos el workflow en formato JSON listo para importar a tu n8n. Si quieres una copia funcional con los nodos pre-conectados y solo cambias tus credenciales, escríbenos. Lo entregamos como parte del servicio o standalone por 1,500 pesos.
Costos operativos del workflow
Para un negocio con 500 facturas/mes:
- FacturAPI: 250-400 pesos/mes (timbres + plan)
- n8n self-hosted: 200-400 pesos/mes (VPS Hetzner)
- Stripe: ya lo pagas si vendes
- Mailgun: 0-150 pesos/mes (primeras 5,000 emails gratis)
- Google Drive: gratis hasta 15 GB
- Total: 450-950 pesos/mes
Comparado con un empleado dedicado a captura manual (15,000+ pesos/mes), el ROI es obvio.
Casos de uso reales que hemos implementado
- SaaS con suscripciones: Stripe Recurring + FacturAPI mensual sin que el cliente pida nada.
- Agencia de marketing: proyectos en Stripe + facturación con conceptos detallados desde Notion.
- Tienda WooCommerce: ver guía WooCommerce + CFDI.
- Consultora con timesheets: Toggl/Harvest + Stripe + FacturAPI = factura con horas y proyecto detallado.
Cuándo construirlo tú vs contratarnos
Si conoces n8n y tienes 1-2 días libres, construirlo tú es viable. Si tu equipo está saturado o no quiere pelear con webhooks de Stripe y errores de FacturAPI, contratarnos te ahorra 4-8 semanas de aprendizaje.
En DevActivo construimos pipelines completos como este desde 15,000 pesos. Incluye el workflow, testing, manejo de errores, deploy y 30 días de soporte. Ver integración de facturación electrónica y automatización con n8n para más detalles.
Servicios relacionados: