The official n8n tutorials teach you how nodes work. They don’t teach you why you’d chain them together for a real task. This guide closes that gap with a six-node workflow you’ll finish in about 30 minutes: fetch the Bitcoin price every weekday at 9 AM, branch on whether it’s above $100k, and fire either an email or a Slack message. Free tier only. No prior experience required.
By the time you publish it, you’ll understand triggers, HTTP requests, expressions, conditional logic, and action nodes. Those five concepts are the foundation every other n8n workflow builds on.
Five concepts to internalize before you click anything
Memorize these now and you’ll spend less time confused later.
- Workflow: a collection of connected nodes that automates a single process.
- Node: one step. It does one thing: trigger, fetch, transform, or send.
- Trigger node: the first node in every workflow. Decides when things run.
- Execution: one full top-to-bottom run. n8n logs every execution so you can debug.
- Expression: JavaScript snippets inside
{{ }}that pull data from earlier nodes.
When something breaks, ask three questions: which node failed, what data did it receive, and what did it try to do with that data? Almost every n8n problem maps to one of those three.
️ What you’re building
Six nodes, two branches, one schedule:
Schedule (weekdays 9 AM)
→ HTTP Request (CoinGecko BTC price)
→ Edit Fields (extract price as clean number)
→ If (price > 100,000?)
true → Email (celebrate)
false → Slack (notify)Real API. Real notifications. Every concept a beginner needs.
⚙️ Setup: Cloud vs. self-hosted
Two ways to start:
- n8n Cloud: sign up at n8n.io, 14-day free trial, no credit card required. After the trial, paid plans start at €24/month for 2,500 executions.
- Self-hosted: free forever, runs on your own server with Docker. Requires basic Linux comfort.
For this tutorial, Cloud is faster. Every step works identically on self-hosted. After signup, click Create Workflow in the upper-right. You’ll land on an empty canvas with one button: Add first step.

Building the workflow: step by step
Step 1: Schedule trigger
- Click Add first step.
- Search Schedule and pick Schedule Trigger.
- Set Trigger Interval to Days, Days Between Triggers to 1, and Trigger at Hour to 9am.
- Optionally restrict to Mon-Fri under Trigger on Weekdays.
Critical detail: the Schedule trigger only fires on a published workflow. While building, use the Execute Workflow button at the bottom of the canvas to run things manually.
Step 2: HTTP Request — fetch the BTC price
- Click + on the right of the Schedule trigger.
- Search HTTP Request and select it.
- Set the URL to:
https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd - Set Authentication to None (CoinGecko allows unauthenticated GET calls).
- Click Execute step.
You should see output like:
{
"bitcoin": {
"usd": 105432
}
}That’s the live price. Pro tip: Execute step runs only that single node against sample data without firing the rest of the workflow. Use it on every new node before connecting the next one. It catches roughly 80% of mistakes early, when they’re easy to fix.
Step 3: Edit Fields — clean up the data shape
The CoinGecko response nests the price inside bitcoin.usd. Promote it to a top-level price field so later nodes don’t need to navigate the nested structure.
- Click + on the HTTP Request node.
- Search Edit Fields (also called “Set” in some versions) and select it.
- Under Fields to Set, click Add Field.
- Set Name to
price. - Toggle the = icon to red to enable expression mode.
- Drag
bitcoin.usdfrom the left panel into the value field. The expression becomes{{ $json.bitcoin.usd }}. - Click Execute step.
Output should now be { "price": 105432 }. Expressions are how you reference data from any previous node. Anything inside {{ }} is JavaScript. $json means “data the previous node returned.” You don’t need to memorize syntax — drag fields from the left panel and n8n writes the expression for you.
Step 4: If node — conditional branching
- Click + on the Edit Fields node.
- Search If and select it.
- Under Conditions, drag
pricefrom the left panel into Value 1. The expression becomes{{ $json.price }}. - Set Operation to Number > Larger.
- Set Value 2 to
100000. - Click Execute step to verify.
The If node now exposes two output connectors: true (top) and false (bottom).
Common gotcha: make sure Operation is set to Number, not String. String comparison treats "5" as greater than "100000" (alphabetic order), which silently breaks your logic. This bites everyone at least once.
Step 5: Action nodes — email and Slack
Email on the true branch
- Click + labeled true on the If node.
- Search Send Email and select it.
- Click Create new credential and configure SMTP. Gmail requires an app-specific password; most ESPs accept standard SMTP credentials.
- Set To Email to your address.
- Set Subject to BTC just hit $100k!
- In Text (expression mode):
BTC is currently at ${{ $json.price }} — celebration time! - Click Execute step.
Slack on the false branch
- Back on the canvas, click + labeled false on the If node.
- Search Slack and select it.
- Click Create new credential and complete the OAuth2 flow to connect your workspace.
- Set Resource to Message and Operation to Send.
- Pick a channel (for example, #general).
- In Text (expression mode):
BTC is at ${{ $json.price }} — still under $100k. - Click Execute step.
If both test sends worked, save immediately. Cmd/Ctrl + S or click Save at the top right. n8n does not auto-save while you build.

Step 6: Test, then publish
- Run the full workflow manually. Click Execute Workflow at the bottom. Every node turns green on success or red on failure. Click any failed node to see the exact error and the input data that triggered it.
- Publish. Toggle Publish at the top of the editor to active. The Schedule trigger now fires every weekday at 9 AM automatically.
To confirm it actually ran, open Executions in the left sidebar. After 9 AM the next weekday, you’ll see a fresh execution logged. Click into it to see what data flowed through every node.
Six gotchas that bite everyone
- Forgetting to publish. The most common reason “the schedule isn’t firing.” If the toggle isn’t on Published, the trigger is dormant.
- String vs. Number in If nodes. Always pick the correct operation type. String comparison on numbers produces silent wrong answers.
- Hardcoding what should be an expression. Typing
$json.priceinto a regular field does nothing. Toggle the = icon to red first. - Polling APIs every minute on n8n Cloud. A 1-minute schedule equals 43,200 executions per month, which exceeds most paid plan limits. Use webhooks where possible.
- Skipping Execute step on each node. Test every node individually before wiring the next. It prevents roughly 80% of debugging pain.
- Losing N8N_ENCRYPTION_KEY on self-hosted. Lose this key and every saved credential becomes unrecoverable. Back it up to a password manager the moment you generate it.
What to build next
You now have the foundation. Three productive directions from here:
- Replace the Schedule trigger with a Webhook trigger. React to events from external systems instead of polling on a fixed interval. Big efficiency gain for anything event-driven.
- Add an error-handling branch. Every critical workflow should end with a “Send Email/Slack on Error” node. Silent failures will burn you eventually.
- Rebuild one repetitive task from your actual job. Compiling weekly stats, posting reports, syncing data between tools. The fastest way to learn n8n is to solve a real problem you have right now.
The pattern that pays back fastest for small teams: form submission → CRM record → notification. A new lead fills a form, the data lands in your CRM with proper tagging, and your team gets notified instantly. It eliminates manual data entry, cuts lead response time from hours to seconds, and uses every concept covered in this tutorial.
