trial.expired
Fired when a trial period runs out and regular billing begins.
Payload
All webhook payloads follow a consistent top-level structure with event-specific data nested within the data object.
The subscription ID.
The customer ID. Returns your externalId if you provided one when creating the customer, otherwise returns the Commet publicId.
Current status — "active" once the billing cycle has activated the subscription.
The plan ID.
The plan name.
ISO 8601 datetime when the trial ended.
{
"event": "trial.expired",
"timestamp": "2026-04-08T01:00:00.000Z",
"organizationId": "org_abc123",
"mode": "live",
"apiVersion": "2026-05-25",
"data": {
"subscriptionId": "sub_1a2b3c4d",
"customerId": "user_123",
"status": "active",
"planId": "plan_pro_monthly",
"planName": "Pro",
"trialEndsAt": "2026-04-08T00:00:00.000Z"
}
}When this fires
The trial reached trialEndsAt. The billing cycle activates the subscription (status: "active"), starts the first regular billing period, and generates the first invoice — invoice.created and payment events follow as the charge is processed.
Access does not change at this moment: the customer already had full access while trialing and keeps it as an active subscriber. If the first charge fails, the regular payment failure flow applies (payment.failed, and subscription.past_due once the subscription has been paid before).
How is this guide?