How to actually instrument product analytics correctly. Event taxonomy, property design, naming conventions, schema versioning, identity stitching, funnel design, retention cohorts, North Star metric selection, dashboard hygiene, instrumentation debt, and the failure modes that produce data nobody trusts. Triggers on product analytics setup, event taxonomy, tracking plan, instrumentation, schema versioning, North Star metric, retention cohorts, funnel design, naming conventions, instrument new feature, audit existing analytics, dashboard reconciliation, instrumentation debt, Mixpanel setup, Amplitude setup, PostHog setup, warehouse-native analytics. Also triggers when the team has data but cannot trust it, or when designing instrumentation for a new feature, or when auditing an existing setup that has drifted.
53
60%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Optimize this skill with Tessl
npx tessl skill review --optimize ./skills/product-analytics-setup/SKILL.mdA senior PM and analyst's playbook for instrumenting product analytics correctly the first time.
Most product analytics setups are some combination of inherited mistakes, dashboard sprawl, and events nobody trusts. The team launches a new feature; instrumentation gets bolted on under deadline pressure; naming drifts; properties are inconsistent; six months later nobody can answer simple questions because the answer depends on which event you trust.
This skill is the discipline that prevents that. It assumes you have answered the strategic questions about what to measure (see analytics-strategy). It assumes you have a tool connected (Mixpanel, Heap, PostHog, Amplitude, or warehouse-native via BigQuery, Snowflake, or dbt). The hard part is the systematic execution: naming conventions, property design, schema versioning, funnel construction, cohort definitions, retention measurement.
When to use this skill: setting up product analytics from scratch, auditing an existing instrumentation, fixing a "we have data but cannot trust it" problem, or designing instrumentation for a new feature.
This skill spans instrumentation execution. It does not cover measurement strategy (use analytics-strategy), experimentation result interpretation (use experimentation-analytics), paid media analytics (use ads-performance-analytics), or platform decisions (use experimentation-platform-orchestrator). Pair this skill with the relevant integrations microsite for your specific tool.
The clean distinction from analytics-strategy. That skill (Growth category) is strategic: what to measure and why, KPI hierarchy, dashboard architecture, attribution models. This skill (Product category) is execution: how to actually instrument the product correctly. The two compose. Read analytics-strategy first to decide what matters; read this skill to instrument it.
The mental model. Every analytics setup is a stack of layers. Each layer depends on the one below it being correct.
user_signed_up, checkout_completed, feature_x_used.anonymous_id, user_id, account_id.You cannot construct higher levels without correct lower levels. Garbage events produce garbage funnels. The discipline is bottom-up. Most "we have data but cannot trust it" problems trace back to the bottom two layers.
Three rules for event design.
checkout_completed, not checkout_complete or completing_checkout. Past tense reads as "this happened" rather than as a state.video_played, form_submitted, email_opened. Reading the event name aloud should describe what happened.checkout_completed once at the moment of completion, not submit_button_clicked plus checkout_completed. UI events are noise; semantic events are signal.The verbs vs states trap.
checkout_completed, subscription_canceled, account_upgraded.user_status: active is a property on the user, not an event. Setting state via events ("status_changed_to_active") is a code smell that produces double-counting.How many events to design. Thirty to fifty events is the sweet spot for a typical SaaS product. Below twenty means under-instrumented; above one hundred almost always means tracking UI noise or duplicating events in different formats.
Detail and a canonical event spec in references/event-taxonomy-template.md.
Two property types, treated separately.
Event-level properties describe THIS event. The checkout_completed event has properties like cart_value, item_count, payment_method, discount_code. They live on the event payload and are immutable once fired.
User-level properties describe the USER over time. subscription_tier, lifetime_value, acquisition_channel. Set them once on the user profile; the analytics tool joins them onto every event the user fires. They update over time as the user changes.
The trap. Putting user-level properties on every event. Do not track subscription_tier on every event payload; set it once on the user profile and rely on the join. Putting it on the event creates payload bloat, schema drift when the value changes, and reporting confusion when a user upgrades mid-session.
Data type discipline.
trial_day: 7).is_admin, has_trial, is_new_user. Two values; nothing else.Worked example in references/property-design-patterns.md showing right and wrong design for a product_viewed event.
Pick ONE convention and enforce it. Three conventions worth picking.
user_signed_up, cart_value. Most platforms default to this; pushback is rarely worth it.user_signed_up, video_played. Reading the name should describe what happened.subscription_tier, is_admin, last_active_at.What NOT to do.
user_signedUp, User Signed Up, userSignedUp all coexisting in the same project. Pick one and migrate.user_signed_up plus completedCheckout plus VIEW_PRODUCT in the same project means nobody can predict an event name without looking it up.mailchimp_email_opened ages badly when you switch to Customer.io.The naming convention reference file provides a complete style guide. Cite it in your team's data contract.
Detail in references/naming-convention-reference.md.
Schema changes are inevitable. The pattern.
Additive changes are safe. New event, new property on an existing event, new value in an enum. Just ship. Existing dashboards continue to work.
Breaking changes require migration. Renamed event, removed property, changed property type, narrowed enum. These break dashboards downstream; the migration plan is part of the change.
Versioning patterns.
_v2 to events when semantics change. checkout_completed_v2 fires alongside checkout_completed during a transition.The data contract idea.
Detail in references/schema-versioning-patterns.md.
Funnels measure progression through a sequence. Four rules.
page_view or session_start. Vanity-event-anchored funnels show 99% drop-off and tell you nothing.Common funnel mistakes.
session_started happens for every visit; using it as a step inflates the denominator and makes the rest of the funnel meaningless.Common funnel shapes and time-window guidance in references/funnel-design-templates.md.
A cohort is a group of users sharing an attribute or behavior. Useful patterns.
subscription_tier: pro. Useful for segment-level analysis.Cohort discipline.
Detail in references/cohort-definition-patterns.md.
Retention is repeat behavior over time. Three flavors.
For most SaaS products, bracket retention is the right default. Day-7 is high-noise; week-2 (bracket) is more stable. Day-1 retention is almost always over-indexed to onboarding effects rather than product-market-fit signal.
Retention curve interpretation.
Detail in references/retention-measurement-patterns.md.
North Star metric (NSM) selection rules.
Bad NSMs. Signups (vanity; many signups never activate). Revenue (lagging; not action-oriented; varies by mix). DAU (only useful for engagement-driven products; misleads on monthly-cadence products).
Better NSMs. Weekly active editors (Figma). Nights booked (Airbnb). Messages sent per day (Slack). Products created per workspace per week (Linear). Each names a user-value action that maps to business growth.
Supporting metrics framework.
Detail and product-type-specific examples in references/north-star-metric-selection.md.
A dashboard is trustable when four things are true.
fct_orders, last 30 days, joined to dim_customers."The stale dashboard failure mode. A dashboard built two years ago is still in use. The underlying schema changed; the dashboard's query points at columns that no longer exist or now mean something different. The team makes decisions on broken numbers and does not realize until something breaks loudly.
Prevention. Every dashboard has an owner, a refresh cadence, and a quarterly audit. Dashboards without an owner get deprecated. Dashboards that have not been refreshed in 90 days get deprecated. The half-life of a dashboard is shorter than the half-life of the product.
The compounding cost of cutting corners.
Instrumentation debt is real and compounds like technical debt. The discipline.
Detail in references/instrumentation-audit-checklist.md.
Twelve patterns recur across product analytics setups. The short version.
Detail in references/common-failures.md.
When designing or auditing product analytics, walk these 12 considerations. Skipping any of them is how the team ends up with data nobody trusts.
_v2 suffix during transitions. Data contract in code.The output of the framework is a tracking plan. A list of events with their properties, the canonical user identity, the named cohorts, the named funnels, the retention measurement choice, the named NSM, the dashboard owners. The plan lives in code and gets reviewed like any other product spec.
references/event-taxonomy-template.md - Canonical event spec for typical SaaS: account, user, activation, engagement, conversion, retention events with required properties.references/property-design-patterns.md - Event-level vs user-level patterns. Type discipline. Worked example: product_viewed right vs wrong.references/naming-convention-reference.md - Complete style guide. snake_case, past tense, object-action. Boolean prefixes. Money in cents. Timestamps with _at suffix. Do/don't side-by-side.references/schema-versioning-patterns.md - Additive vs breaking changes. _v2 suffix pattern. Data contract in TypeScript. CI lint patterns.references/funnel-design-templates.md - Activation, conversion, engagement, feature adoption funnels. Time windows, anchor events, drop-off interpretation.references/cohort-definition-patterns.md - Acquisition, behavioral, property, combined cohorts. SQL examples plus tool-specific examples.references/north-star-metric-selection.md - NSM rules with examples by product type. Anti-patterns. Migration patterns when changing NSM.references/instrumentation-audit-checklist.md - Quarterly audit playbook: schema review, volume sanity checks, dashboard freshness, owner audit, deprecation candidates.references/common-failures.md - Twelve failure patterns with symptom, root cause, fix, prevention.Most product analytics setups are over-instrumented, not under-instrumented. Tracking every button click produces noise that drowns the signal. The discipline of saying "we do not need to track that" is harder than "let us track that just in case." Default to less.
The data you do not have can be added later. The data you over-collected costs you forever, in dashboard performance, in schema complexity, in signal-to-noise. The team that ships with thirty well-designed events and a small set of named cohorts outperforms the team that ships with two hundred events and no cohort discipline.
When the team disagrees on whether to add an event, the question is not "could this be useful?" but "what specific decision will this event inform, and is the decision worth the instrumentation cost?" If the answer is "we might want to know" the answer to the question is no.
8e70d03
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.