A plan grant expired.
All webhook payloads follow a consistent top-level structure with event-specific data nested within the data object.
The public plan grant ID.
The public customer ID.
The public subscription ID.
The public ID of the subscribed base plan.
The public ID of the plan whose access was granted.
The public ID of the immutable target plan release.
The plan grant status at this transition.
How the plan grant duration is defined at this transition.
The cycle count when duration is cycles.
When the plan grant started.
The effective expiration deadline, if any.
The reason recorded for this transition.
Where this transition originated.
When the plan grant was revoked, otherwise null.
When the plan grant was created.
When the represented transition occurred.
The grant timeline through the represented transition.
{
"event": "plan_grant.expired",
"timestamp": "2026-06-23T14:30:00.000Z",
"organizationId": "8f14e45f-ceea-4e7a-9c3d-1c2b3a4d5e6f",
"mode": "live",
"apiVersion": "2026-08-27",
"data": {
"id": "pgr_1a2b3c4d",
"customerId": "user_123",
"subscriptionId": "sub_1a2b3c4d",
"basePlanId": "pln_starter",
"targetPlanId": "pln_pro",
"targetPlanReleaseId": "plr_1a2b3c4d",
"status": "expired",
"duration": "cycles",
"durationCycles": 2,
"startsAt": "2026-08-01T00:00:00.000Z",
"expiresAt": "2026-10-01T00:00:00.000Z",
"reason": "Two-month product evaluation",
"source": "system",
"revokedAt": null,
"createdAt": "2026-08-01T00:00:00.000Z",
"updatedAt": "2026-10-01T00:05:00.000Z",
"events": [
{
"id": "gre_1a2b3c4d",
"type": "created",
"reason": "Two-month product evaluation",
"source": "api",
"previousExpiresAt": null,
"expiresAt": "2026-10-01T00:00:00.000Z",
"duration": "cycles",
"durationCycles": 2,
"requestedExpiresAt": null,
"createdAt": "2026-08-01T00:00:00.000Z"
},
{
"id": "gre_9i0j1k2l",
"type": "expired",
"reason": "Two-month product evaluation",
"source": "system",
"previousExpiresAt": null,
"expiresAt": "2026-10-01T00:00:00.000Z",
"duration": null,
"durationCycles": null,
"requestedExpiresAt": null,
"createdAt": "2026-10-01T00:05:00.000Z"
}
]
}
}After an expired Plan Grant is durably closed by billing discovery or while creating its replacement. The payload is the old grant at expiration, and its last timeline event is expired.
customer.state_changed also fires with trigger plan_access_ended when billing discovery expires the grant.
How is this guide?