How to manage webhooks

Edited

Webhooks let you connect Content Camel to your other tools—CRMs, marketing automation platforms, Slack, or custom systems. When a specific event happens (like a prospect viewing shared content), Content Camel sends a notification that you can use to trigger follow-up actions automatically. You can deliver these events to any HTTP endpoint as a URL webhook, or send them directly to HubSpot as custom behavioral events.

Accessing webhooks

  1. Click Settings in the left sidebar

  2. Under Integrations, click Webhooks

Webhooks are an admin-only feature.

Creating a webhook

Click Add Webhook in the top-right corner to open the creation form.

Step 1: Choose the destination type

  • URL Webhook — Send events to any HTTP endpoint. Use this for custom integrations, Zapier, Make, or any service that accepts webhook payloads.

  • HubSpot — Send events directly to your connected HubSpot account as custom behavioral events. No URL configuration is needed on your side, but HubSpot does require a one-time setup by our support team (details below).

Step 2: Enter the endpoint

  • For URL Webhook: enter the full webhook URL (e.g., https://api.example.com/webhooks). HTTPS is required.

  • For HubSpot: this step is skipped—events route to your connected HubSpot account automatically.

Step 3: Choose the event type

Select which event triggers the webhook:

Event

ID

When it fires

Content Viewed

recipient.item.viewed

A recipient opens content you shared with them

Content Added

system.item.added

A new asset is added to the library

Content Updated

system.item.updated

An existing asset is modified (title, tags, description, etc.)

Click Create Webhook to save. The webhook starts firing on the next matching event immediately.

URL webhook payloads

Every URL webhook receives an HTTPS POST with a JSON body. Content Camel delivers events with at-least-once semantics—your endpoint should return a 2xx within a few seconds, and be idempotent.

Common envelope

All events share this shape—eventName identifies the event, and the remaining top-level fields describe the content involved:

{
  "eventName": "recipient.item.viewed",
  "id": "7b9845b2-e883-4511-8c77-08105166fe2b",
  "title": "Q4 Product Overview",
  "type": "item",
  "shortUrl": "https://share.contentcamel.io/abc123",
  "appUrl": "https://app.contentcamel.io/item/detail/7b9845b2-...",
  "metadata": {}
}

Event: recipient.item.viewed

Fires when a recipient opens a share link. Includes who shared it and basic engagement data.

{
  "eventName": "recipient.item.viewed",
  "id": "7b9845b2-e883-4511-8c77-08105166fe2b",
  "title": "Q4 Product Overview",
  "type": "item",
  "shortUrl": "https://share.contentcamel.io/abc123",
  "appUrl": "https://app.contentcamel.io/item/detail/7b9845b2-...",
  "viewUrl": "https://app.contentcamel.io/view/abc123",
  "sharedBy": "Dave Shanley",
  "sharedByEmail": "dave@contentcamel.io",
  "sharedToEmail": "prospect@acme.com",
  "sharedToOrganization": "Acme Inc.",
  "viewsCount": 3,
  "lastViewed": "2026-04-16T17:22:03.000Z",
  "metadata": {}
}

Event: system.item.added

Fires when new content is added to the library.

{
  "eventName": "system.item.added",
  "id": "c9a44477e90044d1839c58dfca072571",
  "title": "Enterprise Buyer's Guide",
  "type": "pdf",
  "appUrl": "https://app.contentcamel.io/item/detail/c9a4...",
  "createdBy": "marketing@contentcamel.io",
  "createdAt": "2026-04-16T17:20:00.000Z",
  "metadata": {}
}

Event: system.item.updated

Fires when an existing asset is modified (title, tags, description, funnel stage, etc.).

{
  "eventName": "system.item.updated",
  "id": "c9a44477e90044d1839c58dfca072571",
  "title": "Enterprise Buyer's Guide — 2026 Edition",
  "type": "pdf",
  "appUrl": "https://app.contentcamel.io/item/detail/c9a4...",
  "updatedBy": "marketing@contentcamel.io",
  "updatedAt": "2026-04-16T18:01:12.000Z",
  "metadata": {}
}

Delivery behavior

  • Timeout: your endpoint should respond within ~10 seconds

  • Retries: up to 3 attempts with exponential backoff on 5xx responses or connection errors

  • 4xx responses: treated as permanent failures—not retried—so make sure your endpoint returns 4xx only for genuinely bad payloads

  • Ordering: not guaranteed—order events by their own timestamp fields if sequence matters

  • No signing yet: webhook bodies are not currently HMAC-signed. If you need signature verification, contact support

Testing your webhook

  • Use a tool like webhook.site or RequestBin to inspect live payloads before pointing at production

  • Create a webhook in Content Camel pointing at the inspection URL, then share a piece of content with yourself to trigger recipient.item.viewed

  • Confirm the shape matches your integration's expectations, then update the URL to your real endpoint

HubSpot custom events

The HubSpot option sends Content Camel events as custom behavioral events on the HubSpot contact's timeline. This lets your sales team see content engagement directly in the Contact record, run workflows off content views, and report on which assets drive pipeline.

How it works

When a Content Camel event fires for a subscription set to HubSpot, we:

  1. Resolve the contact email from the event (usually sharedByEmail—the Content Camel user who shared the content)

  2. Look up the matching HubSpot contact

  3. Fire a custom behavioral event on that contact's timeline with the mapped properties below

Property mapping

Content Camel fields are mapped into HubSpot custom event properties:

Content Camel field

HubSpot property

Description

id

item_id

Unique item identifier

title

item_title

Item title

type

item_type

Type (item, site, collection)

shortUrl

item_short_url

Shortened share URL

appUrl

item_app_url

Content Camel app URL

viewUrl

item_view_url

Direct view URL for the recipient

sharedBy

shared_by_name

Sharer's name

sharedByEmail

shared_by_email

Sharer's email (used to match HubSpot contact)

sharedToEmail

shared_to_email

Recipient's email

sharedToOrganization

shared_to_organization

Recipient's organization

viewsCount

views_count

Total view count

lastViewed

last_viewed

Most recent view timestamp

metadata

metadata_json

Anything extra, serialized as JSON

Setup (requires our support team)

HubSpot custom events need a one-time setup because they involve creating the custom event schema inside your HubSpot portal. Every HubSpot portal is configured differently—different Hubs and tiers, different custom object setups, different workflow needs—so our support team works with you directly to get it right.

What support will coordinate with you:

  • Confirming your HubSpot subscription tier supports custom behavioral events

  • Creating a HubSpot Private App with the required scopes (events, and optionally crm.objects.contacts.read and crm.schemas.custom.read/write)

  • Defining the custom event schema in HubSpot (event name, property list)

  • Securely receiving your Private App token and storing it encrypted on our side

  • Validating the end-to-end flow with a test event on a real contact

  • Optionally customizing which email field matches your HubSpot contacts (defaults to sharedByEmail)

👉 To get started, email support@contentcamel.io with the subject HubSpot Webhook Setup and we'll schedule a short session to get it configured.

Once setup is complete, the HubSpot option in the Add Webhook form will deliver events to your HubSpot account automatically—no URL required.

Managing existing webhooks

Webhooks are grouped by event type on the settings page. Each webhook shows its status, destination URL (for URL webhooks), or an integration badge (for HubSpot).

Editing a webhook

Click the pencil icon on any URL webhook to edit its destination URL. The event type cannot be changed after creation—delete and recreate if you need a different event.

HubSpot webhooks cannot be edited from the UI. To change a HubSpot destination, delete the webhook and contact support to reconfigure.

Deleting a webhook

Click the trash icon on any webhook. A confirmation prompt appears inline—click the checkmark to confirm or the X to cancel.

Common use cases

  • Sales follow-up — Trigger a CRM task when a prospect views your shared content (recipient.item.viewed)

  • Slack notifications — Post to a channel when new content is added to the library (system.item.added)

  • HubSpot contact timeline — Record content engagement as custom behavioral events that sales reps see directly on the contact record

  • Content auditing — Log all content changes to an external system (system.item.updated)

  • Zapier / Make automations — Branch on eventName and route to the right downstream action

Best practices

  • Start with recipient.item.viewed — The highest-value event for sales teams. Real-time visibility into prospect engagement unlocks immediate follow-up.

  • Return quickly — Respond 2xx as soon as you've accepted the payload; do heavy work asynchronously so we don't time out and retry.

  • Be idempotent — Deduplicate using id + lastViewed (or the event timestamp) since retries can deliver the same event more than once.

  • Test with a public sandbox first — Use webhook.site or a staging endpoint before switching to production.

  • One webhook per event, per destination — Keep each webhook focused. You can have multiple webhooks for the same event if different systems need it.

  • Monitor your endpoint — If your receiver is down, deliveries may be dropped after retries. Set up uptime monitoring on the URL you register.

Troubleshooting

My webhook isn't firing.

  • Confirm the webhook is saved and listed under the event type on the settings page

  • Trigger the event yourself (for recipient.item.viewed, share a link with yourself and open it)

  • Check your endpoint's logs for an inbound POST—if nothing arrived, the webhook may have been deleted or the event didn't fire

I'm seeing 4xx responses in my logs.

  • 4xx is treated as a permanent rejection by Content Camel—we won't retry. Make sure your endpoint accepts JSON and returns 2xx for valid payloads.

  • If the payload shape is different from what you expect, inspect it against the examples above.

HubSpot events aren't showing on the contact timeline.

  • The most common cause is that sharedByEmail doesn't match any HubSpot contact. If the sharer isn't a known contact in your HubSpot portal, the event has nowhere to land.

  • Check HubSpot's Activity Feed for errors.

  • Reach out to support—we can look at delivery logs and the HubSpot side together.

Have questions?

For URL webhooks, email support@contentcamel.io. For HubSpot setup or changes, email support@contentcamel.io and we'll work with you directly.