Vibe Sprint 2026 · TalTech Mektory · 19 Sept
Workshop, 9:30 to 10:15

Make your app do things on its own.

You built the part people see with Lovable. Today you learn the part that works behind it. No coding experience needed. Really none.

Bodo Buschick, Exasync OÜ, Tallinn. Everything from today is on one page, QR code at the end. Already built n8n flows? Good, you will be faster. Never heard of it? Perfect, we start at zero.

Two minutes about me

I make computers do the boring work of transport companies.

  • 1A truck company gets 200 orders a day by e-mail. Someone used to type every one into a system. Now a machine does it and a human only checks.
  • 2That is my job at Exasync: find work that repeats, and build a machine that does it.
  • 3Today: the same thing, small enough to build before lunch. From 10:15 I walk around the room. Wave, and I come to your table.
Build along if you are awake. Watch if you are not. Both are fine. Nothing today needs you to remember anything, it is all on the page.
Why this matters

Most work in a company today happens at a computer. And most of it repeats.

  • 1Reading e-mails and typing what is in them into another program. Orders, invoices, applications, complaints.
  • 2Copying numbers from one screen to another. From the web shop into the accounting, from the spreadsheet into the mail.
  • 3Checking something every morning. Did the payment arrive? Did the truck arrive? Is the stock low?

We automate exactly this work, with different technologies: robots that click through old programs, scripts, AI agents that read and decide, and cloud automation: a service on the internet that connects programs and runs rules for you.

n8n is cloud automation. It is the easiest of the four to start with, and it is what you have an account for. So that is what we build with today.
Start at zero

Automation is a rule that runs without you.

You already use it

"When it is 7:00, ring."

Your alarm clock. You set the rule once. It runs every morning, even while you sleep. You do not press anything.

Today we write rules like

"When someone orders in my app, prepare it and answer them."

Same shape: WHEN something happens, DO a list of steps. The tool that runs such rules for your app is called n8n. That is all it is.

Every automation in the world has this shape: when something happens, do these steps. Keep that sentence. It is the whole workshop.

One picture for the whole morning: a restaurant

Your Lovable app is the counter. n8n is the kitchen.

The counter · what guests see

Lovable

The menu, the tables, the waiter taking the order. Guests only ever see this part. And this is where the finished dish arrives.

The kitchen · where the work happens

n8n

Takes the order, cooks it step by step, hands the plate back. Guests never see the kitchen, but without it there is no food.

The ingredients · other systems

Database, payment, e-mail, AI

The kitchen does not grow its own vegetables. It pulls ingredients from suppliers: your customer database, a payment service, a recipe service, an AI. In n8n these are called integrations.

So a dish at the counter is really: an order taken at the counter, cooked in the kitchen, from ingredients that came from somewhere else. Every app you build this weekend works exactly like that.

And yes, the restaurant itself can be automated

Order taken, dish cooked, plate delivered. No human in the loop.

What these machines do with plates, n8n does with data. Same restaurant, same roles. Counter, kitchen, waiter, kitchen bell, order slip. Every technical word today maps to one of them.

Country Garden robot restaurant, China. Clip from South China Morning Post, 27 seconds, no sound. Press play.

Word one

An API is a waiter.

You do not walk into the kitchen. You tell the waiter what you want, in a fixed way (the menu), and the waiter brings it. An API is that waiter for programs. A fixed way to ask another program for something and get an answer.

Try it right now. Scan, open, look.
You just asked a waiter called TheMealDB: "Which sections does your menu have?" No account, no key, no code.
themealdb.com/api/json/v1/1/list.php?c=list
What the waiter brings back (shortened)
{ "meals": [
    { "strCategory": "Beef" },
    { "strCategory": "Chicken" },
    { "strCategory": "Dessert" },
    { "strCategory": "Seafood" }, ...
] }

Looks strange? Two slides from now it is a filled-in order slip.

Word one, a bit closer

The address you just opened is an order, spoken in the waiter's language.

https://www.themealdb.com   /api/json/v1/1/filter.php   ?c=Seafood
       the restaurant             what I order            only these, please
The restaurant · the domain

themealdb.com

