> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionicfi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks for platforms

> Receive connected accounts' events on one platform endpoint and match each event to the right merchant.

A platform webhook endpoint receives events from every connected account
whose connection allows it. Each event names the merchant it belongs to, so one
endpoint can keep your records current for all of the businesses on your
platform. Onboarding events for your own Account Links and connections arrive
on your platform's own endpoint.

Delivery, signatures, retries, and the event envelope work as they do for any
[webhook endpoint](/webhooks/overview).

## Set up the endpoint

1. Ask Ionic to enable `connect_webhooks` for your Platform Program and approve
   `webhook_endpoints:read` and `webhook_endpoints:write` in its permission
   ceiling.
2. In **Connect → API keys**, create a restricted platform key with the
   **Webhook management** preset. It manages endpoints only and grants no access
   to merchants' resources.
3. Create the endpoint with that key and no `Ionic-Account` header. The
   endpoint belongs to your platform.

To manage the same endpoints in the dashboard, switch to the Connect workspace
and open **Webhooks**.
Each test or live endpoint has its own signing secret. See
[Platform webhooks for connected accounts](/webhooks/endpoints#platform-webhooks-for-connected-accounts).

## Events your platform receives

Registering an endpoint grants no resource access. A merchant's event is
delivered when that merchant's connection is active and grants the matching
read permission, and your Platform Program allows that permission for Connect
webhooks.

| Events | Connection permission |
| - | - |
| `checkout.session.created`, `checkout.session.completed`, `checkout.session.expired` | `sessions:read` |
| `payment_intent.*`, `terminal_payment.*`, and `charge.settled` | `payments:read` |
| `refund.created`, `refund.succeeded`, `refund.failed`, `refund.settled` | `refunds:read` |
| `terminal_batch.*` and `terminal_provisioning_request.*` | `terminals:read` |
| `customer.created`, `customer.updated`, `customer.deleted`, `customer.restored` | `customers:read` |
| `subscription.created`, `subscription.updated`, `subscription.canceled` | `subscriptions:read` |
| `invoice.paid`, `invoice.payment_failed`, `invoice.marked_uncollectible` | `invoices:read` |
| `credit_note.created`, `credit_note.voided` | `credit_notes:read` |

See each type's payload in the [event catalog](/webhooks/events).

## Onboarding and connection events

| Events | What they report |
| - | - |
| `account.created`, `account.updated` | A merchant account's creation and status changes, such as `payments_enabled` |
| `connection.created`, `connection.activated`, `connection.permissions_updated`, `connection.suspended`, `connection.disconnected` | Changes to your relationship with a merchant |
| `account_link.created`, `account_link.completed`, `account_link.cancelled`, `account_link.expired` | Each hosted onboarding visit and its outcome |

These events require the Connect lifecycle release in your environment and
Connect webhooks on your Platform Program.
Subscribe to your platform's own events and connected accounts' events
separately; each endpoint has its own signing secret. See
[Hosted Connect lifecycle](/webhooks/events#hosted-connect-lifecycle).

## Match each event to a merchant

1. [Verify the signature](/webhooks/signatures) before reading the payload.
2. Read the top-level `account` field. It is the connected account's `mer_…` ID.
3. Match the merchant, the object ID, and the mode to the record your
   application stored, such as the order that holds the [PaymentIntent](/concepts/key-concepts#how-the-objects-connect) ID.
4. Deduplicate on the event `id`, and keep processing scoped to that merchant.

A verified signature proves the delivery came from Ionic. Matching the
merchant, object ID, and mode ties the event to your record.

## What's next

<CardGroup cols={2}>
  <Card title="Go live" icon="rocket" href="/guides/connect-go-live">
    Recreate your live configuration and verify each flow with real transactions.
  </Card>

  <Card title="Manage endpoints" icon="plug" href="/webhooks/endpoints">
    Create, update, and rotate webhook endpoints.
  </Card>

  <Card title="Handle duplicates and retries" icon="arrows-rotate" href="/webhooks/idempotency-and-retries">
    Process duplicate and out-of-order deliveries safely.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.