How Webhooks Work — and Why Zo.E Runs on Them
2 min read · 545 words ·
Every time I tap Approve on my phone and a post goes live thirty seconds later, that's a webhook doing its job.
It's worth understanding what's actually happening there, because the same mechanism is woven through several points in Zo.E — and if you're setting up the template pack, you'll need to regenerate a few of these to get things working in your own instance.
The polling problem
Imagine you've just sent a task off to another service. How do you know when it's done?
The naive approach is polling: every few seconds, your system asks "finished yet?" The answer is no, no, no, no... yes. That's wasteful. You're burning requests on empty responses, and there's still a delay between the work finishing and your system noticing.
Webhooks flip that. Instead of you asking repeatedly, the other service calls you when it's done. You give it a URL — a webhook URL — and when the trigger fires, it sends a POST request to that address. Your system wakes up, receives the data, and carries on.
That's it. That's the concept.
Where you'll see it in Zo.E
The Telegram approval loop (WF4) is the clearest example. When a post draft is ready, Zo.E sends it to my Telegram bot with an Approve or Reject button. Then n8n pauses — genuinely pauses, not polls. It's not sat there asking "has James replied yet?" every five seconds. It's waiting.
When I tap a button on my phone, Telegram sends a webhook back to n8n. That wakes the workflow up, tells it which button I pressed, and routes accordingly. The whole thing resolves in moments. No polling. No lag.
Upload Post (the tool Zo.E uses to schedule and publish content) also uses callbacks when scheduling posts — the same idea applies. A webhook fires when the schedule processes, keeping the workflow in sync.
WF8 and WF10 are the adhoc publishing workflows. These are webhook-triggered, meaning I can fire an immediate publish from my phone at any time — without logging into n8n, without opening a laptop. The webhook URL is the entry point. Hit it, and the workflow starts.
What you need to do as a buyer
The webhook URLs baked into the Zo.E template pack are placeholder values. They were valid in my instance — they won't work in yours.
Here's what to update:
- WF4 (Telegram approval loop) — open the webhook node, regenerate the URL, and update your Telegram bot settings with the new address.
- Upload Post nodes — wherever a callback URL is configured, replace the placeholder with the freshly generated webhook URL from your own n8n instance.
- WF8 and WF10 — regenerate the webhook URLs for the adhoc trigger nodes. These are the addresses you'll hit from your phone, so save them somewhere accessible (a pinned note, a phone shortcut, whatever works for you).
In n8n, webhook URLs are generated per-node, per-instance. They're not portable. Regenerating them takes about ten seconds per node — it's just a click — but it's the step most people miss when importing a template.
Once they're set, the system behaves exactly as designed: event-driven, instant, no polling.
Ta,
James
Founder | Nunlimited