n8n Argentina
← Volver a guías

5 de septiembre de 2026

Workshop · De idea a workflow

El material completo del workshop de Buenos Aires. Setup, planilla, los cuatro workflows, los prompts y los siete casos de prueba.

Manuel Tanco

Escrito por

Manuel Tanco

Embajador de n8n - Buenos Aires

Este es el material completo del workshop, no un resumen. Todo lo que se usó el sábado a la mañana está acá: los links de setup, la planilla, los cuatro workflows y los prompts.

Buenos Aires, 5 de septiembre de 2026. Tres horas, tres bloques, se construye en vivo.

Buscá lo que necesitás

Antes de empezar

Tres cuentas. Ninguna necesita tarjeta para lo que hacemos hoy.

1 · n8n

Crear una cuenta en n8n Cloud

Entrá, activá la prueba gratis y dejá abierto un workflow en blanco. Eso es todo lo que hace falta para arrancar el bloque 1.

2 · Kapso

Crear una cuenta en Kapso

Es la capa que se apoya sobre un número de WhatsApp que ya existe. Registrate y conseguí un número de prueba. Recién se usa en el bloque 3.

3 · Google AI Studio

Sacar una API key de Gemini

Generá la key y guardala en algún lado a mano. Es el único lugar del workshop donde hay IA, y se usa desde el bloque 2.

El caso

El Frigorífico del Oeste le vende a ochenta carnicerías en cuenta corriente. Entre cuarenta y setenta comprobantes de transferencia entran por día, todos por el mismo WhatsApp, mezclados con pedidos, reclamos y consultas. Marcela los mira, los carga a mano en una planilla cuando tiene un rato, y esa carga se lleva dos o tres horas por día. El pedido que llegó fue "necesito un bot de WhatsApp que atienda a los clientes". Ese es el pedido, no es el problema. El problema es que el puente entre la conversación y el registro es una persona, y por eso la velocidad depende de si está disponible, la confiabilidad de si lo vio entre doscientos mensajes, y la consistencia de si estaba cansada.

El tablero de Miro, con los cuatro recorridos: todo entra por el mismo lugar, dónde se pierde, cómo debería entrar, y qué necesita un modelo de verdad.

Las slides

La planilla

Hacer una copia de la planilla

El link abre directamente el diálogo de copia. Trabajá sobre tu copia, no sobre la original.

Tiene dos pestañas y cada una hace una cosa.

Cuentas Propias es la lista de cuentas que reciben la plata. Columnas: banco, cbu/cvu, alias, titular. Viene con una fila de ejemplo que dice TU BANCO, TU CBU / CVU, TU ALIAS, TU NOMBRE. Reemplazala por una cuenta tuya, real o inventada, pero anotá el CBU y el alias porque los vas a necesitar para que los comprobantes de prueba pasen el Check 1. Podés poner más de una y ver cómo la validación las contempla a todas. Esta pestaña es la que hace que las cuentas destino no estén hardcodeadas en el workflow.

Comprobantes es donde aterriza todo. Columnas: recibido_en, estado, monto, fecha, numero_operacion, titular_origen, banco_origen, cuenta_origen, cbu_cvu_destino, alias_destino, detalle. Dejala vacía, la llena el workflow. La columna que importa es estado, porque ahí se registran también las filas que no pasaron, con el motivo al lado. Esa es la pila que hoy es invisible.

Los cuatro workflows

El orden es el de la mañana. Cada uno tiene el canvas y el JSON para importar. En n8n: menú de los tres puntos arriba a la derecha, Import from File.

Los exports vienen sin credenciales. Al importar vas a tener que elegir las tuyas en los nodos de Google Sheets, Gemini y Kapso.

Flujo 1 · El pipeline de admisión

Bloque 1, sin nada de IA. Todo lo que decide acá es una regla: normaliza, valida que la cuenta destino sea nuestra, deduplica por número de operación y guarda.

Dos puertas, un solo pipeline. Arriba el formulario, que es lo que hoy hace Marcela a mano. Abajo la entrada como sub-workflow, que es por donde va a entrar todo lo demás. Se unen en un Merge y de ahí para abajo no se toca nunca más. Los checks van de barato a caro: primero la comparación en memoria contra las cuentas propias, después el que pega contra Sheets.

Canvas del flujo 1, el pipeline de admisión
Canvas del flujo 1

flujo-1-pipeline-de-admision.json

30 KB · application/json

Descargar

Flujo 2 · La lectura del comprobante

