Fires when a patient starts checkout for a journey. The eventType is journey_checkout_started. Category: JOURNEY.
v1 and v2 payloads are identical for journey events. These are journey-native events built on the flat, sanitized payload shape — there is no separate raw-envelope form. The same payload below is delivered regardless of the webhook's payload version.
Money fields are integer cents: 84900 = $849.00. Deduplicate on event_id.
Field guarantees
| Field | Guarantee |
|---|---|
event_type, event_id, api_version, timestamp, timestamp_epoch, journey_id, affiliate_id, template_id, patient_marketing_consent, is_returning_patient, total_value_cents, currency, products, first_purchase, plan_type | ✅ Always present |
template_display_name, journey_type, patient_id, patient_external_id, started_at, coupon_code, ecommerce_order_id, attribution, intake_form_instance_ids | ⚠️ Conditional — omitted when the underlying data is absent |
Payload (v1 and v2)
{
"event_type": "journey_checkout_started",
"event_id": "evt::example",
"api_version": "2026-08-17",
"timestamp": "2026-05-26T12:00:00.000Z",
"timestamp_epoch": 1779796800,
"journey_id": "jour::example",
"ecommerce_order_id": "eco::example",
"affiliate_id": "aff::example",
"template_id": "jtmp::example",
"template_display_name": "Wellness Program",
"journey_type": "ONE_TIME",
"patient_id": "pat::example",
"patient_external_id": "ext-patient-123",
"patient_marketing_consent": true,
"is_returning_patient": false,
"first_purchase": true,
"plan_type": "one_time",
"intake_form_instance_ids": ["aifi::example"],
"started_at": "2026-05-26T12:00:00.000Z",
"total_value_cents": 4999,
"currency": "usd",
"products": [
{
"product_variation_id": "epv::example",
"quantity": 1,
"unit_price_cents": 4999,
"is_addon": false
}
],
"coupon_code": "WELCOME20",
"attribution": {
"first": {
"captured_at": "2026-01-04T10:22:31.000Z",
"landing_url": "https://shop.example.com/get-started",
"referrer_url": "https://google.com/",
"params": {
"utm_source": "google",
"gclid": "Cj0KCQexample"
}
},
"touch_count": 1,
"visitor_id": "550e8400-e29b-41d4-a716-446655440000"
}
}| Field | Type | Always? | Notes |
|---|---|---|---|
event_id | string | ✅ | Retry-stable dedup key. |
timestamp_epoch | integer | ✅ | Unix seconds next to ISO timestamp. |
total_value_cents, currency | number/string | ✅ | Integer cents. 4999 = $49.99. |
products | array | ✅ | { product_variation_id, quantity, unit_price_cents, is_addon } only. No display_name. |
first_purchase | boolean | ✅ | true unless this order is a renewal (metadata.isRenewal). Independent of is_returning_patient: a returning patient placing a new one-time (non-renewal) order still has first_purchase: true. Renewals are false. |
plan_type | string | ✅ | monthly · quarterly · sixmonth · annual · one_time. Computed per this order. |
is_returning_patient | boolean | ✅ | Per-patient, not per-order: true when another ecommerce order is already paid, processing, or completed. A returning patient can still have first_purchase: true on a new non-renewal order. |
template_display_name | string | ⚠️ | Name journeys neutrally (no drug or condition names). |
attribution | object | ⚠️ | See Attribution Passthrough. |
intake_form_instance_ids | string[] | ⚠️ | AffiliateIntakeFormInstance ids (aifi::…) for custom intake forms on this journey (pre- and post-checkout). Omitted when no instances exist yet. |
