User journey analysis reads the ordered events users produce to find where they stop. Start with a funnel to find the step, then open individual timelines to see what happened before it. ActivationPal records both for iOS and Android apps.
Step 1: find the step where users stop
In ActivationPal, each funnel stage counts unique devices from the date range's install cohort. The largest drop between two stages is where to look first.
The stages come from a small set of SDK calls, listed in the events docs:
onboardingStep(index, id) for each onboarding screen
onboardingCompleted()
paywallShown(placement)
paywallPlanSelected(plan)
paywallPurchased(plan)
To size a drop before changing anything, the funnel calculator turns step counts into conversion and drop-off percentages.
Step 2: pick one incomplete purchase from the user list
Click a funnel stage such as "Users who selected a plan", then open a user who is not labelled paid or trial.
Step 3: read the device timeline
The timeline lists that device's events oldest first. Read these things:
- The order of
paywall_shown, paywall_plan_selected, paywall_dismissed and any rc_* events.
- The gaps between events.
- Session boundaries. A new session starts on launch or when the app returns after 30 or more minutes in the background.
- The
app_version, in case the drop is limited to one release.
Step 4: query the same events with the agent API
The dashboard views are also available as tools over REST and MCP. Replace myapp with your app id and $AP_KEY with an agent key.
# Devices that selected a plan, newest first (at most 500 rows)
curl -s https://activationpal.com/api/v1/get_events \
-H "Authorization: Bearer $AP_KEY" -H "Content-Type: application/json" \
-d '{"app": "myapp", "name": "paywall_plan_selected", "limit": 100}'
# One device's full timeline, oldest first
curl -s https://activationpal.com/api/v1/get_user \
-H "Authorization: Bearer $AP_KEY" -H "Content-Type: application/json" \
-d '{"app": "myapp", "device_id": "DEVICE_ID"}'
get_events returns newest first. get_user returns oldest first, the same order as the dashboard timeline. An MCP-capable coding agent can call both tools; the agent API docs cover setup.
Observed gaps versus inferred motives
A timeline shows what happened, not why. A plan selected with no later purchase is a recorded fact. That the user found the price too high, or cancelled the store payment sheet, is a hypothesis, because neither is recorded unless your app tracks its own event for it.
To turn a hypothesis into an observation, add a custom event with ActivationPal.track: snake_case, past tense, no registration needed. The events docs list the rules.