Implementing User Journey Mapping in Mobile App Analytics
User Journey Mapping in analytics isn't a UX diagram on sticky notes. It's real data on how users move through the app, where they get lost, which unplanned routes they take more than planned ones.
Typical case: a designer drew a 4-step onboarding flow, developers built it. Analytics reveals 40% of users exit at step 3 to settings, return, then finish onboarding. No one tested this edge case because they didn't know it existed. Journey mapping discovers it.
Tools and Approaches
Two implementation levels:
Level 1 — Funnels. Sequenced event funnels in Firebase/Amplitude/Mixpanel. Show how many users complete a defined sequence.
Level 2 — Sankey Diagrams and Path Analysis. Show all possible transitions from one screen to another without a preset path. Available via Amplitude Path Analysis, Mixpanel Flows, GA4 User Explorer.
Instrumentation for Journey Mapping
For accurate journey mapping, every screen and meaningful transition must be tracked with context:
// Android — navigation tracking with context
fun navigateToProduct(product: Product, source: ScreenSource) {
analytics.track("screen_viewed") {
put("screen_name", "ProductDetail")
put("product_id", product.id)
put("source_screen", source.screenName) // where we came from
put("source_element", source.element) // which element clicked
}
navigator.navigate(R.id.productDetailFragment, Bundle().apply {
putString("product_id", product.id)
})
}
The source_screen + source_element properties are key to building real paths. Without them, you know the user was on ProductDetail, but not from where.
// iOS — navigation tracking with source
enum NavigationSource {
case searchResults(query: String, position: Int)
case recommendations(algorithm: String)
case pushNotification(campaignId: String)
case deepLink(url: URL)
}
func openProduct(_ product: Product, from source: NavigationSource) {
var properties: [String: Any] = [
"screen_name": "ProductDetail",
"product_id": product.id
]
switch source {
case .searchResults(let query, let position):
properties["source"] = "search"
properties["search_query"] = query
properties["search_position"] = position
case .recommendations(let algorithm):
properties["source"] = "recommendations"
properties["rec_algorithm"] = algorithm
default:
break
}
amplitude.track(eventType: "screen_viewed", eventProperties: properties)
}
Path Analysis in Amplitude
Amplitude Pathfinder builds a graph of real transitions. To start:
- Choose start event (e.g.,
app_openedoronboarding_started) - Choose end event (e.g.,
subscription_started) - Amplitude shows all paths and percentage of users on each
Problem: too many paths, graph is unreadable. Solution — collapse screens into groups via event property filters:
// Amplitude Chart config
{
"chart_type": "PATHFINDER_USERS",
"start_prop": { "event": "app_opened" },
"end_prop": { "event": "checkout_completed" },
"merge_events_by": "screen_name", // group by screen, not event
"max_steps": 8,
"include_user_paths": true
}
Route Segmentation
Journey mapping without segmentation shows an average path that doesn't exist for any real user. Key segments:
- By install source — organic vs paid users behave differently
- By device type — tablet users may have different flow
- By cohort — new vs returning users
- By plan — free vs premium
Finding Bottlenecks
After mapping paths, look for:
Drop-off points — screens with anomalously high churn. If 35% exit on AddressInput, it's a form problem, not the flow.
Unexpected paths — transitions that shouldn't exist. Users leaving Checkout back to ProductDetail? They have a question the checkout screen doesn't answer.
Dead ends — screens where users mostly close the app instead of navigating. Often error screens or empty states without CTA.
What We Do
- Design navigation tracking with
source_screenandsource_element - Configure Path Analysis in Amplitude or Flows in Mixpanel
- Set up segmentation for key cohorts
- Map main user journeys: onboarding, conversion, retention
- Identify top-3 drop-off points and form hypotheses for A/B tests
Timeline
Navigation instrumentation and basic journey reports: 2–3 days. Full analysis with segmentation and hypotheses: 3–5 days. Pricing is calculated individually.