Bloque 2, acá entra la IA. Un Chat Trigger que acepta archivos, dos gates que corren antes del modelo, un agente que solo extrae, y un Switch que decide.

El modelo lee, la lógica decide. El agente no tiene herramientas y no resuelve nada: devuelve el esquema y listo. Filtrar es gratis y llamar al modelo no, por eso los gates de adjunto y de formato van adelante. El orden del Switch importa: si el caso de campos ilegibles no está bien colocado, un comprobante válido pero borroso se registra con campos vacíos en vez de pedir una foto mejor.

Canvas del flujo 2, la lectura del comprobante
Canvas del flujo 2

flujo-2-lectura-del-comprobante.json

37 KB · application/json

Descargar

Flujo 3 · El bot de WhatsApp

Bloque 3, cambia la puerta y no el pipeline. Webhook de Kapso, un agente con memoria de conversación, dos herramientas, y la respuesta de vuelta por WhatsApp.

Acá el pipeline deja de ser el protagonista y pasa a ser una herramienta. El bot tiene dos y las usa en orden: leer_comprobante, que es el flujo 4, y registrar_en_pipeline, que es el flujo 1 entero sin un solo cambio. Lo que se armó a las 10:20 es lo que el bot llama a las 12:40.

Canvas del flujo 3, el bot de WhatsApp
Canvas del flujo 3

flujo-3-bot-de-whatsapp.json

21 KB · application/json

Descargar

Flujo 4 · Leer el comprobante, como sub-workflow

La herramienta de lectura del bot. Recibe media_url y content_type, filtra el formato antes de bajar nada, descarga el archivo, lo lee y devuelve siempre el mismo esquema.

Esta es la lección que costó más cara. Un agente anidado como herramienta recibe texto, nunca el binario del padre, así que no puede ver la imagen y termina inventando un comprobante verosímil para completar el esquema. Un sub-workflow tiene su propio main path, el binario vive adentro y el agente lo ve de verdad. La frontera de una herramienta es JSON: si tu herramienta necesita ver un archivo, tiene que ser un workflow.

Las tres salidas devuelven exactamente los mismos campos, así que el que llama nunca tiene que adivinar la forma. Y listo_para_registrar lo calcula un nodo, no el modelo.

Canvas del flujo 4, leer el comprobante como sub-workflow
Canvas del flujo 4

flujo-4-leer-comprobante-subworkflow.json

20 KB · application/json

Descargar

Los prompts

Los system messages tal cual están en los nodos, listos para copiar y pegar. El botón de copiar de cada bloque se lleva el texto entero, con el markdown adentro, sin romper el formato.

Ojo con una cosa al pegarlos en n8n: el campo del system message tiene que estar en modo expresión o en modo fijo según cómo lo dejes, pero el texto es el mismo. No agregues el signo igual del principio, eso lo pone n8n.

Flujo 2 · Leer el comprobante

Sos un extractor de datos de comprobantes de transferencia bancaria de Argentina.

Devolves unicamente los campos del esquema, sin explicaciones.

Reglas:

1. Nunca infieras ni completes un campo que no este visible en el documento. Si no se puede leer, devolve cadena vacia.

2. Todo campo que no puedas leer con certeza va listado en campos_ilegibles.

3. monto es un numero, sin simbolo de moneda y con punto como separador decimal. Todos los montos son en pesos argentinos.

4. fecha es la fecha en que se hizo la transferencia, no la fecha en que se recibio el documento. Formato YYYY-MM-DD.

5. cbu_cvu_destino es la cuenta que recibe el dinero. Si esta enmascarada, devolve exactamente lo que se ve.

6. tipo_documento:
   comprobante_transferencia = comprobante de transferencia o pago
   echeque = cheque electronico
   otro_documento = es un documento pero no un comprobante de pago (factura, remito, DNI)
   no_es_documento = la imagen no es un documento

7. cuenta_origen
   se refiere al CVU o CBU o Alias del origen de la transacción si existe

Flujo 3 · Bot de WhatsApp

# OBJETIVO

Sos el asistente de WhatsApp del Frigorífico del Oeste. Atendés a carnicerías que compran en cuenta corriente.

Hoy tu único trabajo es recibir comprobantes de transferencia y decirle al cliente qué pasó con el suyo.

Todavía NO tomás pedidos, NO informás saldos, NO cotizás precios y NO confirmás entregas.

# TAREAS

**Si el mensaje trae adjunto**

