Fires when a subscription renewal payment attempt fails. The eventType is subscription_payment_failed. Categories: COMMERCE, PAYMENT.
Single live emission path. This event is emitted by the renewal worker when a payment-auth job exhausts retries (dead-letter path). Live emissions include subscription and payment fields only —ecommerce_order_idandcommerce_statusare not set, even when a pending renewal order was created before payment failed. Do not type order-level fields as required.
Deduplicate on event_id. Money is integer cents. A failed renewal is not a new purchase.
Field guarantees
| Field | Guarantee |
|---|---|
subscription_id, subscription_status | ✅ Always present (when emitted) |
ecommerce_order_id, commerce_status | ⛔ Not set by live emission — test-fire samples may include them for illustration |
plan_type, first_purchase | ⚠️ Added by the v2 sanitizer when the subscription can be joined to a checkout order |
attribution | ⚠️ Omitted when no tracking data was captured |
journey_id | ⚠️ Omitted when no journey relationship is resolved |
Payload (v2)
Live emission (renewal worker dead-letter):
{
"event_type": "subscription_payment_failed",
"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": false,
"subscription_id": "esub::example",
"subscription_status": "active",
"total_value_cents": 4999,
"currency": "usd",
"payment_status": "failed"
}Test-fire sample only — includes order fields that live emissions do not send:
{
"event_type": "subscription_payment_failed",
"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": false,
"subscription_id": "esub::example",
"subscription_status": "active",
"total_value_cents": 4999,
"currency": "usd",
"ecommerce_order_id": "eord::example",
"commerce_status": "pending",
"payment_status": "failed"
}| Field | Type | Always? | Notes |
|---|---|---|---|
subscription_id, subscription_status | string | ✅ | When the event is emitted |
total_value_cents, currency | number/string | ✅ | Integer cents. 4999 = $49.99. |
payment_status | string | ✅ | e.g. failed |
ecommerce_order_id, commerce_status | string | ⛔ | Not set by live emission — test-fire sample only |
attribution | object | ⚠️ | See Attribution Passthrough. |
