Mobile analytics event naming for product and engineering
Mobile analytics event naming helps product and engineering track taps, screen state, and retries without turning funnels into a mess.

Why teams stop trusting event data
Trust breaks faster than most teams expect. A product manager opens a funnel and sees signup_started. An engineer checks the app and finds register_begin. Both names point to the same moment, but the report now looks split in two. After that, every number starts a debate.
The problem gets worse when one tap fires a pile of events. A user presses "Continue", and the app logs button_tap, form_submit, request_started, and screen_loaded. Those events do not mean the same thing, yet teams often group them together in the same report. Product reads them as user intent. Engineering reads them as app behavior. Both sides have a point, so confusion sticks around.
Retries add another layer of noise. If the network drops and the user taps again, some apps log a second "start" event as if a new journey began. In the funnel, one person can look like two or three fresh attempts. Conversion drops on paper, even when the product did not get worse.
Names also drift over time. One release uses checkout_submit. A later release adds checkout_submitted. Another team logs place_order_click because that matches the button text. Each choice looks harmless in the moment. Six months later, mobile analytics event naming turns into cleanup work, and nobody feels sure which event belongs in the dashboard.
This is usually how trust fades: not through one huge mistake, but through small naming choices that pile up. Screen states, user actions, network requests, and retries all blur together. Once that happens, teams stop asking "what did users do?" and start asking "which event should we believe?"
That shift is expensive. Product starts exporting raw data to count things by hand. Engineers add debug events to explain older events. Meetings drift into naming disputes instead of product decisions. The app may work fine, but the shared language around the data does not.
Start with what the user did
Good event names read like a short record of intent. A person opened a screen, tapped a control, submitted a form, or retried a step. When names describe the user action first, both product and engineering can scan a funnel and understand it without opening a tracking spec.
This is where mobile analytics event naming often goes wrong. Teams name events after buttons, view IDs, or tracking tickets, so reports fill up with things like btn_primary_2_tap or login_view_v3_click. Those names tell you how the app was built, not what the person tried to do.
Use plain verbs and keep them boring. Boring is good here. opened, tapped, submitted, and retried are easy to read and hard to misread. If a person taps "Create account," the event should describe that intent, such as signup_submitted, not the button label or the component name.
A simple rule helps:
- Put the user intent in the event name
- Keep one event for one action
- Put UI details in properties
- Reuse the same verbs across the app
Properties carry the extra detail. You can still capture which button version the person used, where it appeared, or which experiment they saw. Just keep that out of the event name. For example, signup_submitted can include properties like button_variant: sticky_footer, screen: signup, and experiment: copy_b.
One event should map to one intent. If one tap closes the keyboard, validates fields, and sends the form, do not fire three user action events for that same moment. Track the user intent once. Separate technical steps belong in other events or internal logs.
This also makes disagreements smaller. Product sees a clean funnel. Engineering still keeps the context it needs in properties. When both teams read the same event and infer the same action, trust goes up fast.
Name screen views and states separately
Good mobile analytics event naming keeps two facts apart: where the user is, and what state the screen is in. A screen view tells you that someone reached a place in the app. A screen state tells you what they saw after that.
If you mix those together, reports get muddy fast. An event like signup_error_tap does not tell you whether the user opened the sign-up screen, saw an error on load, or caused the error after pressing a button. Product sees a broken funnel. Engineering sees noise.
A simple rule works well:
- use one pattern for screen views, such as
screen_view - use one pattern for states, such as
screen_state - pass the screen name in the same way every time
- keep state names plain:
loading,empty,error,ready
That structure makes funnels easier to read. You can count how many users reached signup, how many got stuck in loading, and how many hit error, without guessing what an action event meant.
Do not hide screen state inside action events. If a user taps "Try again" on a failed screen, track the tap as an action and the next state as a state event. Those are two different facts. One says what the user did. The other says what the app showed.
Consistency across iOS and Android matters more than perfect naming. If iOS sends sign_up and Android sends signup_screen, your dashboard splits one screen into two. Pick one stable name, write it down, and keep it even if the UI text changes later.
A sign-up flow is a good example. Both apps can send screen_view with screen=signup, then screen_state with state=loading, and later state=error or state=ready. That is boring on purpose. Boring names age well, and they save a lot of cleanup when the team reviews funnel drops.
Separate actions from results
If one event tries to describe a tap, a request, and an outcome, reports get messy fast. A name like signup_button_tap_success looks clear at first, but it hides two different moments.
Log the action when the user acts. If someone taps "Create account", send that action event right away, even if the request fails a second later. Product can measure user intent, and engineering can trace what happened after the tap.
Then log the result as its own event. sign_up_submit_tapped and sign_up_submit_failed tell a cleaner story than one combined event. Funnels stay readable because you can see the gap between action and outcome instead of flattening both into one line.
Keep network and server detail out of the action name. The action is still a tap whether the phone loses signal, the API times out, or the server returns an error. Put that detail on the result event with properties such as error_type, http_status, or attempt_number.
A simple pattern works well:
- Action event for what the user did
- Result event for what the app got back
- Result properties for failure reason or response detail
Names that mix everything together usually age badly. signup_tap_load_success, login_click_api_error, and checkout_submit_retry_ok force every reader to guess where the user action ends and where the system response begins.
Picture a sign-up form. A user taps submit, waits, and sees an error. You want one action event for the tap and one result event for the failure. If the user taps again, that is a new action. If the second request works, that success is a new result.
Good mobile analytics event naming makes this easy to read in one glance. When action and result stay separate, both teams can trust the same funnel without arguing about what each event means.
Set up a naming rule step by step
A naming rule works best when you start small. Pick one user flow, such as sign-up, and write down the moments that matter in the order they happen. Include what the user does, what screen they see, and what the app returns.
This is where mobile analytics event naming gets easier to manage. Instead of arguing about names in code review, you decide the pattern before anyone ships tracking.
Give each moment a type: action, screen state, or result. That keeps the list clean. A tap is not the same thing as a loading state, and neither one should look like a success or error event.
A short draft might look like this:
- signup_phone_view
- signup_phone_submit_tap
- signup_code_loading
- signup_code_sent
- signup_code_error
Pick one word order and keep it boring. If you use flow_screen_verb, stay with that. If screens end with _view and results end with _success or _error, do not switch halfway to names like viewed_signup or error_on_code_screen.
Use one separator only. An underscore is fine. A dot is fine too. Mixing both usually makes event lists harder to scan, and that hurts mobile funnel readability fast.
Write a few sample names before developers add code. Product people can spot vague names early, and engineers can catch edge cases before they turn into messy reports. For example, a team may notice that code_resend_tap is an action, while code_resent is a result. Those should stay separate.
Then get product and engineering to approve the same list. One shared review saves a lot of back-and-forth later, especially when dashboard names and app code need to match.
Save the rule somewhere people already check during work. A tracking doc in the repo, a product spec, or a release checklist all work. If the rule is hard to find, people will guess, and guessed event names rarely stay consistent.
Handle retries without wrecking funnels
Retries are normal. Users tap "Send code" again, resubmit a card, or try login one more time after a timeout. If each retry gets a different event name, the funnel turns into noise. Product sees extra steps. Engineering sees a pile of one-off events.
Treat a retry as the same intent happening again. Keep one action event for that step, and store the attempt count as a property. The first try is attempt_number: 1, the second is 2, and so on. That keeps the funnel readable while still showing how often people needed another shot.
A small rule set works well:
- Fire the same action event every time the user repeats the same intent.
- Keep retry success and retry failure on the same result pattern you already use.
- Add properties for context, such as
attempt_number,retry_type, orfailure_reason.
A verification flow shows the idea. Use verification_submit every time the user submits the code. Keep results as verification_success and verification_failure, whether it worked on the first try or the fourth. If the user submits again, send the same action event with attempt_number: 2. If the app retries on its own after a network drop, keep the event name and add retry_type: auto.
This is where many teams break mobile analytics event naming. They invent names like otp_retry_submit, otp_retry_success, otp_timeout_retry, and otp_resend_failed_again. Reports get harder to scan, and funnel steps multiply for no good reason.
Retry data should add detail, not create new paths. If a funnel shows that most users finish a step only on attempt two, you learned something useful. Maybe the request times out too fast. Maybe the UI makes people think the first tap did nothing. You can see the problem without rewriting the whole funnel around retries.
Keep the step name stable. Put the retry story in properties. That gives both product and engineering the same view of what happened.
A simple example from sign-up
A clean sign-up example shows why names matter. A user opens the phone verification screen after entering a phone number. That moment should log a screen view, not an action. A simple event like phone_verification_screen_view tells you where the user is.
A few seconds later, the code does not arrive and the app shows a timeout message with a resend option. That is a screen state, so it needs its own event. Log something like phone_verification_timeout_shown. Do not rename the whole screen, and do not treat the timeout as a new step in the funnel.
When the user taps "Resend code", log the tap as its own action: phone_verification_resend_tap. After that, log the result separately with either phone_verification_resend_success or phone_verification_resend_failure. This is where mobile analytics event naming often goes wrong. Teams combine the tap and the outcome into one event, then nobody can tell whether the app failed or the user never tried.
The user gets the new code, enters it, and submits again. That should still look like the same verification flow. Log phone_verification_submit_tap, then log the result such as phone_verification_success or phone_verification_failure.
A simple event set could look like this:
phone_verification_screen_view
phone_verification_timeout_shown
phone_verification_resend_tap
phone_verification_resend_success
phone_verification_submit_tap
phone_verification_success
To keep reports readable, attach a few properties instead of inventing new event names. Good examples are flow_id, retry_count, and error_type. If the user resends once, retry_count becomes 1. If the resend fails, error_type might be timeout or rate_limit.
That structure keeps the funnel simple: enter phone number, reach verification, submit code, finish sign-up. The resend path sits inside the verification step instead of breaking it into extra branches. Product can still measure drop-off. Engineering can still see whether the timeout, resend, or submit call failed. Both teams read the same story from the same data.
Mistakes that make reports hard to read
Bad mobile analytics event naming usually starts with a small shortcut. A team adds one extra word here, one platform-specific label there, and a month later the funnel makes no sense.
One common mistake is stuffing the screen name into every action event. You end up with names like signup_screen_button_tap, pricing_screen_button_tap, and profile_screen_button_tap. Those are not three different user actions. They are the same action in three places. When teams do this, reports fill up with near-duplicates and simple questions take too long to answer.
Vague verbs cause the same mess. clicked, tapped, interacted, and engaged sound harmless, but they hide what the user actually did. Did the user submit a form, open a menu, retry a payment, or dismiss an error? If the name does not say that, product and engineering will read the same chart in different ways.
Another problem shows up when iOS and Android teams name the same thing differently. One app sends sign_up_started. The other sends registration_begin. Now the dashboard treats one step as two. Nobody trusts totals after that, and manual cleanup becomes part of every review.
A cleaner pattern looks like this:
- keep the action name the same on every platform
- track screen view as its own event
- put screen name in a property if you need context
- use specific verbs like
submit,retry,dismiss, orview
Renaming events during a release can break reports even if the new name is better. If version 1.8 sends checkout_submit for three days and version 1.9 switches to purchase_submit with no note, weekly charts split in half. The team may think conversion dropped when the name changed.
Retries and errors also confuse funnels when teams count them as fresh starts. Say a user enters a code, gets an error, and tries again. If each retry fires the same "start signup" event, the funnel shows more starts than people. That makes drop-off look worse than it is.
The fix is boring, and that is why it works. Keep one name for one action, keep screen state separate, and treat retries as retries. Clear names age well. Messy names create reports that nobody wants to defend in a meeting.
Quick checks before release
If event names need a meeting to explain them, they are not ready. A good release check is simple: give the list to a new teammate and ask what each event means. If they can guess the action, the screen, and the purpose in one read, your naming is probably clear enough.
This matters more than most teams think. Clean mobile analytics event naming saves time in product reviews, bug triage, and funnel analysis. Messy names turn one sign-up flow into three different stories.
Run through these checks before the app ships:
- Each event should point to one user intent. "tap_sign_up" is clear. "signup_cta_flow" is not.
- Screen states should use a different pattern than actions. For example, keep "screen_view" or "screen_error" separate from "tap_continue".
- Retries should stay inside the same step. Track the retry with a property like retry_count or attempt_number instead of adding a new funnel event.
- Product and engineering should test the same sample flow and compare what they expect to see in reports.
- Remove any event name that mixes action and result in one label unless that is truly the only thing you need to measure.
A small test works well. Open the app, go through one real path, and write down what happened in plain English: user opened sign-up, saw an invalid code error, tapped retry, then completed verification. Now compare that story to the tracked events. If the report shows extra steps, fuzzy labels, or duplicate retries, fix it before release.
One rule helps a lot: actions say what the user did, states say what the screen showed, and results say what the system returned. Keep those separate, and funnels stay readable.
If both teams can read the sample flow and reach the same conclusion without translating event names for each other, the setup is in good shape.
What to do next
Start small. Pick one high-traffic flow, such as sign-up, checkout, or password reset, and rewrite its event list first. A single clean flow gives both product and engineering a shared example they can copy.
Do not try to rename everything at once. That usually creates weeks of debate and still leaves old duplicates in place. One flow, one release, one clear rule set is faster and easier to check.
A good next pass looks like this:
- Choose one flow that people use every day.
- Remove duplicate event names before the next app release.
- Assign one owner who approves naming rules and reviews new events.
- Reuse the same pattern in every new feature.
That owner does not need to write every event. They just need to stop drift. If one screen tracks "signup_submit" and another tracks "register_click" for the same action, reports get messy again within a month.
Keep a short shared document with a few examples. Show how you name user actions, screen states, results, and retries. When a new feature starts, engineers can follow the pattern instead of guessing. That is how mobile analytics event naming stays readable over time, not just during a cleanup.
A simple test helps before each release: can a product manager read the event names and understand the funnel without asking for translation? If the answer is no, rename them now. Fixing names before release is cheap. Fixing broken reports after launch is not.
Some teams want an outside review once they set the first draft. That can help when internal habits are already messy or several apps use different rules. Oleg Sotnikov can review your tracking plan and app flow during a Fractional CTO consultation and point out where naming will confuse funnels, retries, or screen state tracking before it turns into reporting noise.