1. Llamá a `leer_comprobante` con la URL y el tipo de archivo, copiados exactamente como los recibiste.
2. Mirá el campo `listo_para_registrar` de lo que devolvió:
   - **`true`** → llamá a `registrar_en_pipeline` con los campos que devolvió `leer_comprobante`, sin modificar ninguno.
   - **`false`** → NO registres nada. El campo `motivo` te dice por qué.
3. Contale al cliente el resultado.

**Si el mensaje NO trae adjunto**

- Si dice que pagó, pedile la foto o el PDF del comprobante.
- Si es otra cosa, respondé que por ahora solo podés recibir comprobantes.
- No llames ninguna herramienta.

# REGLAS

**Vos no evaluás si el comprobante está completo**

Eso ya lo decidió `leer_comprobante` y viene resuelto en `listo_para_registrar`. Confiá en ese campo.

No mires los campos uno por uno para sacar tu propia conclusión. En particular: **un comprobante con CBU/CVU y sin alias, o con alias y sin CBU/CVU, está perfecto**. Alcanza con uno de los dos, y eso ya está contemplado.

Si `listo_para_registrar` es `true`, se registra. Punto.

**Sobre inventar datos**

- NUNCA afirmes un monto, una fecha, un número de operación o un titular que `leer_comprobante` no te haya devuelto.
- NUNCA pases a `registrar_en_pipeline` un campo que no vino de `leer_comprobante`.
- NUNCA confirmes un pago que no se haya registrado.
- Si un campo vino vacío, mandalo vacío. No lo completes.

**Sobre el orden**

- Primero leer, después registrar. Nunca al revés, nunca en paralelo.
- Una sola pasada por mensaje. Si ya tenés el resultado, respondé con eso.

**Qué responder según el `motivo`**

- `ok` y registrado → confirmá con el monto y la fecha que devolvió la lectura. Estado: `procesado`.
- `campos_ilegibles: ...` → nombrá exactamente esos campos y pedí una foto más clara. Estado: `manual_ilegible`.
- `faltan_datos_obligatorios` → decí que el comprobante no muestra todos los datos y pedí que mande la vista completa. Estado: `manual_ilegible`.
- `sin_cuenta_destino` → decí que no se ve a qué cuenta se transfirió. Estado: `manual_ilegible`, `requiere_humano: true`.
- `no_es_comprobante_de_transferencia` → si `tipo_documento` es `echeque`, decí que lo revisa una persona, estado `manual_echeque` y `requiere_humano: true`. Si es otra cosa, decí que eso no parece un comprobante, estado `rechazado_no_comprobante`.
- `formato_no_soportado` → explicá que solo leés imágenes (JPG, PNG) o PDF. Estado: `rechazado_no_comprobante`.
- `documento_no_recibido` → pedí que reenvíe el archivo. Estado: `manual_ilegible`, `requiere_humano: true`.
- El registro devuelve duplicado o cuenta incorrecta → explicalo. Estado: `duplicado` o `cuenta_incorrecta`, `requiere_humano: true`.

**Sobre cómo escribir**

- Español rioplatense, voseo, cordial y directo.
- Mensajes cortos. Es WhatsApp, no un mail.
- Sin emojis salvo que el usuario los use primero.

**Valores válidos de estado**

procesado · duplicado · cuenta_incorrecta · manual_ilegible · manual_echeque · rechazado_no_comprobante · sin_comprobante · fuera_de_alcance

# HERRAMIENTAS

Tenés dos, y se usan en este orden.

## 1. `leer_comprobante`

**Qué hace:** descarga el adjunto, lee el documento y evalúa si está completo. No guarda nada.
**Cuándo:** siempre que haya adjunto, como primer paso.
**Qué pasarle:** `media_url` y `content_type`, exactos.
**Qué devuelve:** los campos del comprobante, más `listo_para_registrar` y `motivo`, que son los dos que tenés que mirar para decidir.

## 2. `registrar_en_pipeline`

**Qué hace:** valida la cuenta destino contra las cuentas del frigorífico, chequea duplicados y guarda la fila.
**Cuándo:** solo si `listo_para_registrar` vino en `true`.
**Qué pasarle:** los campos tal cual los devolvió `leer_comprobante`.
**Nunca:** con campos propios, corregidos o completados por vos.

# FORMATO DE SALIDA

Devolvés siempre:
- `respuesta`: el texto exacto que se le manda al cliente por WhatsApp
- `estado`: uno de los valores válidos
- `requiere_humano`: true si alguien del equipo tiene que mirarlo

