Skip to main content
FloKit uses lifecycle events to join acquisition spend to subscription outcomes. You can send events via the Events API, RevenueCat or Adapty webhooks, or your data warehouse. The more complete your event coverage, the richer FloKit’s payback analysis.

user_created

When to send: User account is created or on the first app open.
FieldRequiredNotes
user_idRequiredYour backend user identifier
timestampRequiredISO 8601
anonymous_idRecommendedPre-login device/session ID
platformRecommendedios, android, web
countryRecommendedISO 3166-1 alpha-2
install_sourceRecommendede.g. app_store, play_store, web
Why FloKit uses it: Anchors the user identity graph and establishes the first touchpoint for the LTV window. All downstream events are measured relative to this timestamp.

install_attributed

When to send: Send from your MMP (AppsFlyer, Adjust) or server-side when attribution resolves — typically within seconds to minutes of install.
FieldRequiredNotes
user_id or anonymous_idRequiredAt least one must be present
timestampRequiredAttribution timestamp, ISO 8601
campaign_idRequiredCampaign identifier from the ad platform
channelRequirede.g. meta, google_ads, tiktok, organic
ad_set_idRecommendedAd set / ad group identifier
creative_idRecommendedCreative-level identifier
countryRecommendedISO 3166-1 alpha-2
keywordRecommendedSearch keyword if applicable
attribution_modelRecommendede.g. last_click, view_through
Why FloKit uses it: The critical join point between ad spend and downstream subscription outcomes. Without this event, CAC and payback calculations cannot be attributed to a campaign.

onboarding_started

When to send: User enters the onboarding flow.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
variantRecommendedA/B test variant identifier if applicable
Why FloKit uses it: Measures the top of the onboarding funnel. Combined with onboarding_completed, FloKit computes completion rates per cohort and acquisition source.

onboarding_completed

When to send: User finishes the onboarding flow.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
steps_completedRecommendedNumber of onboarding steps completed
variantRecommendedA/B test variant identifier
Why FloKit uses it: Onboarding completion rate is a leading indicator of trial and subscription intent. FloKit surfaces completion-rate deltas across acquisition channels and creative cohorts.

paywall_viewed

When to send: A paywall screen is displayed to the user.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
paywall_idRequiredIdentifier for the paywall variant
offer_idRecommendedPromotional offer shown, if any
plan_idsRecommendedArray of plan identifiers shown on the paywall
variantRecommendedA/B test variant
contextRecommendedWhere in the app the paywall appeared, e.g. onboarding_step_3, feature_gate
Why FloKit uses it: Measures paywall impression-to-trial conversion. Essential for offer and pricing analysis — FloKit tracks which paywalls, offers, and contexts drive the highest-quality subscribers.

trial_started

When to send: User starts a free trial.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
plan_idRequiredIdentifier for the plan
trial_length_daysRequiredLength of the trial period in days
offer_idRecommendedOffer applied, if any
paywall_idRecommendedPaywall that converted this user
transaction_idRecommendedPlatform transaction identifier
priceRecommended0 for free trials
Why FloKit uses it: Trial start is the primary subscription intent signal. Trial-to-paid conversion rate is FloKit’s core payback metric — the quality of a cohort is largely determined by how its trials convert.

subscription_started

When to send: User completes their first paid purchase.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
plan_idRequired
revenueRequiredNet revenue in the specified currency
currencyRequiredISO 4217, e.g. USD
transaction_idRequiredDeduplicates revenue events
offer_idRecommended
paywall_idRecommended
trial_convertedRecommendedtrue if this subscription followed a trial
storeRecommendedapple, google, stripe
Why FloKit uses it: First revenue event used for CAC payback calculation. FloKit joins this event to 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.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
plan_idRequired
revenueRequired
currencyRequiredISO 4217
transaction_idRequiredUnique per renewal
renewal_countRecommendedNumber of renewals including this one
storeRecommendedapple, google, stripe
Why FloKit uses it: The renewal sequence builds the LTV curve. FloKit uses renewal cadence to project payback windows and flag cohorts with declining retention.

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.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601 — when cancellation was requested
plan_idRequired
cancellation_reasonRecommendedReason from the platform or user-reported
storeRecommendedapple, google, stripe
Why FloKit uses it: Flags cohorts with elevated cancellation intent. Combined with renewal data, FloKit distinguishes between early cancellations (poor quality signal) and cancellations after multiple renewals (healthy LTV).

refund_issued

When to send: A refund is processed.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
amountRequiredRefunded amount
currencyRequiredISO 4217
transaction_idRequiredUnique identifier for the refund transaction
reasonRecommendedRefund reason
storeRecommendedapple, google, stripe
original_transaction_idRecommendedReferences the original purchase
Why FloKit uses it: Removes revenue from payback calculations. Cohorts with high refund rates are flagged as low-quality acquisition — a signal that creative or targeting is attracting non-intent users.

plan_changed

When to send: User upgrades or downgrades their subscription plan.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
from_plan_idRequiredPrevious plan
to_plan_idRequiredNew plan
new_revenueRequiredRevenue at the new plan price
currencyRequiredISO 4217
directionRecommendedupgrade or downgrade
Why FloKit uses it: Plan changes affect LTV and payback trajectory. Upgrade rate from a cohort is a positive signal; high downgrade rates suggest pricing misalignment.

offer_viewed

When to send: A promotional offer is displayed to the user.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
offer_idRequired
paywall_idRecommended
discount_pctRecommendedDiscount percentage, e.g. 50 for 50% off
Why FloKit uses it: Measures offer impression-to-redemption rate. FloKit surfaces which offers drive incremental subscriptions vs. which discount existing intent.

checkout_started

When to send: User begins the checkout process (enters payment details or taps to subscribe).
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
plan_idRequired
offer_idRecommended
paywall_idRecommended
Why FloKit uses it: Checkout abandonment rate surfaces pricing friction. A high 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 of subscription_started for web flows where checkout and subscription creation are distinct steps.
FieldRequiredNotes
user_idRequired
timestampRequiredISO 8601
plan_idRequired
revenueRequired
currencyRequiredISO 4217
transaction_idRequired
offer_idRecommended
storeRecommendedTypically stripe for web flows
Why FloKit uses it: Confirms the revenue event for web subscription flows. For Stripe-based subscriptions where RevenueCat is not used, this is the primary first-revenue signal.

campaign_touch

When to send: User is exposed to a campaign — an ad impression or click.
FieldRequiredNotes
user_id or anonymous_idRequiredAt least one must be present
timestampRequiredISO 8601
campaign_idRequired
channelRequirede.g. meta, google_ads, tiktok
creative_idRecommended
ad_set_idRecommended
touch_typeRecommendedimpression or click
Why FloKit uses it: Builds multi-touch attribution models and creative fatigue signals. High impression frequency with declining click-through rate flags creative exhaustion.

creative_seen

When to send: A specific creative (video, image, or copy variant) is viewed.
FieldRequiredNotes
user_id or anonymous_idRequiredAt least one must be present
timestampRequiredISO 8601
creative_idRequired
campaign_idRequired
view_duration_msRecommendedHow long the creative was in view
platformRecommendedios, android, web
Why FloKit uses it: Creative fatigue and retained-value-per-creative analysis. FloKit correlates creative exposure sequences with downstream subscription quality to surface which creatives attract high-LTV users.