Members
Receive notifications when membership members are created, activated, updated, deleted, or when their subscription changes.
Overview
Member webhooks notify your application when changes occur to membership members. Members are users associated with a membership subscription — they can be invited by email, activated upon login, or managed through domain/IP-based auto-enrollment.
Use Cases
- Send welcome emails when new members are invited
- Grant access to content when members activate their membership
- Sync membership rosters to external systems
- Track membership seat usage and availability
- Trigger offboarding workflows when members are removed
- Update CRM records when member details change
Events
| Event | Description |
|---|---|
member.created | A member invitation was created |
member.activated | A member activated their membership |
member.updated | A member's details were updated |
member.deleted | A member was removed from the membership |
member.subscription_updated | A member's subscription was created, renewed, updated, canceled, or expired |
Member Statuses
| Status | Description |
|---|---|
pending | Member has been invited but has not yet activated |
active | Member has activated and has full membership access |
member.created
Triggered When
- A user is invited to a membership subscription via email
- A membership subscription has domain or IP address restrictions, and a new member record is created for a matching user (dispatched alongside
member.activatedif the user is already registered)
Payload
{
"type": "member.created",
"id": "evt_a1b2C3d4E5f6g7H8i9J0k1L2",
"created": 1704067200,
"data": {
"member": {
"object": "member",
"id": 150,
"status": "pending",
"site_id": 1,
"user_id": null,
"address_id": null,
"subscription_id": 200,
"invitation_email": "[email protected]",
"first_name": null,
"last_name": null,
"subscription": {
"id": 200,
"object_id": null,
"site_id": 1,
"status": "active",
"billing": "year",
"current_period_start": "2024-01-01T00:00:00.000000Z",
"current_period_end": "2025-01-01T00:00:00.000000Z",
"quantity": 1,
"cancel_at_period_end": false
},
"plan": {
"id": 50,
"amount": 12000,
"currency": "usd",
"interval": "year",
"interval_count": 1,
"product": {
"id": 10,
"name": "Team Membership",
"description": "Annual team membership plan"
},
"site_ids": [1]
},
"customer": {
"object": "customer",
"id": 67890,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
}
}
}When a member is first invited,
user_id,first_name, andlast_nameare typicallynullbecause the invited user has not yet registered or logged in. Thecustomerobject represents the subscription owner, not the invited member.
member.activated
Triggered When
- A user logs in or registers after receiving a membership invitation email
- A membership subscription has domain or IP address restrictions, and a matching user logs in or registers — both
member.createdandmember.activatedare dispatched - A pending member is activated via the API
Payload
{
"type": "member.activated",
"id": "evt_b2C3d4E5f6g7H8i9J0k1L2m3",
"created": 1704153600,
"data": {
"member": {
"object": "member",
"id": 150,
"status": "active",
"site_id": 1,
"user_id": 12345,
"address_id": null,
"subscription_id": 200,
"invitation_email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"subscription": {
"id": 200,
"object_id": null,
"site_id": 1,
"status": "active",
"billing": "year",
"current_period_start": "2024-01-01T00:00:00.000000Z",
"current_period_end": "2025-01-01T00:00:00.000000Z",
"quantity": 1,
"cancel_at_period_end": false
},
"plan": {
"id": 50,
"amount": 12000,
"currency": "usd",
"interval": "year",
"interval_count": 1,
"product": {
"id": 10,
"name": "Team Membership",
"description": "Annual team membership plan"
},
"site_ids": [1]
},
"customer": {
"object": "customer",
"id": 67890,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
}
}
}Once activated,
user_id,first_name, andlast_nameare populated with the member's own user record. Thecustomerobject still represents the subscription owner.
member.updated
Triggered When
- A member's address is updated
- A member's status changes
- Any publishable field on the member record is modified
Payload
{
"type": "member.updated",
"id": "evt_c3D4e5F6g7H8i9J0k1L2m3N4",
"created": 1704240000,
"data": {
"member": {
"object": "member",
"id": 150,
"status": "active",
"site_id": 1,
"user_id": 12345,
"address_id": 500,
"subscription_id": 200,
"invitation_email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"subscription": {
"id": 200,
"object_id": null,
"site_id": 1,
"status": "active",
"billing": "year",
"current_period_start": "2024-01-01T00:00:00.000000Z",
"current_period_end": "2025-01-01T00:00:00.000000Z",
"quantity": 1,
"cancel_at_period_end": false
},
"plan": {
"id": 50,
"amount": 12000,
"currency": "usd",
"interval": "year",
"interval_count": 1,
"product": {
"id": 10,
"name": "Team Membership",
"description": "Annual team membership plan"
},
"site_ids": [1]
},
"customer": {
"object": "customer",
"id": 67890,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
},
"previous_attributes": {
"address_id": null
}
}
}The
previous_attributesobject contains only the fields that changed, with their values before the update. Only publishable fields are included — internal fields are filtered out.
member.deleted
Triggered When
- A member is removed from a membership subscription
- A membership seat is revoked
The
member.deletedevent is dispatched before the member record is soft-deleted, so the full member data is available in the payload.
Payload
{
"type": "member.deleted",
"id": "evt_d4E5f6G7h8I9j0K1l2M3n4O5",
"created": 1704326400,
"data": {
"member": {
"object": "member",
"id": 150,
"status": "active",
"site_id": 1,
"user_id": 12345,
"address_id": 500,
"subscription_id": 200,
"invitation_email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"subscription": {
"id": 200,
"object_id": null,
"site_id": 1,
"status": "active",
"billing": "year",
"current_period_start": "2024-01-01T00:00:00.000000Z",
"current_period_end": "2025-01-01T00:00:00.000000Z",
"quantity": 1,
"cancel_at_period_end": false
},
"plan": {
"id": 50,
"amount": 12000,
"currency": "usd",
"interval": "year",
"interval_count": 1,
"product": {
"id": 10,
"name": "Team Membership",
"description": "Annual team membership plan"
},
"site_ids": [1]
},
"customer": {
"object": "customer",
"id": 67890,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
}
}
}member.subscription_updated
Triggered When
A subscription lifecycle event occurs on a membership subscription. One webhook is fired per member on the subscription. The subscription_event_type field indicates what happened to the subscription:
subscription_event_type | Trigger |
|---|---|
created | Membership subscription was created |
renewed | Membership subscription was renewed |
updated | Membership subscription was updated |
canceled | Membership subscription was canceled |
expired | Membership subscription expired or was deleted |
Payload
{
"type": "member.subscription_updated",
"id": "evt_e5F6g7H8i9J0k1L2m3N4o5P6",
"created": 1704412800,
"data": {
"member": {
"object": "member",
"id": 150,
"status": "active",
"site_id": 1,
"user_id": 12345,
"address_id": null,
"subscription_id": 200,
"invitation_email": "[email protected]",
"first_name": "Jane",
"last_name": "Smith",
"subscription": {
"id": 200,
"object_id": null,
"site_id": 1,
"status": "active",
"billing": "year",
"current_period_start": "2024-01-01T00:00:00.000000Z",
"current_period_end": "2025-01-01T00:00:00.000000Z",
"quantity": 1,
"cancel_at_period_end": false
},
"plan": {
"id": 50,
"amount": 12000,
"currency": "usd",
"interval": "year",
"interval_count": 1,
"product": {
"id": 10,
"name": "Team Membership",
"description": "Annual team membership plan"
},
"site_ids": [1]
},
"customer": {
"object": "customer",
"id": 67890,
"email": "[email protected]",
"first_name": "John",
"last_name": "Doe"
}
},
"subscription_event_type": "renewed"
}
}The
subscription_event_typefield is at the top level ofdata, alongsidemember. It tells you why this webhook was fired — which subscription lifecycle event triggered the notification. For pending members (invited but not yet registered),user_id,first_name, andlast_namemay benull.
Payload Fields
Member Object
| Field | Type | Description |
|---|---|---|
object | string | Object type identifier, always "member" |
id | integer | Unique identifier for the member |
status | string | Member status: "pending" or "active" |
site_id | integer | Associated site ID |
user_id | integer | null | User ID of the member (null if not yet registered) |
address_id | integer | null | Associated address ID |
subscription_id | integer | Parent membership subscription ID |
invitation_email | string | null | Email address the invitation was sent to |
first_name | string | null | Member's first name from user record (null if not yet registered) |
last_name | string | null | Member's last name from user record (null if not yet registered) |
subscription | object | Parent subscription details (see Subscription Object) |
plan | object | Subscription plan with nested product (see Plan Object) |
customer | object | Subscription owner's customer record (see Customer Object) |
Subscription Object (Nested)
| Field | Type | Description |
|---|---|---|
id | integer | Subscription ID |
object_id | string | null | External gateway identifier (null for Pelcro Billing Engine) |
site_id | integer | Associated site ID |
status | string | Subscription status |
billing | string | Billing interval ("month", "year", etc.) |
current_period_start | string | ISO 8601 timestamp of current billing period start |
current_period_end | string | ISO 8601 timestamp of current billing period end |
quantity | integer | Subscription quantity |
cancel_at_period_end | boolean | Whether subscription cancels at period end |
Plan Object (Nested)
| Field | Type | Description |
|---|---|---|
id | integer | Plan ID |
amount | integer | Plan price in cents |
currency | string | Three-letter ISO currency code |
interval | string | Billing interval ("month", "year", etc.) |
interval_count | integer | Number of intervals between billings |
product | object | Associated product details |
site_ids | array | Site IDs where this plan is available |
Customer Object (Nested)
The customer represents the subscription owner, not the invited member.
| Field | Type | Description |
|---|---|---|
object | string | Always "customer" |
id | integer | Customer ID |
email | string | Customer email |
first_name | string | Customer first name |
last_name | string | Customer last name |
Previous Attributes (member.updated only)
| Field | Type | Description |
|---|---|---|
| (varies) | (varies) | Contains only the fields that changed, with their previous values. Only publishable fields are included. |
Subscription Event Type (member.subscription_updated only)
| Value | Description |
|---|---|
created | Membership subscription was created |
renewed | Membership subscription was renewed |
updated | Membership subscription was updated |
canceled | Membership subscription was canceled |
expired | Membership subscription expired or was deleted |
Related
- Webhooks Overview - Setup, signatures, and configuration
Updated about 6 hours ago
