user_created
When to send: User account is created or on the first app open.| Field | Required | Notes |
|---|---|---|
user_id | Required | Your backend user identifier |
timestamp | Required | ISO 8601 |
anonymous_id | Recommended | Pre-login device/session ID |
platform | Recommended | ios, android, web |
country | Recommended | ISO 3166-1 alpha-2 |
install_source | Recommended | e.g. app_store, play_store, web |
install_attributed
When to send: Send from your MMP (AppsFlyer, Adjust) or server-side when attribution resolves — typically within seconds to minutes of install.| Field | Required | Notes |
|---|---|---|
user_id or anonymous_id | Required | At least one must be present |
timestamp | Required | Attribution timestamp, ISO 8601 |
campaign_id | Required | Campaign identifier from the ad platform |
channel | Required | e.g. meta, google_ads, tiktok, organic |
ad_set_id | Recommended | Ad set / ad group identifier |
creative_id | Recommended | Creative-level identifier |
country | Recommended | ISO 3166-1 alpha-2 |
keyword | Recommended | Search keyword if applicable |
attribution_model | Recommended | e.g. last_click, view_through |
onboarding_started
When to send: User enters the onboarding flow.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
variant | Recommended | A/B test variant identifier if applicable |
onboarding_completed, FloKit computes completion rates per cohort and acquisition source.
onboarding_completed
When to send: User finishes the onboarding flow.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
steps_completed | Recommended | Number of onboarding steps completed |
variant | Recommended | A/B test variant identifier |
paywall_viewed
When to send: A paywall screen is displayed to the user.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
paywall_id | Required | Identifier for the paywall variant |
offer_id | Recommended | Promotional offer shown, if any |
plan_ids | Recommended | Array of plan identifiers shown on the paywall |
variant | Recommended | A/B test variant |
context | Recommended | Where in the app the paywall appeared, e.g. onboarding_step_3, feature_gate |
trial_started
When to send: User starts a free trial.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
plan_id | Required | Identifier for the plan |
trial_length_days | Required | Length of the trial period in days |
offer_id | Recommended | Offer applied, if any |
paywall_id | Recommended | Paywall that converted this user |
transaction_id | Recommended | Platform transaction identifier |
price | Recommended | 0 for free trials |
subscription_started
When to send: User completes their first paid purchase.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
plan_id | Required | |
revenue | Required | Net revenue in the specified currency |
currency | Required | ISO 4217, e.g. USD |
transaction_id | Required | Deduplicates revenue events |
offer_id | Recommended | |
paywall_id | Recommended | |
trial_converted | Recommended | true if this subscription followed a trial |
store | Recommended | apple, google, stripe |
install_attributed to compute time-to-first-revenue and return on ad spend.
renewal_completed
When to send: A subscription renews at each billing cycle.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
plan_id | Required | |
revenue | Required | |
currency | Required | ISO 4217 |
transaction_id | Required | Unique per renewal |
renewal_count | Recommended | Number of renewals including this one |
store | Recommended | apple, google, stripe |
subscription_cancelled
When to send: User cancels their subscription. Note: the user may remain active until the current billing period ends — cancellation does not mean immediate churn.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 — when cancellation was requested |
plan_id | Required | |
cancellation_reason | Recommended | Reason from the platform or user-reported |
store | Recommended | apple, google, stripe |
refund_issued
When to send: A refund is processed.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
amount | Required | Refunded amount |
currency | Required | ISO 4217 |
transaction_id | Required | Unique identifier for the refund transaction |
reason | Recommended | Refund reason |
store | Recommended | apple, google, stripe |
original_transaction_id | Recommended | References the original purchase |
plan_changed
When to send: User upgrades or downgrades their subscription plan.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
from_plan_id | Required | Previous plan |
to_plan_id | Required | New plan |
new_revenue | Required | Revenue at the new plan price |
currency | Required | ISO 4217 |
direction | Recommended | upgrade or downgrade |
offer_viewed
When to send: A promotional offer is displayed to the user.| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
offer_id | Required | |
paywall_id | Recommended | |
discount_pct | Recommended | Discount percentage, e.g. 50 for 50% off |
checkout_started
When to send: User begins the checkout process (enters payment details or taps to subscribe).| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
plan_id | Required | |
offer_id | Recommended | |
paywall_id | Recommended |
checkout_started to checkout_completed drop-off signals a problem with the checkout UX, pricing, or payment method coverage.
checkout_completed
When to send: Purchase completes. Use alongside or instead ofsubscription_started for web flows where checkout and subscription creation are distinct steps.
| Field | Required | Notes |
|---|---|---|
user_id | Required | |
timestamp | Required | ISO 8601 |
plan_id | Required | |
revenue | Required | |
currency | Required | ISO 4217 |
transaction_id | Required | |
offer_id | Recommended | |
store | Recommended | Typically stripe for web flows |
campaign_touch
When to send: User is exposed to a campaign — an ad impression or click.| Field | Required | Notes |
|---|---|---|
user_id or anonymous_id | Required | At least one must be present |
timestamp | Required | ISO 8601 |
campaign_id | Required | |
channel | Required | e.g. meta, google_ads, tiktok |
creative_id | Recommended | |
ad_set_id | Recommended | |
touch_type | Recommended | impression or click |
creative_seen
When to send: A specific creative (video, image, or copy variant) is viewed.| Field | Required | Notes |
|---|---|---|
user_id or anonymous_id | Required | At least one must be present |
timestamp | Required | ISO 8601 |
creative_id | Required | |
campaign_id | Required | |
view_duration_ms | Recommended | How long the creative was in view |
platform | Recommended | ios, android, web |