payment.pending
Payment initiated, awaiting provider confirmation.
When this fires
A subscriber initiates checkout and is redirected to the provider, but the charge is not yet confirmed (bank transfer, crypto settlement, hosted-checkout sessions).
Required ability
project-subscription:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "payment.pending",
"created_at": "2026-05-18T10:05:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"provider": "stripe",
"plan_id": "c4e82f16-93a7-4d5b-b81c-6e0f27a94d3b",
"subscriber_id": "2a91c4e7-6f38-4b52-8e0d-9c1a7b3f5d80",
"session_id": "cs_test_.."
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always payment.pending for this event. |
created_at | ISO 8601 | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.provider | string | Provider slug. |
data.plan_id | string UUID | Plan being purchased. |
data.subscriber_id | string UUID | Subscriber's project-scoped user id. |
data.session_id | string | null | Stripe only. Checkout session id; defensively null if the created session carried no id. Absent (not null) for all other providers. |
data.order_id | string | Paystack, Razorpay, Skrill, CeyPay, CoinPayments. Absent for Stripe. |
PayPal carries neither session_id nor order_id — a PayPal payment.pending gives you only provider, plan_id, and subscriber_id, so it cannot be correlated to a specific checkout attempt. Absent keys are omitted entirely rather than sent as null — the one exception is Stripe's session_id, which is always present on the Stripe path but may be null.
Caveats
- A pending payment is not yet a subscription.
subscription_idis intentionally absent. - The same checkout may emit one
payment.pendingfollowed by eitherpayment.succeededorpayment.failed. Correlate onsession_idororder_idwhere the provider supplies one; for PayPal, fall back tosubscriber_idplusplan_id. - Subscribers who close the provider page without completing will not produce a final outcome event — pending sessions can hang indefinitely.
Related events
payment.succeeded,payment.failed— terminal outcomes.subscription.activated— fires alongside thepayment.succeededthat completes a first checkout.- Payment events overview — back to family overview.
How is this guide?