What it does
Two workflow bots that have been running unattended on n8n Cloud. One is a Telegram bot for a shared grocery list that takes commands in English and Hebrew and keeps state in Postgres. The other watches a Google Sheet of flight routes and alerts when Amadeus fares move.
How it works
Grocery Bot
Parse the command
A Telegram trigger feeds a switch on add and remove, in English and Hebrew. Text is normalised for case and stray whitespace so the same item does not end up stored twice.
Persist to Postgres
Supabase holds the list with an identity primary key, UTC timestamps and a status column, so removed items are marked rather than deleted and the history stays intact.
Flight Monitor
Read the wishlist
Routes and target dates come from a Google Sheet, which makes the whole thing editable by someone who will never open n8n.
Fan out around each date
Each row expands into up to seven Amadeus searches covering plus or minus three days, since flying a day either side is often much cheaper. Past dates are dropped and the original date is flagged.
Diff against the last run
A parallel branch pulls the previous results, renames fields to avoid collisions, merges the two sets, then routes through conditionals to either fire an alert or quietly upsert the row.
Tech choices
The decisions that shaped it, and why they went that way.
- The diff is the whole point
- Without comparing against the previous run, a price monitor is just a thing that emails you the same fare every morning.
- A spreadsheet as the interface
- Using Sheets for input means the config is editable by anyone, with no deploy and no UI to build.
- Soft deletes
- The status column keeps removed items queryable, which costs nothing and makes the data worth keeping.
Built with
- Platform
- n8n CloudJavaScript code nodes
- Grocery Bot
- Telegram Bot APISupabasePostgreSQL
- Flight Monitor
- Amadeus APIGoogle Sheets
What it produces


How the repo is laid out
Roughly the order you'd read it in: entry point first, then the parts doing the work.
Grocery Bot
workflow.jsonThe exported graph: Telegram trigger to Postgresschema.sqlGroceries table: item, status, timestampsFlight Monitor
TakeResult.jsExpands one sheet row into seven date searchesParser.jsUnwraps the Amadeus response, adds airline names
Where it falls short
These are low-code. Most of the logic lives in the n8n graph rather than in code I wrote, and the hand-written JavaScript is under a hundred lines across both. I include them because they are the two things here that have run unattended for months, not as a demonstration of engineering depth.