Campaign events
Campaigns created, changed, scheduled, sent, canceled, archived or deleted.
campaign.created
Sent when a campaign is created with Create a campaign or in the dashboard, including when you duplicate a campaign. New campaigns start as draft.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.created.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways draft.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.created",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00"
}
}
}campaign.updated
Sent when a campaign’s content or settings change, for example with Update a campaign, or when it goes back to draft because you canceled its schedule or unarchived it in the dashboard. When the status changed, previous_status holds the old status.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.updated.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringCurrent status: draft, scheduled, queued, sending, sent, canceled or archived.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringStatus before the change. Included only when the status changed.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.updated",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "scheduled"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "scheduled"
}
}
}campaign.scheduled
Sent when you schedule a draft campaign with Send or schedule a campaign and a future scheduled_at, or in the dashboard. See Test and schedule.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.scheduled.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways scheduled.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringStatus before the change, usually draft.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.scheduled",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "scheduled",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": "2026-10-02T08:00:00.000000+00:00",
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "scheduled",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": "2026-10-02T08:00:00.000000+00:00",
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
}
}
}campaign.queued
Sent when a scheduled campaign’s send time arrives and Emailit queues it. campaign.sending follows when sending starts.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.queued.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways queued.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringAlways scheduled.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.queued",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "queued",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": "2026-10-02T08:00:00.000000+00:00",
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "scheduled"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "queued",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": "2026-10-02T08:00:00.000000+00:00",
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "scheduled"
}
}
}campaign.sending
Sent when Emailit starts sending a campaign: right away when you send it with Send or schedule a campaign or from the dashboard, or when a queued scheduled campaign starts.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.sending.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways sending.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringdraft when you sent the campaign right away, queued for a scheduled campaign.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.sending",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "sending",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:00:03.214000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "sending",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:00:03.214000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
}
}
}campaign.sent
Sent when Emailit has created and queued an email for every subscribed recipient of the campaign. Delivery, open and click events for the individual emails follow as they happen. See Campaign reports.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.sent.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways sent.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringAlways sending.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.sent",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "sent",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:04:51.000000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "sending"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "sent",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:04:51.000000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "sending"
}
}
}campaign.canceled
Sent when you cancel a campaign with Cancel a campaign. Only draft and sending campaigns can be canceled.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.canceled.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways canceled.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringdraft or sending.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.canceled",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "canceled",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "canceled",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "draft"
}
}
}campaign.archived
Sent when you archive a sent campaign in the dashboard. Unarchiving it returns it to draft and sends campaign.updated with previous_status set to archived.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.archived.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringAlways archived.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
previous_statusstringAlways sent.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.archived",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "archived",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:04:51.000000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "sent"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "archived",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": "2026-10-01T10:04:51.000000+00:00",
"created_at": "2026-09-29T15:10:44.031000+00:00",
"previous_status": "sent"
}
}
}campaign.deleted
Sent when a campaign is deleted with Delete a campaign or in the dashboard. The payload is the campaign as it was before it was deleted.
Webhook requests carry a JSON array of events like this one; see Webhook requests.
Fields
event_idstringEvent ID (evt_…). A retried request carries the same ID, so use it to skip events you already handled. You can also look the event up with Retrieve an event.
typestringAlways campaign.deleted.
objectobjectThe campaign the event describes. Its fields are listed below.
data.objectobjectThe same object again, in the shape that the Events API returns in data.
Campaign object
idstringCampaign ID (cmp_…).
objectstringAlways campaign.
namestringCampaign name.
statusstringStatus the campaign had when it was deleted.
subjectstringSubject line, or an empty string if it isn’t set yet.
from_emailstringSender address, or an empty string.
from_namestringSender name, or an empty string.
scheduled_atstring | nullWhen the campaign is scheduled to send, or null.
sent_atstring | nullWhen the campaign was sent, or null.
created_atstringWhen the campaign was created, in ISO 8601 with a UTC offset.
{
"event_id": "evt_2xLc9Rr4Tn6Wb1Qm8Ks3Vf0Hd7a",
"type": "campaign.deleted",
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00"
},
"data": {
"object": {
"id": "cmp_2xLf3Gd8Wr5Mb0Tq6Yn1Kc4Hs9e",
"object": "campaign",
"name": "October product update",
"status": "draft",
"subject": "What's new in October",
"from_email": "news@acme.com",
"from_name": "Acme",
"scheduled_at": null,
"sent_at": null,
"created_at": "2026-09-29T15:10:44.031000+00:00"
}
}
}