Tres nodos n8n, un archivo listo para el cumplimiento
Lo más difícil de la automatización del cumplimiento rara vez son las normas. Es la fontanería que conecta esas normas con los sistemas que ya hacen funcionar tu negocio. Las normas dicen que toda factura B2B debe estar en un formato electrónico estructurado, archivada durante diez años y enlazable con una chain of custody a prueba de manipulaciones. Tu software contable dice “tienes un nuevo adjunto en el buzón compartido”. Tender un puente entre esos dos mundos es donde la mayoría de los equipos se atascan.
Este artículo recorre el flujo de trabajo más pequeño que realmente cierra esa brecha, construido con n8n y el nodo comunitario n8n-nodes-sealdoc. Tres nodos conectados. Unas 200 líneas de JSON cuando exportas el flujo. Cero código propio.
Qué vamos a construir
Un flujo que, por cada PDF entrante, hace lo siguiente:
- Recoge el archivo desde un trigger a tu elección (buzón, carpeta vigilada, subida en Slack, un webhook externo, cualquier cosa que n8n pueda escuchar).
- Lo entrega a SealDoc, que lo convierte a PDF/A-3, embebe el XML Factur-X junto a la factura renderizada, añade un sello de tiempo RFC 3161 y empaqueta todo en un archivo descargable.
- Almacena el resultado donde diga tu política de retención.
Lo que no tienes que construir tú: la conversión a PDF/A-3, la extracción del XML Factur-X, el sellado de tiempo, la pista de auditoría, el hash del manifiesto del evidence pack, la lógica de reintento para la autoridad de sellado. La API de SealDoc hace ese trabajo detrás de un único endpoint HTTP.
Requisitos previos
- Una instancia de n8n, ya sea self-hosted o n8n Cloud. El nodo comunitario funciona en ambas.
- Una cuenta de SealDoc con al menos el plan Starter (las moat-features de las que depende este flujo, custody, sellos de tiempo y evidence packs, vienen desde Starter).
- Una clave API de SealDoc. Genera una en el panel bajo API keys y copia el secreto una sola vez (nunca lo volvemos a mostrar).
Instala el nodo comunitario:
npm i n8n-nodes-sealdoc
Reinicia n8n. El nodo SealDoc aparece ahora en Nodes con tres recursos: Job, Validator y Peppol.
Nodo 1, el trigger
Elige el trigger que coincida con el lugar donde aterrizan hoy tus facturas. Usaremos Gmail Trigger para este recorrido porque es la forma más habitual que vemos, pero el patrón es idéntico para IMAP, OneDrive, SharePoint, una URL de Webhook de n8n o una carpeta vigilada.
Configura el Gmail Trigger para dispararse con nuevos mensajes que tengan un adjunto PDF en una etiqueta concreta, p. ej. incoming-invoices. La salida de este nodo es el PDF binario en attachments[0].data.
Nodo 2, SealDoc Job · Create
Arrastra un nodo SealDoc al canvas, pon Resource en Job y Operation en Create. Configura:
- File: enlaza a
{{ $binary.attachments_0 }}(el PDF del Nodo 1). - Embed Factur-X: ON. SealDoc detecta automáticamente los campos de la factura y genera el XML estructurado; si el PDF de origen ya contiene un adjunto XML, SealDoc lo respeta y valida en lugar de sobrescribir.
- Timestamp: ON. El PDF/A-3 de salida llevará un sello de tiempo RFC 3161 emitido por una TSA que operamos, consultable más tarde como prueba de cuándo existió el documento.
- Retention category: elige la que exija tu legislación fiscal (la categoría correspondiente a la normativa española está en el desplegable).
El nodo devuelve de inmediato un jobId y un status de pending. No esperes aquí de forma síncrona. Una conversión Factur-X más sello de tiempo suele completarse en menos de cinco segundos para una factura normal, pero el procesamiento de PDF no es determinista y no quieres que un PDF de declaración fiscal lento bloquee toda tu cola.
Nodo 3, SealDoc Job · Get
Añade otro nodo SealDoc. Pon Resource en Job y Operation en Get. Enlaza Job ID a {{ $node["SealDoc Create"].json.jobId }}. Envuelve el nodo en la primitiva Wait de n8n con un retraso de 2 segundos y un máximo de 10 iteraciones, haciendo polling hasta que status sea completed o failed.
Cuando completed, la respuesta lleva un downloadUrl válido cinco minutos. La URL apunta al PDF/A-3 convertido, que ahora cumple Factur-X, está sellado en tiempo y registrado en nuestra chain of custody.
También obtienes un evidencePackUrl si tu plan incluye evidence packs. Ese ZIP contiene el PDF original, el PDF/A-3 convertido, el XML Factur-X, el token RFC 3161, el archivo de hash del manifiesto y un recibo JSON que enumera cada paso. A los auditores les encanta porque es autocontenido y verificable sin conexión; puedes entregarle una copia a un inspector fiscal y podrá comprobar la integridad sin llamar a nuestros servidores.
Y los errores
SealDoc devuelve motivos de fallo estructurados en el campo failureReason. Los cuatro que verás en la práctica:
validation_failed, el PDF de origen está malformado o protegido con contraseña. Devuélvelo al equipo que lo subió.unsupported_source, por ejemplo un PDF realmente cifrado que no podemos abrir. Devuélvelo al remitente.timestamp_unavailable, nuestra TSA tuvo una caída. Reintentamos automáticamente; si se agota el presupuesto de reintentos, el job acaba enfailedy puedes relanzarlo.quota_exceeded, el cupo mensual de jobs de tu plan ha tocado techo. O subes de plan o esperas al reseteo.
En n8n, enruta la rama failed del nodo Get a una notificación de Slack o correo para que una persona se entere cuando algo está realmente atascado.
Por qué bastan tres nodos
Te darás cuenta de que este flujo no hace por sí mismo lógica de validación, firma ni archivado. Esa es la idea. La API de SealDoc es la frontera; tu flujo n8n es el tejido conectivo entre esa frontera y tus sistemas de negocio. Cuando entre en vigor el mandato B2B belga no tendrás que reconstruir este flujo. Cuando arranque la obligación francesa de septiembre de 2026 no tendrás que reconstruirlo. Cuando el regulador actualice el perfil Factur-X en 2027, actualizas la versión del nodo SealDoc.
Ese es el valor del patrón connector: el vaivén regulatorio vive en nuestra base de código, no en la tuya.
Más allá de n8n
Si no usas n8n, cada operación de este tutorial también está disponible directamente a través de la API REST de SealDoc, o vía Webhooks si prefieres notificaciones push al polling. El menú completo vive en nuestra página de integraciones, con ejemplos pegables para cada superficie. Los conectores de Make, Zapier y Exact Online están en construcción activa; si tu stack usa alguno, escríbenos para acceso anticipado.
La fontanería del cumplimiento está resuelta. Lo que hagas con el tiempo que ahorras, depende de ti.