Skip to content
FolioSign inStart your trial

Webhook event catalogue

Audience events

4 events. All groups

audience.subscriber_confirmed#

A subscriber confirmed their email address.

Metadata only. No conversation or question text, no contact details, no names or email addresses of people, and no crisis content. Ids, kinds, states and times so you can open the record in Folio.

data.object.object is subscriber.

Fields of data.object for audience.subscriber_confirmed
FieldTypeDescription
channels requiredobject[]Consent state per channel. No addresses are sent.
channel requiredenum: email | sms | whatsappThe channel.
state requiredstringWhere consent stands: none, pending, active, granted, bounced, complained or unsubscribed.
confirmed_at requiredstring (date-time) | nullWhen they confirmed.
created_at requiredstring (date-time)When they signed up.
id requiredstringThe subscriber id.
language requiredstringThe language they receive.
object requiredenum: subscriberAlways subscriber.
source requiredstringHow they signed up.
status requiredenum: pending | active | bounced | complained | unsubscribed | erasedThe subscriber state.
unsubscribed_at requiredstring (date-time) | nullWhen they opted out.

On updates, data.previous_attributes holds the earlier value of any of these that changed: status.

Example audience.subscriber_confirmed body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "channels": [
        {
          "channel": "email",
          "state": "active"
        }
      ],
      "confirmed_at": "2026-10-13T09:12:10Z",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "sub_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "language": "en",
      "object": "subscriber",
      "source": "website",
      "status": "active",
      "unsubscribed_at": "2026-10-13T09:12:10Z"
    },
    "previous_attributes": {
      "status": "pending"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "audience.subscriber_confirmed"
}

audience.subscriber_unsubscribed#

A subscriber opted out.

Metadata only. No conversation or question text, no contact details, no names or email addresses of people, and no crisis content. Ids, kinds, states and times so you can open the record in Folio.

data.object.object is subscriber.

Fields of data.object for audience.subscriber_unsubscribed
FieldTypeDescription
channels requiredobject[]Consent state per channel. No addresses are sent.
channel requiredenum: email | sms | whatsappThe channel.
state requiredstringWhere consent stands: none, pending, active, granted, bounced, complained or unsubscribed.
confirmed_at requiredstring (date-time) | nullWhen they confirmed.
created_at requiredstring (date-time)When they signed up.
id requiredstringThe subscriber id.
language requiredstringThe language they receive.
object requiredenum: subscriberAlways subscriber.
source requiredstringHow they signed up.
status requiredenum: pending | active | bounced | complained | unsubscribed | erasedThe subscriber state.
unsubscribed_at requiredstring (date-time) | nullWhen they opted out.

On updates, data.previous_attributes holds the earlier value of any of these that changed: status.

Example audience.subscriber_unsubscribed body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "channels": [
        {
          "channel": "email",
          "state": "active"
        }
      ],
      "confirmed_at": "2026-10-13T09:12:10Z",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "sub_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "language": "en",
      "object": "subscriber",
      "source": "website",
      "status": "active",
      "unsubscribed_at": "2026-10-13T09:12:10Z"
    },
    "previous_attributes": {
      "status": "pending"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "audience.subscriber_unsubscribed"
}

audience.subscriber_erased#

A subscriber's personal data was erased on request. Only the id and consent history remain.

Metadata only. No conversation or question text, no contact details, no names or email addresses of people, and no crisis content. Ids, kinds, states and times so you can open the record in Folio.

data.object.object is subscriber.

Fields of data.object for audience.subscriber_erased
FieldTypeDescription
channels requiredobject[]Consent state per channel. No addresses are sent.
channel requiredenum: email | sms | whatsappThe channel.
state requiredstringWhere consent stands: none, pending, active, granted, bounced, complained or unsubscribed.
confirmed_at requiredstring (date-time) | nullWhen they confirmed.
created_at requiredstring (date-time)When they signed up.
id requiredstringThe subscriber id.
language requiredstringThe language they receive.
object requiredenum: subscriberAlways subscriber.
source requiredstringHow they signed up.
status requiredenum: pending | active | bounced | complained | unsubscribed | erasedThe subscriber state.
unsubscribed_at requiredstring (date-time) | nullWhen they opted out.

On updates, data.previous_attributes holds the earlier value of any of these that changed: status.

Example audience.subscriber_erased body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "channels": [
        {
          "channel": "email",
          "state": "active"
        }
      ],
      "confirmed_at": "2026-10-13T09:12:10Z",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "sub_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "language": "en",
      "object": "subscriber",
      "source": "website",
      "status": "active",
      "unsubscribed_at": "2026-10-13T09:12:10Z"
    },
    "previous_attributes": {
      "status": "pending"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "audience.subscriber_erased"
}

audience.campaign_sent#

A campaign was sent to its recipients.

Metadata only. No conversation or question text, no contact details, no names or email addresses of people, and no crisis content. Ids, kinds, states and times so you can open the record in Folio.

data.object.object is campaign.

Fields of data.object for audience.campaign_sent
FieldTypeDescription
channel requiredenum: email | sms | whatsappHow it was sent.
created_at requiredstring (date-time)When it was created.
id requiredstringThe campaign id.
name requiredstringThe label the church gave the campaign.
object requiredenum: campaignAlways campaign.
recipients requiredintegerHow many people it went to.
scheduled_at requiredstring (date-time) | nullWhen it was scheduled for.
sent_at requiredstring (date-time) | nullWhen it was sent.
status requiredenum: draft | scheduled | sending | sent | cancelledWhere the send stands.

On updates, data.previous_attributes holds the earlier value of any of these that changed: status.

Example audience.campaign_sent body
{
  "actor": null,
  "api_version": "2026-12-01",
  "created": "2026-10-13T09:12:10Z",
  "data": {
    "object": {
      "channel": "email",
      "created_at": "2026-10-13T09:12:10Z",
      "id": "cmp_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
      "name": "Sunday recap",
      "object": "campaign",
      "recipients": 1240,
      "scheduled_at": "2026-10-13T09:12:10Z",
      "sent_at": "2026-10-13T09:12:10Z",
      "status": "sent"
    },
    "previous_attributes": {
      "status": "draft"
    }
  },
  "id": "evt_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
  "livemode": false,
  "object": "event",
  "request": {
    "id": "req_5f3c9a1e7b2d4c68a0e1f2d3c4b5a697",
    "idempotency_key": null
  },
  "type": "audience.campaign_sent"
}

Verified against API version 0.0.0-dev. Generated from the live OpenAPI document.