> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flokitai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# subscription_started

> Initial positive payment identity, package, customer, and frozen questionnaire reference.

The event identifies the first positive successful payment for a subscription. It is created only when that canonical payment wins the set-once first-paid marker. Different provider Event envelopes for the same invoice yield the same outbound event ID.

## Example

All values below are fictional test data. A normal payment event omits `test_event`, including a payment from a provider test account. Only Admin **Send test** sets this flag.

```json theme={null}
{
  "event_id": "wh_evt_documentation_fixture",
  "event_type": "subscription_started",
  "created_at": "2026-09-04T00:00:03.000Z",
  "environment": "sandbox",
  "purchase": {
    "payment_id": "pay_test_fixture",
    "subscription_id": "sub_test_fixture",
    "status": "succeeded",
    "amount": { "minor_units": "4999", "currency": "USD" },
    "paid_at": "2026-09-04T00:00:00.000Z"
  },
  "provider": {
    "name": "stripe_direct",
    "event_id": "evt_test_fixture",
    "payment_reference_type": "invoice",
    "payment_reference_id": "in_test_fixture",
    "subscription_id": "sub_stripe_test_fixture",
    "customer_id": "cus_test_fixture"
  },
  "package": { "id": "pkg_test_monthly", "name": "Test Monthly" },
  "customer": { "id": "anon_test_fixture", "id_type": "anonymous_id", "email": "fixture@example.invalid" },
  "webflow": {
    "flow_id": "flow_test_fixture",
    "questionnaire": {
      "questionnaire_id": "questionnaire_test_fixture",
      "unit_preferences": { "weight": "kg" },
      "questions_and_answers": [
        {
          "question_id": "s_test_goal",
          "question": "What is your test goal?",
          "question_type": "single_select_text",
          "answer": [{ "id": "o_test_health", "text": "Build healthy habits" }]
        },
        {
          "question_id": "s_test_weight",
          "question": "What is your test weight?",
          "question_type": "numeric_input",
          "answer": [{ "text": "82", "unit": "kg" }]
        }
      ]
    }
  },
  "test_event": true
}
```

## Field reference

| Field                                         | Required             | Type         | Source and meaning                                                                                                   | Example                    |
| --------------------------------------------- | -------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------- | -------------------------- |
| `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`                     |

Answer field paths in the last rows are relative to `webflow.questionnaire`. Multi-select, ranking, and schedule answers can contain multiple entries; preserve their order where the interaction is ordered.

Only final answered questions on the valid active route are included. Skipped, bypassed, unanswered, informational, result, loading, and bridge screens are excluded. Question text and authored answer labels come from the immutable publication, never from client-submitted copy. A required snapshot that is unavailable delays delivery rather than producing partial questionnaire content.

Weight and height values use canonical `kg` and `cm`. `unit_preferences` records the visitor's selected display units; it does not change those normalized numeric units.

There is no generic `data` wrapper or external version field. Unavailable optional properties are omitted rather than replaced with `null`. See [verification](/webhooks/signatures) before interpreting any payload.