Which waiter you are talking to. Every service has its own address: weather, payments, your own database.

The dish · the endpoint

/filter.php

What you want from the menu. list.php gives the sections, filter.php gives dishes, search.php gives one full recipe. The menu is written down: it is called the API documentation.

The special wish · the filter

?c=Seafood

"Only the seafood dishes, please." Everything after the question mark narrows the order down. Try ?c=Dessert on your phone.

And the whole table? You order your main and your drink. Your friends order something else. The waiter carries all of it to the kitchen in one go. Programs do the same: several orders at once are called a batch. We meet one in Recipe 2.

Word two

JSON is the order slip. Labels on the left, what you want on the right.

One guest, one slip object
{
  "name":    "Mari",
  "starter": "soup",
  "main":    "chicken",
  "dessert": "none",
  "drink":   "water"
}

Curly braces open and close one slip. Programmers call one slip an object. Each line is one label and one value. Text goes in quotes, numbers do not.

The whole table · a list of slips array
{ "table": 7,
  "orders": [
    { "name": "Mari",  "main": "chicken", "drink": "water" },
    { "name": "Jaan",  "main": "steak",   "drink": "beer" },
    { "name": "Liis",  "main": "chicken", "drink": "cola" }
  ] }
  • 1Square brackets are a list. Programmers call it an array: several slips, one after the other. The waiter's answer on the last slide was one too.
  • 2Every program talks in slips. Your app sends one, the waiter answers with one, n8n passes them from box to box. You never write one by hand today, you only read a label.
Word three

A webhook is the kitchen bell.

Webhook · the bell rings, the cook reacts

The cook does not check every five minutes whether someone ordered.

The waiter rings the bell and hangs up the slip. Only then the cook starts. n8n gives your app such a bell: a web address. When your app sends an order slip there, the kitchen starts cooking.

Small extra · the time trigger

"Check every five minutes anyway."

Some kitchens do exactly that: look at the clock, check the pass, repeat. In automation this is a time trigger, often called a cron. Useful for "every morning at 8, send the report". We use the bell today.

So: the webhook is how your app wakes up the kitchen. The API is how the kitchen orders ingredients from other places. Both are web addresses that carry an order slip (JSON).

All of it in one picture

This is every app you will build this weekend.

Counter
Lovable app
kitchen bell + order slip
Kitchen
n8n
orders ingredients
Suppliers
database · AI · mail
the dish, as a slip
Back to
the counter
Trigger

The "when". What starts the rule: the bell rings, or the clock says 8:00.

Node

One step of the cooking. Read the slip, chop, ask a supplier, plate it. In n8n a node is a box on the screen.

Workflow

The whole recipe: one trigger, then boxes connected with lines. That is what we build.

Plan for the next 30 minutes

Three recipes. You build the first, you paste the other two.

Recipe 1 · build it yourself

Read the slip, write the answer

One guest orders. The kitchen reads the slip, changes a few things, confirms. Three boxes. You click every one of them.

Recipe 2 · paste it, then read the order book

The whole table, a decision, a supplier

A table orders. For each dish the kitchen asks a recipe service, the head chef decides, everything is added up. Nine boxes. Copy, paste, run, look at what came out.

Recipe 3 · paste it, swap the key, connect the counter

AI writes the confirmation, Lovable shows it

Same bell, an AI box that needs your own key, and the one sentence that connects your Lovable app to it.

Every recipe starts with the same bell and ends with the same "hand it back". Only the middle changes. That is the point.

Before Recipe 1 · one minute of clicking

How to start a new recipe in n8n.

Already done this before? Then Recipe 1 takes you two minutes. Build it anyway, we all need the same bell address afterwards.

Recipe 1 · build it yourself · variables

One guest orders. The kitchen sends a confirmation back.