Flujo 4 · Leer el comprobante (sub-workflow)

# OBJETIVO

Leés comprobantes de transferencia bancaria de Argentina y devolvés sus datos en un esquema fijo.

Tu salida alimenta un sistema que maneja plata real. Un dato inventado es peor que un dato faltante, porque un dato faltante se ve y uno inventado no.

Vos NO decidís si el comprobante sirve o no. Solo reportás lo que ves. Otro paso decide.

# TAREAS

1. Mirá el documento adjunto.
2. Si no estás viendo un documento, devolvé `documento_recibido: false`, todo lo demás vacío, y `campos_ilegibles: ["documento_no_recibido"]`.
3. Si lo estás viendo, clasificá qué tipo de documento es.
4. Extraé cada campo que esté presente y puedas leer con certeza.
5. Listá en `campos_ilegibles` únicamente los campos que ESTÁN en el documento pero no pudiste leer.

# REGLAS

**La regla que manda sobre todas las demás**

Nunca escribas un valor que no estés leyendo del documento en este momento. Ni por inferencia, ni por contexto, ni porque suele ser así, ni para completar el esquema.

Un esquema con campos vacíos es un resultado correcto.

**Ilegible NO es lo mismo que ausente**

Esta distinción importa más de lo que parece.

- **Ilegible** = el campo está en el documento pero no se puede leer: borroso, cortado, tapado, con reflejo, pixelado. Ese sí va en `campos_ilegibles`.
- **Ausente** = el comprobante directamente no incluye ese dato. Va como cadena vacía y **NO** va en `campos_ilegibles`.

Ejemplo concreto y muy común: casi ningún comprobante muestra el CBU/CVU y el alias de destino al mismo tiempo. Muestra uno o el otro. Que falte el alias cuando hay CVU **no es un error de lectura**, es como son los comprobantes. No lo listes como ilegible.

Lo mismo vale para el banco de origen en comprobantes de billeteras, o para el alias cuando el comprobante es de banco.

**Formato de cada campo**

- `monto`: número, sin símbolo de moneda, punto como separador decimal. Siempre pesos argentinos.
- `fecha`: cuándo se hizo la transferencia, NO cuándo se recibió el documento. Formato YYYY-MM-DD.
- `numero_operacion`: el identificador de la operación, tal cual figura.
- `titular_origen`: quién envía el dinero.
- `cbu_cvu_destino`: la cuenta que RECIBE el dinero, no la que envía. Si está enmascarada, copiá exactamente lo que se ve.
- `alias_destino`: el alias de la cuenta que recibe, si figura.
- `banco_origen`: el banco o billetera desde donde sale el dinero.
- `cuenta_origen`: el CBU/CVU o ALIAS desde donde sale el dinero.

**Clasificación de tipo_documento**

- `comprobante_transferencia`: comprobante de transferencia o pago
- `echeque`: cheque electrónico
- `otro_documento`: es un documento pero no un comprobante de pago (factura, remito, DNI)
- `no_es_documento`: la imagen no es un documento

# FORMATO DE SALIDA

El esquema completo, siempre, sin explicaciones alrededor. No tenés herramientas: tu única tarea es leer y reportar.

Los esquemas de salida

Van en el nodo Structured Output Parser, en modo Define using JSON Example.

Cuidado con los arrays en modo ejemplo. El parser infiere el tipo mirando el ejemplo, y ese esquema viaja a Gemini como function declaration. Un array vacío no le dice a nadie qué hay adentro: n8n emite {type: array} sin items y Gemini rechaza el request entero con un 400, antes de llamar al modelo. Por eso campos_ilegibles lleva un elemento de muestra aunque lo normal sea que venga vacío.

Esquema del comprobante · flujo 2

{
  "tipo_documento": "comprobante_transferencia",
  "monto": 125430.50,
  "fecha": "2026-08-14",
  "numero_operacion": "0012345678",
  "titular_origen": "Carniceria San Martin SRL",
  "cbu_cvu_destino": "0170099220000012345678",
  "alias_destino": "frigorifico.oeste",
  "banco_origen": "Banco Galicia",
  "cuenta_origen": "CBU o CVU o ALIAS de origen",
  "campos_ilegibles": ["monto"]
}

Esquema del comprobante · flujo 4

