Fires when a subscription renewal payment is successfully processed. The eventType is subscription_renewed. Categories: COMMERCE, PAYMENT.
This is a recurring charge, not a new purchase. first_purchase is always false. A renewal must never be attributed as a new purchase. Deduplicate on event_id. Money is integer cents (84900 = $849.00).
Field guarantees
| Field | Guarantee |
|---|---|
subscription_id, subscription_status, total_value_cents, currency, ecommerce_order_id, commerce_status, payment_status, first_purchase, cycle_number, plan_type | ✅ Always present |
attribution | ⚠️ Omitted when no tracking data was captured |
journey_id | ⚠️ Omitted when no journey relationship is resolved |
Payload (v2)
{
"event_type": "subscription_renewed",
"event_id": "evt::example",
"api_version": "2026-08-17",
"timestamp": "2026-05-26T12:00:00.000Z",
"timestamp_epoch": 1779796800,
"affiliate_id": "aff::example",
"patient_id": "pat::example",
"patient_external_id": "ext-patient-123",
"patient_marketing_consent": false,
"is_returning_patient": true,
"subscription_id": "esub::example",
"subscription_status": "active",
"total_value_cents": 4999,
"currency": "usd",
"ecommerce_order_id": "eord::example",
"commerce_status": "paid",
"payment_status": "collected",
"first_purchase": false,
"cycle_number": 6,
"plan_type": "quarterly",
"journey_id": "jour::example",
"attribution": {
"first": {
"captured_at": "2026-01-04T10:22:31.000Z",
"landing_url": "https://shop.example.com/get-started",
"params": {
"utm_source": "google",
"gclid": "Cj0KCQexample"
}
},
"touch_count": 2,
"visitor_id": "550e8400-e29b-41d4-a716-446655440000"
}
}| Field | Type | Always? | Notes |
|---|---|---|---|
first_purchase | boolean | ✅ | Always false. Do not treat this event as a new sale. |
cycle_number | integer | ✅ | Billing cycle that just succeeded (e.g. 6). |
plan_type | string | ✅ | Cadence of this renewal order: monthly · quarterly · sixmonth · annual · one_time. Not the original checkout plan if the subscription later changed steps. |
payment_status | string | ✅ | Clinical renewals: authorized is a hold, not collected funds. Non-clinical: collected. |
ecommerce_order_id | string | ✅ | The renewal order for this cycle — not the parent checkout order. |
attribution | object | ⚠️ | Copied from the parent checkout. Month-6 keeps original first.landing_url / first.params. See Attribution Passthrough. |