Trigger · kitchen bellWebhook
Node · read and change the slipEdit Fields
Node · hand it backRespond to Webhook
Webhook box · settings
Method: POST      Path: order      Respond: Using 'Respond to Webhook' node
Edit Fields box · add three fields
greeting = Hi {{ $json.body.name }}, your order is in the kitchen.
shout    = {{ $json.body.main.toUpperCase() }}
minutes  = {{ $json.body.main === 'steak' ? 25 : 15 }}
Respond box · Respond with JSON
{ "answer": {{ $json.greeting }}, "ready_in": {{ $json.minutes }} }
or download the file
  • 1A variable is one line on the slip: a label and what is next to it. main is the label, "chicken" is the value. Edit Fields writes new lines.
  • 2Reading a line: {{ $json.body.name }}. From the right: the line name, on the slip body, that just arrived $json. Curly braces mean "look this up".
  • 3Changing a value: .toUpperCase() makes it SHOUT, === 'steak' ? 25 : 15 means "steak takes 25 minutes, everything else 15". You look these up, you do not learn them.
  • 4Test it: Webhook box, "Listen for test event", then I ring your bell from my laptop. Half of today's bugs: $json.name without body.
Before Recipe 2 · thirty seconds of clicking

How to paste a finished recipe into n8n.

Two more words before Recipe 2

A loop walks through the table's order. An IF is the head chef deciding.

Loop · one slip after the other

"Mari: chicken. Jaan: steak. Liis: chicken. So: 2x chicken, 1x steak."

The cook goes through the slips one by one and adds them up. In n8n you do not write the loop: when a list (array) comes in, every box after it simply runs once per slip. Three guests, every step runs three times.

IF · yes or no, two ways forward

"Do we have a recipe for this? Yes: cook it. No: ask the chef."

A yes/no question with two exits. In n8n the IF box has two outputs, true and false. Each can lead to different boxes. Afterwards everything is collected again.

Put together: for each slip, ask the supplier, ask the question, do one thing for yes and another for no, then collect and add up. That is Recipe 2.

Recipe 2 · paste it · loop + IF + supplier

A table orders. The kitchen checks every dish with a recipe service and adds up.

BellWebhook
One slip per dishCode · split list
Ask the supplier, per dishHTTP Request
Head chefIF · recipe found ?
yes
Edit Fieldson the menu
no
Edit Fieldsask the chef
Back togetherMerge
One list againAggregate
Hand it backRespond
What the table sends · already counted per dish
{ "table": 7, "orders": [ { "dish": "chicken", "qty": 3 },
                        { "dish": "unicorn", "qty": 1 } ] }
What comes back · read it in Executions, box by box
{ "table": 7, "total_dishes": 4, "dishes": [
    { "dish": "chicken", "qty": 3, "status": "on the menu",
      "recipe": "Chicken Handi", "kitchen": "India" },
    { "dish": "unicorn", "qty": 1, "status": "not on the menu, ask the chef" } ] }
or download the file
  • 1Code box: the only three lines of code today. They turn the list into one slip per dish. From here every box runs twice. That is the loop.
  • 2HTTP Request box: themealdb.com/.../search.php?s={{ $json.dish }}. The dish from the slip is filled into the address. Runs once per dish.
  • 3IF box: "is meals not empty?" Chicken: yes, up. Unicorn: the supplier answers null, so no, down.
  • 4Merge, Aggregate, Respond: both branches back in one line, one list again, added up: 4 dishes. One answer to the counter.
One more word before Recipe 3

A credential is your account with a supplier. n8n keeps it in the safe.

In the restaurant

The butcher only delivers to kitchens that have an account with him.

TheMealDB delivers to everyone, no account needed. Most suppliers do not: OpenAI, Gmail, Google Sheets, your database. They give you a key (a long password) and want to see it with every order.

In n8n

Store the key once, point boxes at it.

Left menu, Credentials, "Add credential", pick the supplier (for example OpenAI), paste the key, save. From now on every box for that supplier has a dropdown "Credential to connect with". Pick yours. The key never sits in the box itself.

Recipe 3 · paste it, swap the key, connect the counter

An AI writes the confirmation. Your Lovable app shows it.

BellWebhook
Supplier with account · needs your keyOpenAI · write confirmation
Hand it backRespond
+
No key? use this insteadEdit Fields · fixed text
Three steps in n8n
  • 1Copy Recipe 3, paste, save. The OpenAI box is red: open it, pick your credential in the dropdown. No key? Delete the line into OpenAI and connect the bell to "No key?" instead.
  • 2Switch to Active. Open the Webhook box, copy the Production URL.
  • 3Go to Lovable and paste the prompt on the right, with your URL in it.
