Journey-native webhooks use the flat sanitized payload (api_version: "2026-08-17"). Deduplicate on event_id. Money is integer cents. Name slugs and template_display_name neutrally. landing_url and referrer_url follow the Attribution Passthrough validation and sanitization rules.
| Event | Funnel meaning | Fires once? |
|---|---|---|
| Journey Contact Captured | Lead — contact persisted on the journey patient. No money fields, no first_purchase, no raw email/phone. | Yes, per journey |
| Journey Checkout Started | Patient entered checkout. | Per checkout start |
| Journey Completed | Intake finished for this journey. Deduplicate deliveries on event_id. Per-patient aggregation is a separate business rule, not delivery idempotency. | Per journey |
| Journey Abandoned | 6-hour inactivity. Gate recovery on had_cart. first_purchase only when had_cart is true. | Yes, per journey |
| Custom Intake Form Completed | An affiliate custom intake form instance becomes valid (required questions answered), including flows completed before login (webhook after patient link). Includes a responses snapshot and intake form ids; journey_id when present. No money or template fields. | Yes, per intake form instance |
See Attribution Passthrough for landing_url / referrer_url and the params bag.
