member.* events
Member (subscriber) lifecycle events.
Member (subscriber) lifecycle events. A "member" in webhook events is the project-scoped subscriber, not a team member. Fires on joining, churning, bans, access grants and revocations, and the accounts a member connects on the connectors.
Background
Example envelope
Subscription-driven member events (joined, trial_joined, converted, churned, resource_added, resource_removed) carry flat identifier fields:
{
"id": "evt_01HX...",
"type": "member.joined",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"subscription_id": "5b7e2d40-1a86-4c39-97f2-e83d0b16c5a4",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
"subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
"access_code": "SLATE-SUNDAY-4F2A9"
}
}Moderation events (banned, unbanned, kicked, removed) instead nest a subscriber object:
{
"id": "evt_01HX...",
"type": "member.banned",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"subscriber": {
"id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
"status": "banned"
},
"reason": "Spamming referral links"
}
}data.subscriber carries the member's id and status only; resolve their connected accounts with the member identities endpoint.
Guarantees
member.joinedandmember.trial_joinedfire only for zero-payment acquisition: access-code redemptions and cardless trials. Paid checkouts emitsubscription.activatedwith nomember.*join event.member.trial_joinedaccompaniessubscription.trial_startedon the cardless-trial and access-code paths.member.convertedfires at most once per trial conversion, and only for Stripe.- No
member.*payload carries the subscriber's email. Resolve subscriber detail with the member endpoint usingsubscriber_id. - The members endpoint returns
email(member-chosen and verified) andbilling_email(taken from their payment provider, unverified). Both require a token withproject-user:view.
Required ability
Tokens subscribing to member.* events must carry project-user:view at mint time.
Events
member.joinedA subscriber joins by redeeming an access code against a paid plan.member.trial_joinedA subscriber joins on a trial via cardless trial or access-code redemption.member.convertedA trial converts to a paying subscription.member.churnedA subscriber's last active subscription lapsed.member.removedA subscriber is soft-deleted manually.member.bannedA creator bans a subscriber.member.unbannedA ban is lifted; the subscriber returns to churned status.member.kickedA subscriber is kicked from the project without a ban.member.resource_addedA subscriber gains access to a specific resource.member.resource_pendingA subscriber is entitled to a resource but has no account on its connector yet, so access waits for them to connect one.member.resource_reissuedA subscriber's access to a resource is being reissued: the old grant is revoked and a fresh one follows.member.access_extendedOutage Compensation banked the length of a connector outage on a member's purchase: one event per member, saying when they feel the extra time.member.resource_removedA subscriber loses access to a specific resource.member.identity_linkedA subscriber connects a platform account to their membership.member.identity_unlinkedA subscriber's connected platform account is disconnected from their membership.member.joined
WEBHOOKA subscriber joins by redeeming an access code against a paid plan.
When this fires
A subscriber redeems an access code against a plan with no trial window, gaining access to the project.
That is the only path that emits this event. A card, wallet, or crypto checkout emits subscription.activated and payment.succeeded, but no member.* join event at all. If the redeemed plan carries a trial, member.trial_joined fires instead of this event.
This event is access-code-only. Paid checkouts do not emit it. For a paying audience, use
subscription.activatedas the join signal.
Caveats
- The payload does not carry the subscriber's connected accounts. Resolve them with the member endpoint using
data.subscriber_id, which embedsidentities, one row per connected account with the connector key and the platform's own id. - Resource-level grants emit separate
member.resource_addedevents as the dispatcher processes each invite. - This event always accompanies
subscription.createdandaccess_code.redeemedfor the same subscription.
Related events
subscription.activated: the paid-checkout join signal.subscription.created: fires alongside on this path.member.trial_joined: trial counterpart.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.trial_joined
WEBHOOKA subscriber joins on a trial via cardless trial or access-code redemption.
When this fires
Two paths emit this event:
- Cardless trial start: a subscriber begins a trial that took no payment method.
- Access-code redemption on a trial plan: the redeemed plan sets
trial_ends_at, so this fires in place ofmember.joined.
A Stripe checkout that begins with a trial window emits subscription.activated and subscription.trial_started, but no member.* join event. Like member.joined, this event covers zero-payment acquisition only.
The data keys differ by path. Absent keys are omitted entirely, not sent as null.
Caveats
- A trial-joined member emits
member.convertedif the trial converts to paid, or rolls intomember.churnedonce the trial expires without converting. member.convertedis currently emitted for Stripe only. Trials taken through other providers will not produce a conversion event.subscription.createdandsubscription.trial_startedfire alongside this event on both paths.
Related events
subscription.trial_started: fires alongside.member.converted: fires on successful trial conversion (Stripe only).member.joined: non-trial counterpart.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.converted
WEBHOOKA trial converts to a paying subscription.
When this fires
A trial subscription successfully converts to a paying subscription: the subscription reaches active while the subscriber was previously in trialing status. Fires exactly once per conversion.
This event is currently emitted for Stripe only. Trials taken through PayPal, Paystack, Razorpay, Skrill, CeyPay, or CoinPayments do not produce a conversion event; detect those by watching payment.succeeded against a subscription you know began in trial.
Caveats
- Pairs with
payment.succeededfor the converting charge.subscription.activateddoes not fire at conversion; it already fired when the trialing subscription was first created. - A subscriber who churns and starts a new trial later does not re-emit
member.convertedfor the prior trial; each trial-conversion is its own bounded event.
Related events
member.trial_joined: predecessor.subscription.activated: fired earlier, when the trialing subscription was created; it does not repeat at conversion.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.churned
WEBHOOKA subscriber's last active subscription lapsed.
When this fires
A subscriber's last subscription is expired (by the five-minute expiry sweep, by a refund that ends access, or by a cancelled pass window) and no other subscription of theirs is still active. A cancellation or a failed payment does not churn the member on its own; churn follows only once the subscription is actually expired.
Caveats
- A subscriber with multiple overlapping subscriptions does not churn until the last one ends.
member.churneddoes not delete the subscriber row; if they re-subscribe later, a paid checkout emitssubscription.activatedand an access-code redemption emitsmember.joined.
Related events
subscription.expired: typical predecessor.member.joined: only if they return via an access code.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.removed
WEBHOOKA subscriber is soft-deleted manually.
When this fires
A creator manually removes a subscriber from the project. The subscriber is soft-deleted, their access is revoked, and any active subscription is cancelled.
Caveats
- Distinct from a ban: removed subscribers can rejoin, banned subscribers cannot. See
member.banned. - Distinct from a kick, which moves the subscriber to churned without soft-deleting the row. See
member.kicked.
Related events
member.banned,member.kicked: alternative discipline events.subscription.cancelled: fires alongside if there was an active subscription.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.banned
WEBHOOKA creator bans a subscriber.
When this fires
A creator bans a subscriber. Their access is revoked, the connector removes them from all linked resources, and they cannot re-join the project until the ban is lifted.
Caveats
- Bans persist across subscription cycles until explicitly lifted via
member.unbanned. - Active subscriptions are cancelled in the same flow; expect
subscription.cancelled.
Related events
member.unbanned: paired transition.member.kicked: softer discipline.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.unbanned
WEBHOOKA ban is lifted; the subscriber returns to churned status.
When this fires
A creator lifts a previously applied ban. The subscriber returns to a churned state: they can re-subscribe, but they do not automatically regain access to past subscriptions.
Caveats
- Unbanning does not restore prior subscriptions; the subscriber must purchase a new one to regain access.
- A subsequent purchase fires
subscription.activated; only an access-code redemption firesmember.joined.
Related events
member.banned: paired transition.subscription.activated: fires if the subscriber repurchases.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.kicked
WEBHOOKA subscriber is kicked from the project without a ban.
When this fires
A creator kicks a subscriber without banning them. The member's status moves to churned, every active subscription is cancelled, and the connector evicts them from every resource they held. The only difference from a ban is that a kick can be reversed by re-subscribing, whereas a ban blocks re-entry until it is lifted.
Caveats
- A kick evicts the member from every resource their subscriptions granted; expect one
member.resource_removedper resource. - Every active subscription is cancelled in the same flow; expect
subscription.cancelledfor each.
Related events
member.banned: escalation path.member.resource_removed: paired resource event.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.resource_added
WEBHOOKA subscriber gains access to a specific resource.
When this fires
Subscriby asks the resource's connector to give a subscriber access to one of the resources their subscription grants (on a connector that grants by link, a join-request invite link named after them) and writes the grant to the access ledger. Each resource grant emits its own event. The event marks the grant, not the subscriber's arrival: they may not have opened the link yet; the ledger row named by grant_id moves from pending to granted when they do. A manual perk arrives here too, once the creator completes its task (creator_task.completed precedes it).
Caveats
- Ordering against the join event is not guaranteed: the dispatcher is queued before
member.joinedis emitted on the access-code path, and paid joins emit nomember.*join event at all. Treat resource events as independent. - A manual perk emits this event only when its creator task is completed, never at purchase; until then the member's grant is
pendingandcreator_task.openedis what fired.
Related events
member.resource_removed: paired transition.member.joined,member.trial_joined: typical predecessors.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.resource_pending
WEBHOOKA subscriber is entitled to a resource but has no account on its connector yet, so access waits for them to connect one.
When this fires
A purchase entitles a subscriber to a resource on a connector where the subscriber has no connected account: a member who bought on the portal with only an email, or a plan that spans a connector the member has not linked. Nothing can be issued, so the access ledger records a grant in state pending_identity and this event says so. The moment the member connects an account on that connector (from the portal, by signing in through the connector, or by adopting an account from a sibling project), the grant is issued and member.resource_added follows with the same grant_id.
Caveats
- One event per resource the purchase entitles the member to on that connector; a plan with three channels raises three, all waiting on the same account.
- Nothing is sent to the member by the bot; it cannot reach them yet. The portal shows the pending access on the membership card; an integration that wants to nudge them should use the email it holds.
- A subscription that ends before the account is connected leaves the grant
pending_identityin the ledger; nomember.resource_removedis raised for access that was never given.
Related events
member.resource_added: raised for the samegrant_idonce the account is connected and access is issued.member.identity_linked: the act that releases the pending grants.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.resource_reissued
WEBHOOKA subscriber's access to a resource is being reissued: the old grant is revoked and a fresh one follows.
When this fires
A creator (over the API, an MCP agent, or the members page) asks for a subscriber's access to be reissued: the grant the subscriber held on a resource is revoked (on a connector that grants by link, the personal invite link dies) and the dispatcher that grants at purchase runs again to issue a fresh one. Each resource emits its own event, and member.resource_added follows for the new grant. The member's own Refresh invite links in the bot does the same and raises the same event.
Caveats
- Revoking the old grant is best effort: a link the platform no longer knows is treated as already gone, and the reissue goes ahead regardless.
- The member is messaged the fresh links by the bot when it can reach them, so do not follow this event with a nudge of your own.
Related events
member.resource_added: the fresh grant, moments later.member.resource_removed: access taken away without a replacement.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.access_extended
WEBHOOKOutage Compensation banked the length of a connector outage on a member's purchase: one event per member, saying when they feel the extra time.
When this fires
A connector outage that lasted an hour or more ended because the connector recovered or was replaced, and the project's Outage Compensation setting is on. Every purchase that grants access right now and unlocks a place on that connector has the outage's length banked, and this event fires once for each of them.
applies_at says when the member feels it:
now: a one-time or lifetime-style purchase with a fixed end.ends_athas already moved later byextended_seconds.membership_end: a recurring plan. No gateway lets a renewal move by a few hours, so the time is banked instead: the member's access always runsbanked_secondspast the period they last paid for, and they receive the time when the membership ends, whether they cancel, lapse or a renewal fails. Their renewal date and charges do not change.
banked_seconds is the purchase's running total across every outage it lived through; extended_seconds is what this outage added. The member is told in the chat their connector binds to them and by email; the same fact shows on their portal card and in the bot.
Caveats
- Passes and series are never extended: a dated window cannot move, so no event fires for them.
- Perk-only plans are not affected by an outage and receive nothing.
- A project that switched Outage Compensation off, an outage shorter than an hour, or one that ended with an uninstall, fires no
member.access_extendedat all;connector.outage_compensatedstill fires withmembers_extended: 0.
Related events
connector.outage_compensated: the one-line settlement summary that follows these.connector.outage_closed: the outage this compensates.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.resource_removed
WEBHOOKA subscriber loses access to a specific resource.
When this fires
A subscriber is evicted from a specific resource: after a subscription expires or is cancelled, after a ban, kick or removal, or when a pass window closes or is cancelled. Each resource revocation emits its own event. Nothing is emitted when another still-active subscription of theirs grants the same resource: the invite link is revoked but the member stays in.
Caveats
- Multiple revocations for the same subscriber typically arrive in close succession when a subscription expires; use
SB-Event-Idfor dedupe. - A manual perk emits this event only when its grant is revoked on the ledger; a place a connector gates emits it once the connector has been asked to remove the member.
Related events
member.resource_added: paired transition.subscription.expired,subscription.cancelled,member.kicked: typical triggers.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.identity_linked
WEBHOOKA subscriber connects a platform account to their membership.
When this fires
A member of the project gains a connected account on a connector: the platform account that signs them in to the portal and that the project's bot knows them by. Three doors raise it: the member completes Connect … from the portal's Account & Recovery screen and the project's bot confirms the account; the member signs in to the portal through a connector the project had not seen them on before; or the member taps Use the same account to adopt an account they already use in another of the creator's projects. Each connected account emits its own event. Nothing is emitted when an account the member already holds is confirmed again.
Caveats
identity_idis the account row, not the link: the same value appears inmember.identity_unlinkedand in theidentitiesof the member endpoint. The link's ownid(what the disconnect endpoint takes) is only in the REST payloads.- Accounts the bot creates on first contact are mirrored into the identity tables without raising this event; it is reserved for acts the member takes.
Related events
member.identity_unlinked: paired transition.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
member.identity_unlinked
WEBHOOKA subscriber's connected platform account is disconnected from their membership.
When this fires
A connected account is removed from a member: by the member on the portal's Account & Recovery screen (Disconnect), or by the creator over the disconnect endpoint or the unlink_member_identity MCP tool. The account stops signing the member in to the portal and the project's bot stops knowing them by it. Nothing is emitted when the removal is refused because the account was the member's last way to sign in.
Caveats
- The member keeps their subscriptions and grants; only the way they sign in and are reached changes. A member with no connected account left is reached by email.
- The event does not say who asked. Read the activity log for the actor when it matters.
Related events
member.identity_linked: paired transition.
Ability to subscribe
A token needs this to subscribe an endpoint to the event.
Header Parameters
t=<unix seconds>,v1=<hex>: the HMAC-SHA256 of "<t>.<raw body>" under the endpoint's secret. Verify it before acting, and refuse a t more than 300 seconds from now. During a secret rotation a v0= signature under the previous secret may precede v1=.
The event's ULID, bare. The envelope's id is the same ULID prefixed evt_, so strip the prefix before comparing. Deduplicate on it: a retry carries the same id.
The event name, the same as the envelope's type.
Always application/json.
Always Subscriby-Webhooks/1.0.
Payload
JSONWhat Subscriby posts to your endpointapplication/json
The signed JSON envelope posted to your endpoint.
The envelope every event is delivered in.
Responses
2XXAny success status
Your endpoint acknowledged the delivery. Any 2xx status within 30 seconds marks it delivered; the response body is ignored.
defaultAny other status
Any other status, a connection failure, or no answer within 30 seconds counts as a failed attempt. The delivery is retried 8 times, after 10 seconds, 30 seconds, 2 minutes, 10 minutes, 1 hour, 6 hours, 1 day, 3 days; the last failure dead-letters it, and it can be retried from the dashboard or POST /v1/webhook-deliveries/{delivery}/retry. After 20 consecutive failures the endpoint is paused until it is resumed.
How is this guide?