event_id | Yes | string | FloKit deterministic identity of this business event; receiver deduplication key | wh_evt_… |
event_type | Yes | string | Fixed trigger | subscription_started |
created_at | Yes | UTC string | Source event creation time in FloKit | 2026-09-04T00:00:03.000Z |
environment | Yes | enum | FloKit connection environment; not a substitute for checking provider Test/Live mode | sandbox, production |
purchase | Yes | object | Verified canonical payment | See example |
purchase.payment_id | Yes | string | Stable FloKit Payment.id; distinct from the invoice ID | pay_… |
purchase.subscription_id | Yes | string | Stable FloKit Subscription.id | sub_… |
purchase.status | Yes | literal | Successful payment | succeeded |
purchase.amount | Yes | object | Amount from the provider-confirmed payment | See example |
purchase.amount.minor_units | Yes | string | Positive integer in currency minor units; use integer/decimal arithmetic | 4999 |
purchase.amount.currency | Yes | string | Uppercase currency code | USD |
purchase.paid_at | Yes | UTC string | Selected payment’s authoritative occurrence time | 2026-09-04T00:00:00.000Z |
provider | Yes | object | Provider-owned references, separate from FloKit IDs | See example |
provider.name | Yes | string | Canonical provider name | stripe_direct |
provider.event_id | Yes | string | Exact verified provider Event that supplied the selected first-paid payment | evt_… |
provider.payment_reference_type | Yes | enum | Stripe or Lemon Squeezy subscription invoice: invoice; Paddle: transaction; Lemon Squeezy initial order: order | invoice |
provider.payment_reference_id | Yes | string | Provider payment identity; Stripe Invoice ID | in_… |
provider.subscription_id | Yes | string | Provider-owned subscription ID | sub_… |
provider.customer_id | No | string | Provider customer reference when present | cus_… |
package | Yes | object | Purchased canonical Package frozen for delivery | See example |
package.id | Yes | string | FloKit Package ID | pkg_… |
package.name | Yes | string | Canonical Package internalName | Test Monthly |
customer | Yes | object | Trusted checkout/provider-linked FloKit identity | See example |
customer.id | Yes | string | Verified FloKit user ID, otherwise required anonymous ID | anon_… |
customer.id_type | Yes | enum | Explains the identity used | user_id, anonymous_id |
customer.email | No | string | Trusted email when available; never an idempotency key | fixture@example.invalid |
webflow | Yes | object | Flow context | See example |
webflow.flow_id | Yes | string | FloKit Flow ID | flow_… |
webflow.questionnaire | No | object | Omitted when the Flow has no questionnaire | See example |
webflow.questionnaire.questionnaire_id | With questionnaire | string | Exact published questionnaire ID | questionnaire_… |
webflow.questionnaire.unit_preferences | No | object | Validated unit preferences | { "weight": "kg" } |
webflow.questionnaire.questions_and_answers | With questionnaire | array | Final answered questions in active-path order | See example |
questions_and_answers[].question_id | Yes | string | Canonical screen ID | s_test_goal |
questions_and_answers[].question | Yes | string | Frozen published headline | What is your test goal? |
questions_and_answers[].question_type | Yes | string | Published screen’s question type | numeric_input |
questions_and_answers[].answer | Yes | array | One or more normalized answers | See example |
answer[].id | For authored choices | string | Selected published option or slot ID | o_test_health |
answer[].text | Yes | string | Frozen option label or validated numeric/date value | 82 |
answer[].unit | No | string | Relevant approved unit | kg |
test_event | Test sends only | literal true | Admin-generated synthetic event | true |