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.
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
idof each event you process and skip anyidyou 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”.
- Compare
created_aton the envelope, orupdated_aton the contact, with what you already stored, and ignore older data. - For conversations, expect that
messages.inboundcan arrive before theconversation.createdof 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.
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/contactsand compareupdated_atwith what you hold. - Conversations: list them with
GET /v1/conversationsand read the messages of the ones that changed.
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.