How delivery works
- You register an endpoint in Hub under Settings → Webhooks.
- Immutable sends each event as a signed SNS notification to that URL.
- Your server verifies the signature, acknowledges with
200, and handles the payload asynchronously.
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 Hub → Settings → Webhooks → Add 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. Thedata object is type-specific.
audience_joined
audience_joined
Bundles every account the player currently has linked into one event, rather than one event per provider.No guaranteed order against
Shape of each entry in
linked_accounts: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.audience_account_linked / audience_account_unlinked
audience_account_linked / audience_account_unlinked
Share the same shape.For unlink events,
Shape of
linked_account: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 thesns-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:
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
200to SNS immediately and process the event asynchronously to avoid delivery timeouts. - Deduplicate. Use the
idfield 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’screated_atif sequencing matters. - Scope by project. The
project_idfield 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
typevalues your code does not recognize so catalog growth does not break your endpoint.