Getting Started with n8n: Your First Real Workflow
How to set up n8n, understand the interface, and build your first working automation — from trigger to action.
The hardest part of learning a new tool isn’t the learning itself — it’s getting past the blank canvas. You open n8n for the first time, see an empty workflow editor, and your mind goes blank too.
I’ve been there. This guide is the one I wish I’d had. We’re going to cover setup, the core interface concepts, and build an actual working workflow — not a “hello world” toy, but something that shows you the real mechanics. By the end, you’ll understand how data flows through n8n and how to read what’s happening at every step.
Cloud vs Self-Hosted — Which to Choose
Before you build anything, you need a running n8n instance. You have two options.
n8n.io Cloud is the fastest way to start. Go to n8n.io, create an account, and you’re in a workflow editor within two minutes. The free tier gives you 5 active workflows and 2,500 executions per month. That’s plenty to learn and build your first several automations.
Self-hosted means running n8n on your own server. The most common options:
- Railway — easiest to deploy, $5/month for a small instance, one-click n8n template available
- Render — similar to Railway, free tier available (but it spins down on inactivity, which is annoying for production)
- DigitalOcean / Hetzner VPS — more control, ~$5-6/month for a 1GB droplet, requires a bit more setup
Self-hosted is better if you want full control, no execution limits, and you’re building something that will run in production. But it adds setup time.
My recommendation: start on n8n.io cloud. Get comfortable with the tool. When you’re ready to build something real — or when you start hitting the execution limit — move to self-hosted. The interface is identical regardless of where it’s running, so nothing you learn is wasted.
The n8n Canvas
When you create a new workflow, you’re looking at the n8n canvas. Here’s what you’re working with:
The canvas is the main area — the blank space where you build. You drag nodes onto it, connect them, and that’s your workflow. It’s infinite and pannable. Don’t worry about organizing it perfectly at first.
Nodes are the individual steps. Each node does one thing: receive data, make an API call, check a condition, transform data. Nodes are the building blocks. You connect them left to right, and execution flows in that direction.
Connections are the wires between nodes. Data flows from the output of one node into the input of the next. You draw connections by clicking the small circle on the right edge of a node and dragging it to the left edge of another.
The sidebar is the node library. Click the + button (or the big plus that appears when the canvas is empty) and the sidebar opens. You can search for any integration by name. Click a node to add it to the canvas.
The top bar has the workflow name, the Save button, and the Test Workflow button (more on this shortly). There’s also an active/inactive toggle on the right — that’s how you turn a workflow on or off.
That’s the whole interface. It’s less complicated than it looks.
Node Types to Know
You don’t need to know all 400+ nodes. You need to know about ten concepts, and the rest follows naturally.
Trigger nodes start a workflow. Nothing runs without one. The main triggers:
- Manual Trigger — you click a button to run it. For testing.
- Webhook — an external system hits a URL, n8n receives the data and fires. The most common trigger for real automations.
- Schedule — runs on a cron schedule. Daily at 8am, every 15 minutes, whatever you need.
- App triggers — things like “when a new row is added to Airtable” or “when a new email arrives in Gmail.” These are polling or push triggers specific to the app.
Action nodes make n8n do something:
- HTTP Request — call any external API. This is the most important node in n8n. If there’s no built-in integration for a service, you use this.
- Supabase, Twilio, Resend, Stripe — dedicated integration nodes that simplify the most common operations for each service.
- Send Email — generic SMTP email node.
Logic nodes control flow:
- IF — splits the workflow into two paths based on a condition. True goes one way, false goes the other.
- Switch — splits into multiple paths based on a value. Like IF but with more branches.
- Merge — combines multiple branches back into one.
- Set — creates or modifies fields on the data. This is how you reshape data between nodes.
- Code — write JavaScript when nothing else fits.
Start with Manual Trigger, HTTP Request, Set, and IF. Everything else builds on those.
Credentials
Before any node can connect to an external service, it needs credentials — your API keys, tokens, or login info. n8n stores these securely and separately from your workflows.
Here’s how credentials work in practice:
- Add a node that needs authentication (like the Supabase node or the HTTP Request node with an API key).
- In the node settings panel, click the Credential dropdown and select “Create new credential.”
- A form appears asking for the specific info that service needs — usually an API key, sometimes a URL and key combination.
- Fill it in and save. n8n encrypts and stores it.
- That credential is now available to reuse in any other node in any workflow.
This is important: credentials are global, not per-workflow. Set up your Supabase credential once and every workflow can use it. Same for Twilio, Resend, Stripe.
One thing to know for self-hosted: credentials are stored in your n8n database. Make sure you’re running n8n with a persistent database (PostgreSQL is recommended for production) and that you have backups. Losing your credentials means re-entering all your API keys.
Building Your First Workflow
Let’s build something real. We’re going to create a workflow that:
- Starts when you manually trigger it
- Calls a public API to fetch some data
- Reformats that data using a Set node
This uses the JSONPlaceholder API — a free, public fake API for testing. No account needed. This keeps the focus on the mechanics without requiring you to set up external services.
Step 1: Add a Manual Trigger node
Open a new workflow. Click the + button in the center of the canvas. Search for “Manual Trigger” and click it. This node appears on the canvas. It has no settings — its only job is to start the workflow when you click “Test Workflow.”
Step 2: Add an HTTP Request node
Hover over the Manual Trigger node and click the + that appears on its right edge. Search for “HTTP Request” and add it. This connects automatically.
In the HTTP Request settings:
- Method: GET
- URL:
https://jsonplaceholder.typicode.com/todos/1
That’s a real URL that returns a JSON object representing a fake to-do item. No auth required.
Step 3: Add a Set node
Add another node from the output of the HTTP Request node. Search for “Set” and add it.
In the Set node, you’re going to create a new field from the data that came back from the API. The JSONPlaceholder response looks like this:
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
}
In the Set node, click “Add field.” Name the field taskSummary. For the value, click the expression icon (the small lightning bolt) and type:
{{ $json.completed ? "Done" : "Pending" }}: {{ $json.title }}
This creates a new field called taskSummary that reads “Pending: delectus aut autem” (or “Done: [title]” if the task were complete).
You’ve just done data transformation in n8n — taking raw API data and reshaping it into something useful.
Testing and Reading Output
Click “Test Workflow” in the top bar. n8n runs the workflow in test mode. Each node lights up as it executes.
Click on the HTTP Request node after it runs. You’ll see the output panel on the right: it shows the raw data that node received and produced. The data is structured as an array of items. In this case, there’s one item (the to-do object you fetched).
Click on the Set node. You’ll see a new field — taskSummary — added to the item alongside the original fields from the API.
This output panel is how you debug in n8n. Any time something isn’t working as expected, click the node and read what it actually received. Nine times out of ten, the data coming in isn’t shaped the way you thought it was, and seeing it directly tells you exactly what to fix.
Understanding the item array is key. n8n passes data between nodes as an array of items. Even when you fetch a single thing — like one to-do — it’s wrapped in an array: [{ "json": { ...your data } }]. When a node processes data, it processes each item. When you reference data with expressions like {{ $json.title }}, you’re accessing the json property of the current item. Keep this mental model in mind and a lot of confusing behavior becomes clear.
Activating a Workflow
Test mode and live mode are different.
In test mode, you manually trigger the workflow by clicking “Test Workflow.” n8n runs it once and shows you the output. Webhook triggers in test mode use a different URL — the test URL — which only works while the workflow editor is open and listening.
In live mode (active), the workflow runs automatically based on its trigger. A Webhook trigger in live mode has a production URL that stays active 24/7. A Schedule trigger fires on its actual schedule. Manual triggers can still be run manually, but they also work from the n8n API.
To activate a workflow, click the toggle in the top right of the editor — from “Inactive” to “Active.” n8n will prompt you to save if you have unsaved changes.
To check your execution history, go to the main dashboard and click on the workflow name, then look for the “Executions” tab. You’ll see every time the workflow has run, whether it succeeded or failed, how long it took, and the full data from each run. This is invaluable for debugging production issues.
The Most Common Beginner Mistakes
These are the things that tripped me up early, and that I see consistently in anyone who’s just starting.
Not mapping fields correctly between nodes. The output of one node doesn’t automatically become the input of the next in the way you might expect. You have to explicitly reference it using expressions. If you’re trying to use {{ $json.email }} but the field is actually called customerEmail, it won’t work. Always check the output panel of the previous node to see the exact field names.
Not checking data types. n8n is JavaScript under the hood. A number and a string containing a number are different things. If you’re doing a comparison like {{ $json.status === 1 }} but status is coming in as the string "1", it won’t match. Use the Set node to explicitly convert types when needed.
Forgetting to activate. This sounds obvious, but I’ve done it. You build the workflow, test it, everything works — and then you forget to flip the toggle to Active before closing the browser. Check the dashboard to confirm the workflow shows as Active.
Not handling empty or missing data. What happens when the webhook fires but the payload is missing a required field? What happens when a database query returns zero rows? If your workflow doesn’t account for these cases, it will error in ways that are hard to trace. Build in IF nodes to check for empty values early in any workflow that will run in production.
Using the test webhook URL in production. The test URL only works when the workflow editor is open. If you point your form or external system at the test URL and then close the editor, nothing will work. Always use the production URL for anything that runs in the real world.
When you’re comfortable with the basics, head to Advanced n8n → for branching logic, error handling, and real API integrations.