Skip to content

campaign.finished ​

POSTyour webhook address

Campaign finished. A campaign of the console completed or was stopped. The numbers are those of the moment it finished: the delivery of its messages goes on and comes as message.* events.

Body ​

FieldTypeDescription
typestringAlways campaign.finished.
timestampstring (date-time)When the event happened, UTC.
dataobject
data.idstringThe campaign, cmp_….
data.namestring
data.statusstringOne of: completed, stopped.
data.recipientsintegerRecipients of the campaign, the control group included.
data.sentintegerMessages accepted for sending.
data.skippedintegerRecipients that got no message: a stop list, an invalid number, a missing variable.
data.controlintegerThe control group: recipients left without a message on purpose.
data.started_atstring (date-time), nullable
data.finished_atstring (date-time)
json
{
  "type": "campaign.finished",
  "timestamp": "2026-11-02T14:30:00+00:00",
  "data": {
    "id": "cmp_CgdWeHQNKTXRFhMrxkn9z",
    "name": "Reactivation — November",
    "status": "completed",
    "recipients": 12840,
    "sent": 12115,
    "skipped": 83,
    "control": 642,
    "started_at": "2026-11-02T12:00:00+00:00",
    "finished_at": "2026-11-02T14:30:00+00:00"
  }
}

Headers ​

HeaderDescription
webhook-idThe delivery, whd_…. The same on every attempt of one delivery: use it to drop a repeated delivery.
webhook-timestampUnix time of the attempt, in seconds. Refuse deliveries older than 5 minutes.
webhook-signaturev1, and the base64 HMAC-SHA256 of {webhook-id}.{webhook-timestamp}.{body}, keyed with the secret (the part after whsec_, base64-decoded).
content-typeapplication/json
user-agentACE-SEND-Webhooks/1

Check the signature before you trust the body, answer 2xx within 5 seconds and do the work afterwards. See Webhooks for the signature check, retries and duplicates.

ACE SEND API v1