Skip to main content
A delivery is one event headed to one endpoint. If three of your endpoints subscribe to contact.created, one new contact produces three deliveries, each tracked and retried on its own.

What counts as delivered

Ciarem sends the event the moment it happens, usually within a few seconds, and waits up to 10 seconds for your server to answer. A failed delivery is retried automatically.

Retries

After a failure, Ciarem waits and tries again, with a longer wait each time: Retries continue until the delivery is 3 days old. After that Ciarem gives up on it and marks it Failed. In practice that is about 14 attempts. Retries run once a minute, so an attempt can start up to a minute after its scheduled time. Every attempt sends the same body with the same event id. Only the Ciarem-Signature header changes, because each attempt is signed with a fresh timestamp.

Delivery statuses

When an endpoint keeps failing

If every delivery to an endpoint fails for 3 days in a row, Ciarem turns the endpoint off. In the dashboard it shows Disabled after repeated failures; in the API, enabled is false and disabled_reason is auto_failures. A single successful delivery resets the count, so an endpoint with occasional failures is never disabled. While an endpoint is disabled:
  • Nothing is sent to it, and events that happen in the meantime are not saved for later.
  • Deliveries that were waiting for a retry are marked Failed.
To turn it back on, fix your server, then choose Enable in the endpoint’s menu, or send PATCH /v1/webhook-endpoints/{id} with {"enabled": true}. Delivery resumes with new events from that point on. To recover what you missed, see Catching up after downtime.

Pausing an endpoint yourself

Choose Disable in the endpoint’s menu, or send {"enabled": false}, to stop deliveries without deleting the endpoint. It behaves like the automatic case: nothing is sent while it is off, waiting retries are dropped, and enabling it later does not replay old events. disabled_reason is user. Deleting an endpoint also deletes its delivery log.

If your plan changes

Webhooks are part of API access. If your organization moves to a plan without it, or a trial ends without a subscription, Ciarem stops sending events immediately. Your endpoints are kept, and deliveries resume on their own when you are back on Growth or Scale. Events that happened in between are not sent afterwards.

Duplicates and order

Build your handler around two facts: The same event can arrive more than once. Ciarem guarantees each event is delivered at least once, not exactly once. A retry after your server processed the event but answered too slowly is the usual cause. Make handling safe to repeat:
  • Store the id of each event you process and skip any id you have seen before. Keeping ids for a few days is enough, since retries stop after 3 days.
  • Or make the action itself repeatable, for example “set the contact’s stage to X” instead of “move the contact one stage forward”.
Events can arrive out of order. A retried event arrives after newer ones, and two events seconds apart can swap places. Don’t assume the last event you received is the latest state:
  • Compare created_at on the envelope, or updated_at on the contact, with what you already stored, and ignore older data.
  • For conversations, expect that messages.inbound can arrive before the conversation.created of the same conversation.
  • When order matters, treat the event as a signal and read the current state from the API.

The delivery log

Every delivery of the last 30 days is recorded, with the exact body that was sent. In the dashboard: open Settings → Webhooks and click an endpoint. The Deliveries table shows each event, its status, your server’s response code, and the number of attempts. Click a row to see the body that was sent, the event id, your server’s response or the error, and the last and next attempts. With the API:
response_status is null when your server never answered (a timeout or a connection error); error then says what went wrong. Two things are not in the log: test events, and deliveries about a contact that has since been permanently erased, which are removed along with the contact’s data.

Sending a delivery again

You can resend any delivery in the log, whatever its status, for example after fixing a bug in your handler.
  • In the dashboard: click the delivery to open it, then click Send again.
  • With the API: POST /v1/webhook-deliveries/{delivery_id}/redeliver.
The delivery goes back to Pending and is sent within a minute, with the same body and the same event id. Because the id is unchanged, a handler that deduplicates will skip it: clear that id on your side first if you want it processed again. Sending again is refused with 409 endpoint_disabled while the endpoint is off. Enable it first.

Catching up after downtime

Retries cover outages of up to 3 days. For anything longer, or for the time an endpoint was disabled, reconcile from the API:
  • Contacts: list them with GET /v1/contacts and compare updated_at with what you hold.
  • Conversations: list them with GET /v1/conversations and read the messages of the ones that changed.
A periodic reconciliation like this is good practice even when everything works. It protects you from bugs on your side that webhooks alone cannot reveal.

Managing endpoints with the API

Everything in the dashboard is also available to an API key. Full request and response details are in the API reference, under Webhooks. Errors specific to webhooks, on top of the general ones: These calls count toward your rate limit like any other API request. Events Ciarem sends to you do not.

Troubleshooting