Fires when a patient completes the journey intake flow. The eventType is journey_completed. Category: JOURNEY.
This event is per journey, not per patient. If you need per-patient semantics, dedupe on patient_id. Deduplicate deliveries on event_id.
journey_contact_captured is emitted as a safety net immediately before this event if contact had not already been claimed for the 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.
Money fields are integer cents: 84900 = $849.00.
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_completed",
"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",
"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. |
products | array | ✅ | { product_variation_id, quantity, unit_price_cents, is_addon } only. No display_name. |
first_purchase, plan_type | boolean/string | ✅ | See Journey Checkout Started. |
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. |
