Members
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 3 months ago
