The most satisfying first workflow is a Slack alert. That moment when a message just drops into a team channel because something happened — that's what makes automation click faster than anything else. In this post, we'll build an "order alert" in 20 minutes.
Here's what the finished workflow does. A payment comes in, the webhook catches it, and if the amount is at least ₩100,000 a summary lands in #sales. Four nodes get you there.
0. What you'll need
- An n8n instance (Cloud or self-hosted)
- Slack workspace admin rights
- A
Bot Token— issued from a fresh Slack App
api.slack.com/apps in 5 minutes. The only scope you need is chat:write. Add the rest when you actually need them.1. Pick a trigger
A workflow always starts with a trigger. Use Webhook for external events, and Schedule Trigger when you need to check periodically. This tutorial assumes you're catching a hook from a payment system.
curl -X POST \
https://your-n8n.example.com/webhook/orders \
-H 'Content-Type: application/json' \
-d '{"order_id":1024,"amount":129000,"customer":"Hong Gildong","product":"Annual subscription"}'2. Clean fields with a Set node
Don't push the raw incoming JSON straight into Slack. Use a Set node to pick the values you actually need and normalize the names — everything downstream, the IF and the Slack node, gets cleaner.
orderId={{ $json.order_id }}amount={{ $json.amount }}customer={{ $json.customer }}product={{ $json.product }}
3. Cut noise with an IF node
You don't need to alert on every event. The moment a channel pings three times a second, people start tuning out. Add a filter with an IF node so only what's actually worth seeing survives.
IF— splits into true/false branchesSwitch— routes into multiple branches (e.g. per tier, per channel)Filter— passes matching items, quietly drops the rest
In this example, we set amount ≥ 100000 — small orders slip by silently and only the big ones make it to the channel.
4. Send with the Slack node
Add a Slack node and register the Bot Token you just issued as its Credential. Resource: Message, Operation: Send, Channel: #sales. Drop expressions into the message body and it assembles dynamically.
:moneybag: *New order #{{ $json.orderId }}*
• Customer: {{ $json.customer }}
• Product: {{ $json.product }}
• Amount: ₩{{ $json.amount.toLocaleString() }}
<https://admin.example.com/orders/{{ $json.orderId }}|View order details>*bold* (single asterisk), italic is _italic_, and links are <url|text>. Emoji go in as :emoji:.5. What makes an alert good
A good alert fits "what happened" and "what should I do" into a single line.— SynAct.ai consulting team
- One-line title with the key event and an identifier
- Body with 3-4 pieces of context (who, what, how much)
- Last line: a link to the next action
6. Pre-launch checklist
- Hit the test URL with curl 5 times — verify values at each of Set/IF/Slack
- Flip the workflow to Active
- Register the production URL in your payment system
- Trigger one real small order to prove it end-to-end
- Check the Executions tab for success/failure logs
Real deployment results
These are results from a real e-commerce team. The response-time drop is the big one, and the reason is simple: you don't have to open email anymore. Click the link straight from the channel and you're in the admin.
Where to go from here
If you finished this tutorial, you've internalized the four-step pattern of automation: trigger → clean → condition → action. This shape applies to tax invoices, inventory alerts, lead routing, server monitoring — anywhere. Your next workflow will be three times faster to build.