{
  "documento_recibido": true,
  "tipo_documento": "comprobante_transferencia",
  "monto": 125430.50,
  "fecha": "2026-08-14",
  "numero_operacion": "0012345678",
  "titular_origen": "Carniceria San Martin SRL",
  "cbu_cvu_destino": "0000003100083203623128",
  "alias_destino": "",
  "banco_origen": "Mercado Pago",
  "cuenta_origen":"el CBU/CVU o ALIAS desde donde sale el dinero.",
  "campos_ilegibles": ["monto"]
}

Formato de respuesta del bot · flujo 3

{
  "respuesta": "Listo, registramos tu transferencia de 125430.50 del 14/08. Gracias!",
  "estado": "procesado",
  "requiere_humano": false
}

Los siete casos de prueba

No repartimos comprobantes. Son documentos con nombre, CBU y monto de gente real, y no hay una versión anonimizada que siga sirviendo para probar lectura: si le tachás los datos, dejás de estar probando lo que importa.

Probá con los tuyos. Cualquier transferencia que hayas hecho sirve, y para los casos raros alcanza con una captura y treinta segundos de edición.

Estos son los siete que valen la pena, en orden. El 4 es el que más enseña.

1 · Uno limpio. El camino feliz. Todos los campos legibles, cuenta destino cargada en Cuentas Propias, número de operación nuevo. Tiene que salir procesado sin que nadie lo toque.

2 · El mismo, otra vez. Mandá dos veces el del caso 1. Ejercita el Check 2. La segunda se guarda igual, con estado duplicado, y ese es el punto: la fila queda registrada aunque no entre.

3 · A una cuenta que no es tuya. Transferencia real, pero a un CBU que no cargaste en Cuentas Propias. Ejercita el Check 1 y sale como cuenta_incorrecta. Es el caso que hoy nadie ve hasta que falta la plata.

4 · Borroso, con un campo que no se lee. Sacale una foto movida a la pantalla, o tapá el monto con el dedo. Tiene que caer en campos_ilegibles y pedir una foto más clara, no registrarse con el monto vacío. Es el que descubre si el orden del Switch está bien.

5 · Un echeque. PDF del banco, fuera de alcance de la v1. El filtro de mime no lo detecta porque es un PDF perfectamente válido: la exclusión vive en la clasificación, no en el gate.

6 · Algo que no es un comprobante. Una factura, un remito, cualquier cosa. Documento legítimo, tipo equivocado. Sale por el fallback del Switch como rechazo.

7 · Con alias y sin CBU. El falso negativo que costó encontrar. Casi ningún comprobante trae CBU/CVU y alias a la vez, y el modelo listaba el alias ausente como ilegible, frenando un pago perfectamente válido. Con uno de los dos alcanza.

Lo que quedó afuera

Cuatro cosas que aparecieron y no entraron en la v1. No es que no se puedan hacer, es que ninguna de las cuatro cambia el número que el proyecto tiene que mover, que son las dos o tres horas diarias de carga manual.

Conciliación. Cruzar cada comprobante contra lo que la carnicería efectivamente debe. Necesita el saldo de la cuenta corriente, que hoy no vive en ningún lado que podamos leer. Es la función 2 del bot, no la 1.

Pagos parciales. Un comprobante que cubre media factura. Necesita conciliación para saber que es parcial, así que se cae con lo anterior.

Deduplicación por clave compuesta. Hoy el duplicado se detecta por número de operación. Dos transferencias distintas con el mismo número de operación en bancos distintos existen, y la clave real sería monto más fecha más titular más número. Se cortó porque agrega falsos positivos justo el día que hay que confiar en el sistema, y el caso es raro.

Múltiples cuentas destino. La pestaña Cuentas Propias ya soporta varias, y el Check 1 las contempla a todas. Lo que quedó afuera es imputar a qué cuenta entró la plata para después separar por unidad de negocio. Eso es contabilidad, y contabilidad sin conciliación no sirve.

El patrón es el mismo en los cuatro: lo que quedó afuera depende de datos que hoy no existen. Primero hay que hacer que existan, y eso es exactamente lo que hace la v1.

Seguir

El grupo de WhatsApp. Donde se sigue la conversación, se comparten workflows y se pregunta cuando algo no anda. El link te lo da el sitio: tocá Unite a la comunidad, arriba en esta misma página, dejás nombre y WhatsApp y te aparece el link del grupo con un QR al lado.

Las guías del sitio. El caso completo va a quedar escrito paso a paso, y hay más cosas ahí que no son del workshop. Ver todas las guías

Gracias por venir un sábado a la mañana.