What it does in ContentPulse: Sends real-time HTTP notifications to a URL you control whenever certain events happen in ContentPulse — a piece is generated, QA passes, content is published, etc. Plug them into Zapier, Make, n8n, Slack, your CRM, or your own internal apps. Status: Available Tier: Available on Pro and higher.
Before you start (prerequisites)
- Account requirement: A URL that can accept HTTPS POST requests with a JSON body. This can be:
- A Zapier or Make.com "Webhook" trigger URL
- A Slack incoming webhook (https://api.slack.com/messaging/webhooks)
- Your own backend endpoint
- A no-code receiver like https://webhook.site for testing
- Cost: Free on ContentPulse's side. Third-party costs depend on what you connect (Zapier free plan: 100 tasks/month; Slack: free).
Step-by-step setup
1. On the receiver side — get a webhook URL
This step depends on what you're connecting. A few common cases:
Zapier:
- Create a new Zap, choose the Webhooks by Zapier trigger, event Catch Hook.
- Zapier shows a URL like
https://hooks.zapier.com/hooks/catch/123456/abcdefg/. Copy it.
Make.com:
- New Scenario → add a Webhooks → Custom webhook module.
- Click Add to create a new webhook; copy the URL Make.com generates.
Slack:
- Go to https://api.slack.com/apps → Create New App → From scratch.
- Enable Incoming Webhooks, then Add New Webhook to Workspace, choose the channel.
- Copy the Webhook URL (
https://hooks.slack.com/services/...). - Note: Slack's incoming webhooks expect a specific JSON shape (
{"text": "..."}). ContentPulse sends a richer payload by default, so for Slack you'll usually want to route through Zapier or a small Cloudflare Worker that reformats the payload.
Your own backend:
- Build an endpoint that accepts POST with
Content-Type: application/jsonand returns HTTP 2xx within 30 seconds. - Verify the signature header (see "Verifying signatures" below) — this is how you confirm the request really came from ContentPulse.
2. In ContentPulse — register the webhook
- Go to https://contentpulse.helloaurora.ai/settings/webhooks.
- Click New Webhook.
- Paste the URL.
- Select the events you want to receive. Available events:
repurpose.started— generation started for a sourcerepurpose.complete— all pieces generated for a sourcerepurpose.failed— generation failedpiece.generated— a single piece was generatedpiece.qa_passed— a piece passed QApiece.qa_failed— a piece failed QApiece.published— a piece was published to a destinationpiece.status_changed— a piece moved between statesbatch.complete— a bulk job finished [Screenshot to be added](screenshot:ContentPulse webhooks page with event checkboxes)
- Click Create Webhook. ContentPulse shows you a signing secret like
whsec_...exactly once — save it.
3. Verifying signatures (recommended for production)
Every ContentPulse webhook request includes these headers:
X-Webhook-Signature: <hex HMAC-SHA256 of body>
X-Webhook-Timestamp: <Unix seconds>
X-Webhook-Event: <event name, e.g. piece.published>
To verify in any language, compute HMAC-SHA256(body, your signing secret) and compare with X-Webhook-Signature (constant-time comparison). Example in Node.js:
import crypto from 'crypto';
function verify(body, signature, secret) {
const expected = crypto.createHmac('sha256', secret).update(body).digest('hex');
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
4. Verify it's working
- ContentPulse fires a test event immediately on creation. Check your receiver — you should see one POST.
- The webhook row on Settings → Webhooks shows "Last triggered" with a timestamp.
- If delivery fails, ContentPulse retries with exponential backoff (3 retries over ~10 minutes). After 5 consecutive failures, the webhook is auto-disabled and you'll see a yellow banner on the page.
What you can do with it once connected
- Notify your team in Slack when a piece is ready for review.
- Auto-create a Linear/Notion task when a new batch completes.
- Push published-content URLs to a Google Sheet via Zapier.
- Trigger downstream automation (email a client, update a Trello card, etc.).
Common pitfalls
-
Pitfall: Receiver times out → ContentPulse retries → duplicate webhook fires. Fix: Make your receiver idempotent. Every webhook includes a unique
X-Webhook-Delivery-Idheader; dedupe on that. -
Pitfall: Webhook gets auto-disabled. Fix: Open Settings → Webhooks, find the row with the red "Disabled" badge, fix the receiver, then click "Re-enable". You may need to re-trigger a test event to confirm.
-
Pitfall: Signature verification fails. Fix: Make sure you're hashing the raw bytes of the request body, not a re-serialized version. Frameworks like Express's
body-parsermutate the body; useexpress.raw()for webhook endpoints specifically. -
Pitfall: Slack incoming webhook returns 200 but no message appears. Fix: Slack expects a specific
{"text": "..."}payload. ContentPulse's payload doesn't match. Use Zapier or a relay endpoint to reformat.
Restrictions
- 30-second response timeout — your endpoint must return 2xx within 30 seconds or we treat it as a failure.
- HTTPS only —
http://URLs are rejected. - Max 10 webhooks per workspace.
- No payload customization yet — every event has a fixed JSON shape. If you need a custom shape, filter and reshape in Zapier or Make.
Need help?
Email [support@helloaurora.ai](mailto:support@helloaurora.ai) — we'll walk you through it.