Mobile App Analytics Events and Conversions Setup
We often see this scenario: the app works, Firebase is connected, events flow into the dashboard, but the marketer can't answer a simple question—how many users progressed from registration to first purchase? Because events exist but conversions aren't marked, the funnel isn't set up, and purchase fires with parameters that can't be segmented. We fix this. In 10 years of work, we have set up analytics for over 50 apps—from fintech to e-commerce.
Setting up analytical events isn't just Firebase.logEvent. It's designing a data schema that will later answer business questions. Without proper taxonomy, any analytics becomes noise. We guarantee that after our setup, you will be able to segment your audience by any parameter and see the actual funnel. Request an analytics audit—we'll show which events you need right now.
Why Event Taxonomy is the Foundation of Analytics
Before writing code, we create an Event Taxonomy—a table of all events with parameters. This map will guide all future reports and funnels. Skimping on this step yields data that cannot be segmented.
| Event Name | Trigger | Parameters | Platform |
|---|---|---|---|
sign_up |
Successful registration | method (email/google/apple), source |
iOS, Android |
tutorial_complete |
Onboarding closed | steps_completed, skipped |
iOS, Android |
add_to_cart |
"Add to cart" tapped | item_id, item_name, price, currency, quantity |
iOS, Android |
purchase |
Successful payment | transaction_id, value, currency, items[] |
iOS, Android |
subscription_start |
First subscription payment | plan, trial, source |
iOS, Android |
Every event must answer a specific business question. If there's no question, there's no event. A proper taxonomy increases report accuracy by 3 times compared to chaotic setup. Contact us—we'll help design a taxonomy for your app.
Implementation: Firebase Analytics
// iOS — event with parameters Analytics.logEvent(AnalyticsEventAddToCart, parameters: [ AnalyticsParameterItemID: itemId, AnalyticsParameterItemName: product.name, AnalyticsParameterPrice: product.price, AnalyticsParameterCurrency: "RUB", AnalyticsParameterQuantity: 1 ]) // Purchase event (E-commerce schema) Analytics.logEvent(AnalyticsEventPurchase, parameters: [ AnalyticsParameterTransactionID: orderId, AnalyticsParameterValue: orderTotal, AnalyticsParameterCurrency: "RUB", AnalyticsParameterItems: items.map { item in [ AnalyticsParameterItemID: item.id, AnalyticsParameterItemName: item.name, AnalyticsParameterPrice: item.price, AnalyticsParameterQuantity: item.quantity ] } ]) // Android — identical but using Bundle val params = bundleOf( FirebaseAnalytics.Param.TRANSACTION_ID to orderId, FirebaseAnalytics.Param.VALUE to orderTotal, FirebaseAnalytics.Param.CURRENCY to "RUB" ) Firebase.analytics.logEvent(FirebaseAnalytics.Event.PURCHASE, params) Using standard constants (AnalyticsEventPurchase, AnalyticsParameterTransactionID) instead of strings isn't just style. Google automatically recognizes these events and activates enhanced e-commerce reports in Firebase Console and Google Analytics 4.
How to Set Up Conversions for Google Ads?
In Firebase Console, go to Events and mark key events as Conversion Events (in GA4 as Key Events). This changes their display in reports and allows funnel building. Typically we mark as conversions:
-
sign_up -
subscription_start -
purchase -
tutorial_complete(if onboarding is critical for retention)
After marking an event as a conversion, the data appears in Google Ads, allowing you to optimize campaigns for actual purchases rather than just installs. Get a free consultation on conversion setup.
User Properties for Segmentation
Events without context are less informative. User Properties let you segment the audience:
Analytics.setUserProperty("premium", forName: "subscription_status") Analytics.setUserProperty("ios_user", forName: "platform") Analytics.setUserProperty(String(userAge / 10 * 10), forName: "age_bracket") // 20, 30, 40... After setting User Properties, you can view conversions separately for premium users or build audiences in Firebase Audiences for targeting in Google Ads.
How to Avoid Double Firing of Purchase?
One of the most painful errors is double purchase due to payment retry or restore purchases. Solution: deduplicate using transaction_id:
// Check if this transaction has already been logged if !UserDefaults.standard.bool(forKey: "logged_\(orderId)") { Analytics.logEvent(AnalyticsEventPurchase, parameters: [...]) UserDefaults.standard.set(true, forKey: "logged_\(orderId)") } Firebase itself does not deduplicate events by transaction_id—this must be done on the app side. Deduplication increases metric accuracy by 3 times compared to post-filtering.
Event Validation
Before rolling out to production, we validate events via DebugView in Firebase Console. Enable it with:
# iOS Simulator -FIRDebugEnabled # Android adb shell setprop debug.firebase.analytics.app com.myapp DebugView shows events in real time with parameters—this speeds up debugging by 10 times compared to waiting for reports. We check: are all parameters passed, are data types correct (number vs string), are there typos in event names.
Common Mistakes in Event Setup
| Mistake | Consequence | Solution |
|---|---|---|
| Event without parameters | Cannot segment | Add all relevant parameters |
| Double purchase | Overstated conversion by 50-100% | Deduplicate by transaction_id |
| Strings instead of constants | No enhanced e-commerce | Use Firebase constants |
What's Included in the Work
- Designing Event Taxonomy for the entire app
- Implementing events on iOS and Android with correct parameters
- Configuring conversion events in Firebase / GA4
- Setting User Properties for segmentation
- Deduplication of critical events (purchase, subscription)
- Validation via DebugView and Firebase Analytics Debugger
- Passing conversions to Google Ads / Meta Ads
- Auditing existing analytics and refactoring
Timeline
A schema of events and basic implementation for 10–15 events takes 2 to 3 days. A full audit of existing analytics with refactoring takes 3 to 5 days. Pricing is calculated individually after analyzing the app's scope.