or download the file
The Lovable prompt · the whole connection is the sentence with the URL
Build a single-page app "Order at the counter": a card with three
fields, name, main dish, drink, and a button "Order".
When the button is clicked, send the form as JSON
{ "name": ..., "main": ..., "drink": ... }
to https://YOUR-WORKSPACE.app.n8n.cloud/webhook/confirm
with header Content-Type: application/json,
and show the field "answer" from the reply below the card.
Dark background, one accent colour, no login, no database.

Production URL, not Test URL. Workflow Active. "CORS error" in the browser: Webhook box, Options, Allowed Origins: *.

What you just saw, once more

Every automation you will ever build is these six roles from the restaurant.

Kitchen bell

Webhookor the clock: Schedule

Something wakes the kitchen up. Your app rings, or it is 8:00.

Order slip

VariablesEdit Fields

Read a line, write a line, change a value. Recipe 1.

The whole table

Looplist → one slip per guest

Every box after a list runs once per slip. Recipe 2.

Head chef

IFtwo exits, then Merge

Yes goes up, no goes down, Merge brings them back. Recipe 2.

Suppliers

API + credentialHTTP Request, AI, Sheets, Mail

Ingredients from other systems, with or without an account. Recipes 2 and 3.

Serve

RespondRespond to Webhook

The dish goes back to the counter. Or nowhere, if the mail was the point.

When it does not work, and it will not, at least once

The kitchen keeps every order slip. Read the order book, not the error.

  • 1Left menu, Executions. Every time the bell rang is written down there, with what every box did to the slip.
  • 2A red box is where the cook dropped the plate. Click it. Look at what came in and what went out. Nine times out of ten a label is spelled differently.
  • 3Nothing in the book? Then the bell never rang: wrong address, workflow not active, or CORS.
  • 4Show me that screen when you wave. I can fix a red box in a minute. I cannot fix "it does not work".
The order book is worth money. At the end of the month the owner reads it: 400x chicken, 40x steak. Next month less steak is bought, and the menu changes. Every automation keeps such a book for free. Use it: it tells you what people actually do with your app.
The five things that go wrong for everyone today
  • !Test address in the app. Works once, then nothing.
  • !Workflow saved but not switched to Active.
  • !$json.name instead of $json.body.name. Empty line.
  • !Pasted recipe, credential not swapped. Red box.
  • !No "hand it back" box at the end. The counter waits forever.
Take-away for the next 28 hours

Three recipes to paste. Five suppliers that need no key.

On the page behind the QR: this deck with the copy buttons, the files, the handout
  • 1Recipe 1 · one slip in, confirmation out · build it yourself
  • 2Recipe 2 · whole table in, checked with a recipe service, added up
  • 3Recipe 3 · AI confirmation with your key, connected to Lovable
  • +schedule-digest · every morning: fetch, format, mail (the clock trigger)
  • +webhook-to-sheet · every form submit becomes a row in a Google Sheet
Everything from today.
Scan once, keep the tab open all weekend.
exasync-vibesprint.pages.dev
Suppliers for the HTTP Request box, no account needed
  • ·themealdb.com recipes, ingredients, pictures
  • ·open-meteo.com weather
  • ·api.frankfurter.app exchange rates
  • ·dummyjson.com fake products and users for demos
  • ·pokeapi.co because someone always asks
The restaurant, in n8n words: counter = Lovable · kitchen = n8n · ingredients = integrations · waiter = API · account with a supplier = credential · order slip = JSON object · list of slips = array · one line on a slip = variable · kitchen bell = webhook · clock = schedule (cron) · whole table = loop · head chef = IF · order book = Executions.

Build the kitchen. Then go build the counter.

I walk around the room until lunch. Wave, and show me the order book (Executions).

Let's stay in touch.
Bodo Buschick on LinkedIn
linkedin.com/in/bodo-buschick-6815231b7
Everything from today
exasync-vibesprint.pages.dev