Mobile apps don’t behave like websites. Sessions are shorter, users switch between foreground and background constantly, and half the events you care about — push notifications, permission prompts, app updates — don’t exist on the web at all. If you paste your website event schema into a mobile app, you’ll miss what actually matters.
This reference covers every mobile and app event you should track in GA4 and Firebase: from install and onboarding through core engagement, monetization, and retention loops. Each event includes its trigger, key parameters, and a ready-to-use data layer snippet. I’ve implemented this schema across eight mobile apps — three iOS-only, three Android-only, and two cross-platform with Flutter — and the patterns hold regardless of platform or framework.
Install and Onboarding Events
The first 60 seconds after install determine whether a user sticks around. Onboarding completion is the single strongest predictor of Day 7 retention in every app I’ve worked on. Track every step — not just the finish line.
| Event Name | Trigger | Key Parameters |
|---|---|---|
app_installed | First app open after install | install_source, campaign_id, platform, os_version, device_model |
onboarding_started | User enters onboarding flow | onboarding_version, entry_point |
onboarding_step_completed | Each onboarding step finished | step_number, step_name, time_on_step |
onboarding_completed | User finishes full onboarding | total_steps, total_duration, steps_skipped |
onboarding_skipped | User exits onboarding early | last_step_completed, skip_method |
signup_completed | Account creation finished | signup_method, has_social_auth, referral_code |
// Install and onboarding — data layer push dataLayer.push({ event: "onboarding_step_completed", step_number: 3, step_name: "enable_notifications", time_on_step: 8.4 });
Why it matters: Onboarding drop-off analysis tells you exactly where users give up. In one fitness app I instrumented, 38% of users abandoned at the “enable notifications” step. We moved that permission request to after the first workout — completion rate jumped from 62% to 81%, and Day 7 retention improved by 15 percentage points.
Session and Lifecycle Events
Mobile sessions are fundamentally different from web sessions. Users open an app dozens of times per day for seconds at a time. Firebase handles session_start automatically, but you need additional events to understand the app lifecycle — foreground, background, updates, and crashes.
| Event Name | Trigger | Key Parameters |
|---|---|---|
app_opened | App moves to foreground | open_type, time_in_background, deep_link_url |
app_backgrounded | App moves to background | session_duration, screens_viewed, actions_taken |
app_updated | First open after version change | previous_version, new_version, update_method |
app_crashed | Unhandled exception caught | crash_type, screen_name, stack_trace_id |
deep_link_opened | App opened via deep link | link_url, link_source, campaign_id, is_deferred |
session_quality_scored | Session ends with quality assessment | session_duration, key_actions_count, quality_tier |
// Session lifecycle — data layer push dataLayer.push({ event: "app_opened", open_type: "deep_link", time_in_background: 3420, deep_link_url: "myapp://product/shoes-42" });
Why it matters: Theopen_typeparameter onapp_openedreveals how users return to your app — cold start, warm resume, push notification, or deep link. This single parameter tells you which re-engagement channels actually work. In a food delivery app, we found that deep links from email drove 2.3× more orders per session than push notifications, which led to a complete reallocation of the retention budget.
Permission and System Events
Mobile apps depend on system permissions — notifications, location, camera, contacts. Each permission prompt is a conversion event. If a user denies notifications, your entire push-based retention strategy breaks. Track every prompt and every response.
| Event Name | Trigger | Key Parameters |
|---|---|---|
permission_prompted | System permission dialog shown | permission_type, prompt_context, is_first_prompt |
permission_granted | User allows permission | permission_type, prompt_context, grant_count |
permission_denied | User denies permission | permission_type, prompt_context, denial_count |
notification_received | Push notification delivered | notification_id, notification_type, campaign_id |
notification_opened | User taps push notification | notification_id, notification_type, time_to_open |
notification_dismissed | User swipes away notification | notification_id, notification_type |
// Permission tracking — data layer push dataLayer.push({ event: "permission_granted", permission_type: "push_notifications", prompt_context: "after_first_order", grant_count: 1 });
Why it matters: iOS gives you one shot at the system notification prompt — if the user denies it, you can’t ask again without sending them to Settings. The prompt_context parameter lets you A/B test when to show the prompt. I’ve seen notification opt-in rates range from 35% (shown during onboarding) to 72% (shown after the user completes a valuable action). That difference can double your push-driven retention.
Core Engagement Events
These are the actions that define your app’s core loop — the reason users come back. They vary by app category, but the tracking pattern is the same: capture what happened, how long it took, and what the outcome was.
| Event Name | Trigger | Key Parameters |
|---|---|---|
screen_viewed | Screen becomes visible | screen_name, screen_class, previous_screen, content_id |
content_consumed | User completes content (article, video, lesson) | content_id, content_type, duration, completion_pct |
search_performed | User submits search query | search_term, results_count, search_type, filters_applied |
item_shared | User shares content via share sheet | content_id, share_method, content_type |
action_completed | Primary app action finished | action_type, duration, result, is_first_time |
error_encountered | User-facing error occurs | error_code, error_type, screen_name, recovery_action |
// Core engagement — data layer push dataLayer.push({ event: "action_completed", action_type: "workout_finished", duration: 1845, result: "completed", is_first_time: false });
Why it matters: Theaction_completedevent withis_first_timeparameter is your activation signal. Track the first time a user completes your app’s core action — first workout, first order, first message sent. This “aha moment” is what separates users who retain from those who churn. In a language learning app, users who completed their first lesson within 2 hours of install had 4× the 30-day retention rate.
Monetization Events
Mobile monetization models differ from web — in-app purchases, subscriptions, ad revenue, and freemium conversions all need dedicated tracking. Firebase handles some in_app_purchase events automatically, but you need subscription lifecycle events for real revenue analytics.
| Event Name | Trigger | Key Parameters |
|---|---|---|
paywall_viewed | User sees paywall or upgrade screen | paywall_id, trigger_context, plan_options |
trial_started | Free trial activated | plan_id, trial_duration_days, trigger_context |
subscription_started | Paid subscription begins | plan_id, price, currency, billing_period, is_trial_conversion |
subscription_renewed | Auto-renewal processed | plan_id, price, renewal_count, lifetime_value |
subscription_cancelled | User cancels subscription | plan_id, cancel_reason, days_subscribed, remaining_days |
iap_completed | One-time in-app purchase | product_id, product_type, price, currency |
// Monetization — data layer push dataLayer.push({ event: "subscription_started", plan_id: "pro_yearly", price: 59.99, currency: "EUR", billing_period: "annual", is_trial_conversion: true });
Why it matters: Theis_trial_conversionflag onsubscription_startedis critical for understanding your funnel. Trial-to-paid conversion rates vary dramatically — I’ve seen 15% for generic free trials but 45% for trials that require a payment method upfront. Trackpaywall_viewedwithtrigger_contextto understand which feature gates drive the most conversions.
Retention and Re-engagement Events
Mobile retention is measured in days — Day 1, Day 7, Day 30. These events track the mechanisms that bring users back: push notifications, streaks, reminders, and the moments users decide to leave.
| Event Name | Trigger | Key Parameters |
|---|---|---|
streak_updated | User’s streak count changes | streak_count, streak_type, is_new_record |
streak_broken | User misses a day, streak resets | previous_streak, streak_type, recovery_offered |
reminder_set | User configures a reminder | reminder_type, reminder_time, frequency |
widget_interacted | User taps home screen widget | widget_type, widget_action, widget_size |
rating_prompted | In-app review dialog shown | prompt_trigger, sessions_count, days_since_install |
rating_submitted | User submits app store rating | rating_value, has_review_text, prompt_trigger |
// Retention — data layer push dataLayer.push({ event: "streak_updated", streak_count: 14, streak_type: "daily_login", is_new_record: true });
Why it matters: Streaks are one of the most powerful retention mechanics in mobile. Thestreak_brokenevent withrecovery_offeredparameter lets you measure whether streak recovery features (like “freeze” tokens) actually save users. In a meditation app, offering streak recovery at the moment of breakage retained 40% of users who would have otherwise dropped off permanently.
Mobile-Specific Metrics and KPIs
These events feed the metrics that mobile product teams report on weekly. Here’s how they connect.
| Metric | Formula (from events) | Benchmark |
|---|---|---|
| Day 1 Retention | Users with app_opened on Day 1 / app_installed | >40% good, >60% excellent |
| Day 7 Retention | Users with app_opened on Day 7 / app_installed | >20% good, >35% excellent |
| Day 30 Retention | Users with app_opened on Day 30 / app_installed | >10% good, >20% excellent |
| Onboarding Completion | onboarding_completed / onboarding_started | >70% target |
| Push Opt-in Rate | permission_granted (notifications) / permission_prompted | >50% good |
| Trial-to-Paid | subscription_started (is_trial_conversion=true) / trial_started | 15-40% varies by model |
| Session Frequency | Avg app_opened events per user per week | Varies by category |
| Paywall Conversion | subscription_started / paywall_viewed | 2-8% typical |
Implementation Checklist
Mobile App Event Schema — Quick Start
- Use Firebase SDK as the foundation — it handles
session_start,first_open, andscreen_viewautomatically - Set
platform(ios/android) andapp_versionas user properties on every session - Track every onboarding step individually — aggregate completion rates hide where users actually drop
- Fire
permission_promptedbefore the system dialog — you can’t listen for the system event itself - Use
is_first_timeon core actions to identify activation moments - Implement
app_backgroundedwith session summary parameters — mobile sessions end abruptly - Track subscription events server-side via App Store / Play Store webhooks for accuracy
- Add
trigger_contextto paywall and permission events for A/B test analysis - Set up
deep_link_openedwith attribution parameters for cross-channel measurement - Validate events in Firebase DebugView before releasing — mobile bugs take a week to fix via app store review
Related Guides on EU-Medin
- SaaS Event Schema: The Complete Reference
- E-commerce Event Schema: The Complete Reference
- Lead Gen Event Schema: The Complete Reference
- Content & Media Event Schema: The Complete Reference
- Marketplace Event Schema: The Complete Reference
- B2B Event Schema: The Complete Reference
- GA4 Event Naming Conventions: The Complete Reference
- UTM Parameters: The Complete Reference
- Server-Side Tracking: The Complete Guide
Further Reading
- Firebase Analytics Events — automatically collected and recommended events
- GA4 App Stream Setup — connecting your app to Google Analytics
- Apple App Store Subscriptions — server-side subscription event handling
- Google Play Billing — subscription and in-app purchase integration
Lukas Meier — Product Analytics Specialist based in Munich. Helping European teams build clean, GDPR-aware tracking across web and mobile products. More about the author