Parsear texto libre de Telegram en n8n: mi nodo Code para controlar barriles de cerveza (sin IA)

Hola de nuevo :waving_hand:

Sigo automatizando cosas de mi negocio (soy hostelero, autodidacta) con n8n. Comparto una que me costó afinar y creo que el patrón sirve para muchos workflows, no solo para un bar: entender mensajes de Telegram escritos a mano, con prisa y sin formato.

El caso: controlar cuánto se pierde en cada barril de cerveza. El encargado escribe en el grupo cosas como:

barril rubia
cañas 85
invitadas 6
personal 4
vacio rubia

No hay formulario ni botones: escribe como habla. El reto de n8n es convertir eso en datos fiables.

Cómo lo monté (estructura): un Telegram Trigger escuchando el grupo → un nodo Code que primero decide qué tipo de mensaje es por la primera palabra (barril / cañas / invitadas / personal / vacio) e ignora todo lo demás, así el mismo grupo sirve para hablar sin ensuciar los datos → y cuando llega vacio, cierra el barril, hace las cuentas y responde por Telegram.

Los 3 aprendizajes que quiero aportar:

1) Filtra por intención, no por formato. En vez de exigir una sintaxis, miro la primera palabra y descarto el resto. La gente no rellena formularios a media faena; escribe como puede.

const txt = ($json.message?.text || '').trim().toLowerCase();
const primera = txt.split(/\s+/)[0];
const TIPOS = ['barril','cañas','canas','invitadas','personal','vacio'];
if (!TIPOS.includes(primera)) return []; // no es para mi: fuera

2) Lo importante no es calcular la merma, es NO llamar merma a lo que no lo es. Las cañas invitadas, las del personal y la purga del grifo son decisiones tuyas, no fugas. Si las metes en el saco de “pérdidas”, el número deja de creerse (y con razón). Van restadas y con su nombre:

merma_real = litros_teoricos - litros_servidos - invitadas - personal - purga

En el aviso final salen separadas: “esto NO es pérdida — ya está descontado”. Esa honestidad es lo que hace que el dueño se crea el resto.

3) Que el propio workflow dude de sí mismo. Si un barril da más cañas de las teóricas, no es un milagro: es que el vaso está mal medido. En vez de reportar un dato imposible, el bot avisa: “mide otra vez el vaso”. Un número que se sabe falso no se publica.

Todo corre en local, 0 € por proceso y sin nube — mi condición de siempre.

Dos preguntas para la comunidad. Una: para parsear texto libre, ¿os quedáis con un nodo Code como este o tiráis de Switch + expresiones?, ¿dónde está para vosotros la frontera antes de meter un LLM? Y dos: el histórico (barriles cerrados) lo vuelco a Google Sheets — ¿preferís Postgres para esto o Sheets os vale de sobra?

Si interesa, en otro momento pego el JSON del workflow. Cualquier crítica bienvenida, que soy más de barra que de teclado :slightly_smiling_face: