Skip to main content
Audience webhooks push CDP events to your HTTPS endpoint as they happen—account links, and additional event types as the catalog grows. Delivery is a signed HTTP POST you configure once in Hub; new event types reuse the same envelope and verification flow.

How delivery works

  1. You register an endpoint in Hub under SettingsWebhooks.
  2. Immutable sends each event as a signed SNS notification to that URL.
  3. Your server verifies the signature, acknowledges with 200, and handles the payload asynchronously.
All Audience webhook types share the same outer envelope (id, type, api_version, created_at, project_id, data). When new types ship, you subscribe to them in Hub and branch on type—you do not need a new integration pattern.

Available event types

The catalog starts with account-link lifecycle events. More Audience event types will be added over time; treat the table below as the current set, not the final set. Every event is scoped to whichever project a player’s game currently maps to, not a project it used to belong to. If a game moves between projects, past events aren’t regenerated for the new one. Select the types you care about when you create or edit the webhook in Hub. Unsupported or future types simply do not appear until they are released.

Configure in Hub

Go to HubSettingsWebhooksAdd Webhook, enter your HTTPS URL, and choose which Audience event types to receive. You can add up to 10 webhook endpoints per environment, so routing the same events to more than one system (for example, a production and a staging backend) doesn’t require a second project.

Payload shape

Every event uses this envelope. The data object is type-specific.
Bundles every account the player currently has linked into one event, rather than one event per provider.Shape of each entry in linked_accounts:
No guaranteed order against audience_account_linked. If a player links an account and joins your audience around the same time, the two events can arrive in either order and may describe an account you’ve already seen from the other. Handle each independently.
Share the same shape.Shape of linked_account:
For unlink events, type is audience_account_unlinked. All other fields are identical, including linked_at, it’s still the time of the link being undone, not the unlink time. Use the envelope’s created_at if you need the unlink time itself.A linked account belongs to at most one player at a time. Linking a different account on the same provider is rejected until the current one is unlinked first.

Verify the signature

Webhooks are signed by AWS SNS using RSA. Verify signatures using the sns-validator npm package. There is no shared secret or custom header. SNS delivers messages with Content-Type: text/plain. If you use Express, configure a raw text body parser for your webhook route:
Then verify the signature and topic ARN:
Checking TopicArn confirms the event originated from Immutable’s infrastructure and not a third-party SNS topic. Handle events by switching on event.type so new types can be added without changing verification.

Retry policy

Failed deliveries retry automatically with exponential backoff: 15 attempts, starting at 5 seconds and increasing up to 260 seconds between tries. AWS caps total retry time at 60 minutes for any HTTPS endpoint, so retries stop within that window at the latest. After that, the event is held in a dead-letter queue for 14 days, then discarded. There is no manual redelivery from Hub today. If your endpoint is down for longer than the retry window, treat those events as lost. See the SNS delivery retry policy for background on how AWS implements this.

Best practices

  • Respond quickly. Return 200 to SNS immediately and process the event asynchronously to avoid delivery timeouts.
  • Deduplicate. Use the id field to detect duplicate deliveries. The same event may arrive more than once.
  • Order by created_at, not delivery order. Events aren’t guaranteed to arrive in the order they happened. Sort by the envelope’s created_at if sequencing matters.
  • Scope by project. The project_id field identifies which of your projects the player belongs to. A player can appear in multiple projects and trigger events for each.
  • Ignore unknown types safely. Log and skip type values your code does not recognize so catalog growth does not break your endpoint.