Automatizar facturación electrónica con n8n: workflow completo (Stripe + FacturAPI)

Guía técnica para construir un pipeline n8n que detecta pagos, captura datos fiscales y timbra CFDI 4.0 automáticamente. Con workflow exportable y manejo de errores en producción.

ACTUALIZADO: 21 DE MAYO DE 2026
6 min de lectura
D

DevActivo

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:

  1. Cliente paga con Stripe (suscripción mensual o cobro único)
  2. Stripe envía webhook a n8n con el evento invoice.paid o charge.succeeded
  3. n8n busca los datos fiscales del cliente en tu CRM (HubSpot/Pipedrive/DB)
  4. Si faltan datos fiscales, envía email pidiendo capturarlos via formulario
  5. Cuando tiene datos completos, llama a FacturAPI para timbrar
  6. FacturAPI regresa UUID, PDF y XML
  7. n8n envía PDF + XML por email al cliente
  8. n8n guarda la factura en tu CRM y en Google Drive como respaldo
  9. 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.paid OR === 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:

  1. Usa el sandbox de FacturAPI (API key sk_test_)
  2. Usa el modo test de Stripe con tarjetas de prueba
  3. Crea 5-10 facturas de prueba con datos reales pero RFCs de prueba (XAXX010101000)
  4. Valida que PDF llega al email, XML está bien formado, datos cuadran
  5. 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: