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 una factura debe seguir siendo legible, auténtica e íntegra durante todo el plazo de conservación, con un registro de lo que le ha ocurrido. Tu buzón dice “tienes un nuevo adjunto”. Tender un puente entre esos dos mundos es donde la mayoría de los equipos se atascan.
Este artículo recorre el flujo más pequeño que cierra esa brecha, construido con n8n y el nodo comunitario n8n-nodes-sealdoc. Tres nodos conectados, cero código propio.
Qué vamos a construir
Un flujo que, con cada PDF entrante, hace lo siguiente:
- Recoge el archivo desde el trigger que elijas: un buzón, una subida en Slack, una unidad en la nube, un webhook externo, cualquier cosa que n8n pueda escuchar.
- Lo entrega a SealDoc, que lo convierte a PDF/A-3, comprueba la conformidad PDF/A, solicita un sello de tiempo RFC 3161 y registra cada paso en una pista de auditoría con cadena de hashes.
- Guarda el resultado allí donde lo indique tu política de retención.
Lo que no construyes tú: la conversión a PDF/A-3, el sellado de tiempo y sus reintentos, la pista de auditoría, el evidence pack. SealDoc hace ese trabajo detrás de una sola llamada a la API.
Requisitos previos
- Una instancia de n8n autoalojada con los nodos comunitarios habilitados.
- Un espacio de trabajo de SealDoc con el plan Starter o superior. Con Starter empiezan los sellos de tiempo y los evidence packs, y este flujo se apoya en ambos. Consulta los precios.
- Una clave API de SealDoc, creada en la app de SealDoc en Integration → API Keys. Cópiala enseguida: solo se muestra una vez.
Instala el nodo en n8n desde Settings → Community nodes → Install, con el nombre de paquete n8n-nodes-sealdoc. Si prefieres instalar los nodos a mano, ejecuta esto en tu carpeta de nodos de n8n (normalmente ~/.n8n/nodes) y reinicia n8n:
npm i n8n-nodes-sealdoc
Crea la credencial en Credentials → New → SealDoc API y pega tu clave en API Key. El nodo SealDoc ofrece ahora cinco recursos: Document, Invoice, Job, Peppol Check y Validator. Este flujo usa Job.
Nodo 1, el trigger
Elige el trigger que coincida con el lugar donde llegan hoy tus facturas. Aquí usamos el Gmail Trigger porque es un punto de partida habitual; el patrón es el mismo para IMAP, OneDrive, una URL de Webhook de n8n o cualquier otra fuente que entregue un archivo.
Configura el Gmail Trigger para que se dispare con los mensajes nuevos de una etiqueta como incoming-invoices y activa Download Attachments. n8n coloca entonces el primer adjunto en la propiedad binaria attachment_0.
Nodo 2, SealDoc · Job · Create
Añade un nodo SealDoc, cámbiale el nombre a Archive y pon Resource en Job y Operation en Create:
- Input Binary Field:
attachment_0. Es el nombre de la propiedad binaria del Nodo 1, escrito como texto plano. - Run OCR: opcional. Actívalo para documentos escaneados, así el PDF/A-3 recibe una capa de texto en la que se puede buscar.
El sello de tiempo no necesita ningún ajuste: con un plan Starter o superior, SealDoc solicita un sello de tiempo RFC 3161 para cada job.
El nodo sube el archivo y responde de inmediato con el ID del job:
{ "jobId": "8b1e4c3a-2f7d-4e9a-b6c5-0d4f2a7e9c13" }
La conversión se ejecuta en segundo plano, así que un PDF lento nunca bloquea tu cola.
Nodo 3, SealDoc · Job · Get
Añade un nodo Wait de unos segundos y, a continuación, otro nodo SealDoc con Resource Job, Operation Get y Job ID {{ $('Archive').item.json.jobId }}. Detrás, pon un nodo IF sobre status:
queuedoprocessing: vuelve al nodo Wait. Lleva un contador en el bucle para que un job atascado no lo mantenga en marcha para siempre.completed: el PDF/A-3 está listo.failed: envía el job a la ruta de errores que se describe más abajo.
Un job completado muestra sus pruebas en la respuesta: timestampedAt y timestampTokenBase64 para el sello de tiempo, outputHash para el resultado, isPdfACompliant para la comprobación de conformidad.
Para obtener el archivo, añade un nodo HTTP Request: GET https://api.sealdoc.eu/api/download/{{ $json.id }}, con Header Auth (X-Api-Key y tu clave) y Response Format File. Luego pásalo a tu nodo de almacenamiento.
Cada job tiene además un Legal Evidence Pack: GET /api/jobs/{id}/evidence-pack, con la misma cabecera. Ese ZIP siempre contiene compliance_passport.json, MANIFEST.json y manifest.sha256 y, cuando existen, el documento, chain_of_custody.json, ledger.json con public-keys.jwk y el token RFC 3161 timestamp_token.tsr. Es autocontenido y verificable sin conexión: un inspector fiscal puede comprobar su integridad sin llamar a nuestros servidores. SealDoc lo ensambla justo después del job; si lo pides en los primeros instantes, la API responde 409 con una cabecera Retry-After.
Y los errores
Dos tipos, en dos momentos:
- Al enviar. Si falta el archivo o los idiomas de OCR no son válidos, recibes un 400; un plan sin la función da un 402, y un límite mensual agotado da un 409
quota_reached. En esos casos no se crea ningún job y el nodo SealDoc detiene el flujo. Configura su ajuste On Error para que continúe con una salida de error si quieres enrutar estos casos. - Durante el procesamiento. El job termina con el estado
failed, yerrorMessageindica el motivo, por ejemplo un archivo que no se puede abrir. Dirige la ramafailedde tu nodo IF a Slack o al correo electrónico, para que una persona sepa que algo requiere atención.
Una autoridad de sellado de tiempo que no responde no hace fallar el job. El job se completa, y compliance.rfc3161Timestamp en la respuesta de Get muestra si el sello de tiempo está presente.
Por qué bastan tres nodos
Este flujo no contiene lógica propia de conversión, sellado de tiempo ni archivado. Esa es la idea. La API de SealDoc es la frontera; tu flujo de n8n es el tejido conectivo entre esa frontera y tus sistemas de negocio. Cuando las normas o los formatos evolucionan, SealDoc evoluciona detrás de la misma llamada a la API, y tú actualizas la versión del nodo.
Este flujo archiva los documentos que recibes. Para las facturas que envías, el mismo nodo tiene el recurso Invoice, que convierte datos estructurados en una factura Factur-X, XRechnung o Peppol BIS. Consulta cómo generar una factura electrónica conforme con n8n.
Más allá de n8n
Todo lo que aparece en este tutorial también está disponible directamente a través de la API REST de SealDoc. Desde el plan Growth, los webhooks envían job.processing, job.completed y job.failed a tu propio endpoint, así que puedes prescindir por completo del bucle de polling. Todas las formas de conectarse están en nuestra página de integraciones.
La fontanería del cumplimiento está resuelta. Lo que hagas con el tiempo que ahorras depende de ti.