Developing Ghost Integrations via Webhooks/Zapier
We develop Ghost integrations using Webhooks and Zapier—automate publishing, CRM sync, and notifications. With over 5 years of Ghost experience and 30+ projects for media, blogs, and educational platforms, we know the pitfalls. Recently, for a major media project, we set up Ghost integration with Telegram, Slack, and Mailchimp, cutting notification time by 2 hours per day. According to Wikipedia, webhooks are an efficient way to receive real-time data. Ghost sends webhooks when you publish a post, update a page, or add a member. Through Zapier or a custom handler, these events connect to external systems without custom Ghost code. But for complex scenarios requiring filtering or data transformation, we write code—that's where we step in.
Typical Ghost Integration Problems
When syncing Ghost with external services, common issues arise: incorrect webhook signature verification, event loss during failure, and data duplication. For example, when a post is published, a notification must be sent to Telegram. If the handler doesn't respond with 2xx, Ghost retries the request, causing duplicates. Our solution? An idempotent handler that checks event ID uniqueness.
Step-by-step Zapier setup guide
- In Ghost Admin, go to Integrations → Zapier.
- Copy the Zapier Webhook URL.
- In Zapier, create a new Zap with trigger Webhook → Catch Hook.
- Paste the URL and select the Ghost event.
- Add an action: choose the service (Slack, Mailchimp, etc.) and configure fields.
- Enable the Zap.
How to Automate Ghost Sync with CRM via Webhooks?
Ghost Admin → Settings → Integrations → Add custom integration → Webhooks. Available events:
| Event | Typical Use |
|---|---|
post.published |
Notify social media and messengers |
post.unpublished |
Remove from publication |
post.deleted |
Clear cache |
member.added |
Add to CRM or email list |
subscriber.added |
Record in subscriber database |
We ensure your webhook handler properly verifies requests. Below is a typical handler in Node.js/Express with signature verification:
import crypto from 'crypto'; function verifyGhostWebhook(body: Buffer, signature: string, secret: string): boolean { const hmac = crypto.createHmac('sha256', secret); hmac.update(body); return hmac.digest('hex') === signature.split('sha256=')[1]; } app.post('/webhooks/ghost', express.raw({ type: 'application/json' }), (req, res) => { const sig = req.headers['x-ghost-signature'] as string; if (!verifyGhostWebhook(req.body, sig, process.env.GHOST_WEBHOOK_SECRET!)) { return res.sendStatus(401); } const payload = JSON.parse(req.body.toString()); const event = req.headers['x-ghost-event']; // 'post.published' handleGhostEvent(event as string, payload); res.sendStatus(200); }); async function handleGhostEvent(event: string, payload: any) { switch (event) { case 'post.published': // Send to Slack, update sitemap, notify Telegram channel await notifySlack(payload.post.current); await rebuildSitemap(); break; case 'member.added': await addToMailchimp(payload.member.current); break; } } Step-by-step custom webhook handler setup
- Create an endpoint on your server (Node.js, Python, PHP).
- Add signature verification as in the example above.
- Register the webhook in Ghost Admin → Integrations → Add custom webhook.
- Enter your endpoint URL and select events.
- Test using Ghost's Test Webhook feature.
Why Zapier Isn't the Only Option for Ghost Integrations?
Ghost has an official Zapier app. Example Zaps:
| Zap | Action |
|---|---|
| Ghost → Slack | Notify channel on publish |
| Ghost → Twitter/X | Auto-post with title and link |
| Ghost → Airtable | Log new members |
| Ghost → ConvertKit | Add subscribers to email sequence |
For custom events—Zapier Webhooks (Catch Hook): Trigger: Ghost webhook → Zapier Webhook URL, Action: POST to Zapier → any action in 6000+ services.
Zapier limits customization: you cannot change data format, add conditional logic, or filter events. A custom webhook handler solves these—for example, cross-posting to social networks with text truncation:
// On post.published async function crossPost(post: GhostPost) { const text = `${post.title}\n\n${post.excerpt || ''}\n\n${post.url}`; // Twitter/X via API v2 await twitterClient.v2.tweet({ text: text.substring(0, 280), }); // Telegram await bot.sendMessage(CHANNEL_ID, text, { parse_mode: 'HTML', reply_markup: { inline_keyboard: [[{ text: 'Read', url: post.url }]], }, }); } Comparison: Zapier vs. Custom Webhook Handler
| Criterion | Zapier | Custom Webhook |
|---|---|---|
| Time to launch | 1–2 hours | 4–8 hours (basic) |
| Customization | Low | High |
| Logic (conditions, filters) | Limited | Full |
| Cost | Subscription + tiers | One-time development |
| Number of integrations | 6000+ services | Any with API |
| Security (verification) | Built-in | Implemented in code |
A custom webhook is 3 times more flexible than Zapier in data processing: you can change format, add filters, and conditional transitions. This reduces operational costs by 20–30%. Order a custom handler for non-standard scenarios.
What's Included in Our Ghost Integration Work
We provide:
- Documentation: webhook event schema, request/response examples, deployment instructions.
- Access: to code repository, documentation, test environment.
- Training: how to add a new webhook or change logic.
- Support: bug fixes and updates for new Ghost versions.
Setting up 2–3 webhook integrations (Slack + Telegram + sitemap rebuild) takes 4–8 hours. Zapier automations without code take 1–2 hours.
Contact us for project evaluation: we'll analyze your scenarios and propose the optimal solution—Zapier or custom webhook. Get a free consultation. Reach out for an audit of your integration processes—we'll find automation opportunities.







