What Is a Tracking Plan (And Why Your Team Needs One)
Analytics data degrades without a shared definition of what's being tracked. A tracking plan fixes that - here's what it is, what goes in it, and why spreadsheets always fail.
If your analytics data has ever been wrong - events firing with missing properties, mobile and web tracking the same action under different names, a new engineer implementing an event that already existed with a slightly different slug - you have already experienced the problem a tracking plan solves.
What is a tracking plan?
A tracking plan is a document that defines every analytics event your product tracks: what it is called, when it fires, what properties it carries, and which platforms implement it. It is the contract between your product team - who decides what to measure - and your engineering team - who implements the measurement.
At its most basic, a tracking plan answers three questions for every event:
- What happened? The event name, e.g.
purchase_completed - What context surrounded it? The properties, e.g.
product_id,amount,currency - Where does it happen? iOS, Android, backend, web - or some combination
Why every analytics-driven team needs one
Without a tracking plan, analytics data degrades over time in predictable ways.
Event names drift. One engineer names it checkout_complete, another names it order_placed. Both make sense in context. Six months later your data warehouse has both, and nobody is sure whether they represent the same action or different ones.
Properties become inconsistent. The user_id field is a string on iOS and an integer on Android. The price field sometimes includes tax and sometimes does not. These inconsistencies are invisible until you are debugging a dashboard at 11pm the night before a board meeting.
Events go undocumented. A developer ships a feature, adds three tracking calls, and moves on. Six months later nobody knows what experiment_v2_modal_shown means or whether it is still firing.
Coverage becomes unknown. You think 80% of your events are implemented correctly. You might be right. You might be at 40%. Without a tracking plan and a way to validate against it, you cannot know for certain.
What goes into a good tracking plan
A tracking plan should capture, for each event:
- Name - the exact string sent to your analytics provider. Snake_case is the standard.
button_clickednotButtonClickedorbutton-clicked. - Description - what triggers this event and why it matters. “Fired when a user completes a purchase after adding items to their cart” is useful. “Purchase event” is not.
- Properties - every field in the event payload. For each property: name, type (string, integer, boolean, enum), whether it is required, and what values are valid.
- Platforms - which platforms implement this event. An event might exist on iOS and Android but not web. Knowing this prevents coverage gaps.
- Status - is this event active, deprecated, or planned? Tracking plans go stale when deprecated events are never marked as such.
- Owner - which team or person is responsible for keeping this event accurate.
The spreadsheet problem
Most teams start with a spreadsheet. It works until it does not. The problems are structural.
Spreadsheets have no enforcement. The plan says amount is a required decimal. Your Android developer ships it as a string. The spreadsheet does not know and cannot catch it.
Spreadsheets do not version. When you change an event schema, there is no record of what it looked like before. Debugging a data issue from three months ago means either remembering or guessing.
Spreadsheets go stale. Every time code ships, someone has to remember to update the spreadsheet. They usually do not. Within a few months the spreadsheet and the codebase have diverged, and nobody trusts either.
Spreadsheets do not generate code. The engineer manually translates the tracking plan into Swift, Kotlin, TypeScript, or whatever language the platform uses. Manual translation introduces errors that type checking could catch automatically.
What a structured tracking plan enables
When your tracking plan is a structured, versioned registry rather than a static document, several things become possible.
Code generation. The event registry knows the event name, its properties, their types, and which platforms it targets. That is enough information to generate type-safe tracking code automatically - a Swift enum for iOS, a Kotlin data class for Android, a TypeScript interface for web. Engineers implement against generated code, not a spreadsheet row. Type errors are caught at compile time, not at dashboard review time.
Coverage validation. A codebase scanner can analyse your codebase and report which events from the tracking plan are actually implemented - and which are not. Instead of guessing whether your iOS app fires subscription_started, you know exactly what is and is not covered.
Version control. When an event changes, the change is recorded. You can see what purchase_completed looked like in v1.4.0 versus v2.0.0. Breaking changes - a required property removed, a type changed - are detected automatically and flagged before they reach production.
Team alignment. When product, analytics, and engineering share a single source of truth for what is being tracked, the conversation changes from “I thought we were tracking that” to “here is the current schema - what needs to change?”
How to get started
If you are starting from zero, do not try to document every event at once. Start with the five or ten events your core metrics depend on. Get those right before expanding.
If you already have a spreadsheet tracking plan, the migration is usually straightforward: move each row into a structured registry, add property types and required flags, and start from there. The goal is not a perfect document on day one. It is a living registry that stays in sync with what is actually in your code.
The teams that get analytics right are not the ones with the most sophisticated data infrastructure. They are the ones who decided early on that the tracking plan was a first-class engineering artefact - versioned, validated, and owned - rather than a spreadsheet someone updates when they remember.
Ready to bring structure to your analytics events?
Try Ordaze free →