Skip to content
Available today

Outbound Webhooks

Send ContentPulse events to your own systems (Zapier, Slack, custom apps).

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:
  • 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:

  1. Create a new Zap, choose the Webhooks by Zapier trigger, event Catch Hook.
  2. Zapier shows a URL like https://hooks.zapier.com/hooks/catch/123456/abcdefg/. Copy it.

Make.com:

  1. New Scenario → add a Webhooks → Custom webhook module.
  2. Click Add to create a new webhook; copy the URL Make.com generates.

Slack:

  1. Go to https://api.slack.com/apps → Create New App → From scratch.
  2. Enable Incoming Webhooks, then Add New Webhook to Workspace, choose the channel.
  3. Copy the Webhook URL (https://hooks.slack.com/services/...).
  4. 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:

  1. Build an endpoint that accepts POST with Content-Type: application/json and returns HTTP 2xx within 30 seconds.
  2. 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

  1. Go to https://contentpulse.helloaurora.ai/settings/webhooks.
  2. Click New Webhook.
  3. Paste the URL.
  4. Select the events you want to receive. Available events:
    • repurpose.started — generation started for a source
    • repurpose.complete — all pieces generated for a source
    • repurpose.failed — generation failed
    • piece.generated — a single piece was generated
    • piece.qa_passed — a piece passed QA
    • piece.qa_failed — a piece failed QA
    • piece.published — a piece was published to a destination
    • piece.status_changed — a piece moved between states
    • batch.complete — a bulk job finished [Screenshot to be added](screenshot:ContentPulse webhooks page with event checkboxes)
  5. 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-Id header; 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-parser mutate the body; use express.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.

Ready to connect Outbound Webhooks?

Sign up for ContentPulse and you'll find this integration in Settings → Connections.