Example report: Northloop is a made-up company, but this is the exact format and depth of a real $400 Diagnostic.
· Not a real client · Prepared as a public example of a Cold Index $400 Diagnostic
Download this sample as PDF
· Back to audits
$400 Diagnostic · Sample
Diagnostic report for Northloop
A written review of 36 distinct event names from a fictional B2B SaaS Amplitude export: duplicate and drifting names, broken properties, value hygiene, dead events, and plan vs reality. Ranked fixes with evidence, plus a clear answer on whether a full audit is worth it.
Sample disclaimer. Northloop is a made-up company. Every event name, count, property, and quote in this report was invented for this example. Nothing here comes from a real customer file or project.
- Client (sample)
- Northloop — fictional B2B SaaS
- Platform
- Amplitude (export + inventory)
- Scope
- 36 distinct event names (Diagnostic cap: 40)
- Window
- Last 30 days of inventory · sample event rows
- Access
- Read-only export (no live project changes)
- Deliverable
- Ranked fix list + audit recommendation
Recommendation
A full Audit ($2,000) is worth it — but only if you will ship the renames.
The Diagnostic already covers your whole taxonomy (36 ≤ 40). The problems are concentrated in a few places: four high-impact duplicate clusters on sign-up, login, check-in, and upgrades; an incomplete team_created → Workspace Created rename; personal data on acquisition events; and a tracking plan that no longer matches production.
What a full Audit would still buy you: a clean tracking plan spreadsheet with old-to-new mapping, a naming guide your team can keep, and a decision log for every merge. If engineering will not dedicate a sprint to the renames in the next 30 days, stop at this Diagnostic, implement the High items below, and skip the upsell. The $400 Diagnostic credit applies to an Audit booked within 30 days of delivery.
What we reviewed
In scope Event names, properties, and values for all 36 names in the 30-day inventory; sample Amplitude rows; the attached tracking plan (22 rows, last edited early 2025).
Out of scope Live Amplitude project settings, SDK code changes, dashboard rebuilds, warehouse dbt models, and any write access. Audit-only, by design.
Snapshot
| Signal | Finding |
| Distinct event names | 36 in inventory · Taxon near-dup pass collapses obvious aliases toward ~27 canonicals · several same-intent names still sit outside those clusters and need a human merge |
| Tracking plan | 22 listed · 5 never fire · 14+ production names absent from the plan |
| Highest-risk funnels | Sign-up, login, check-in, plan upgrade / purchase |
| Personal data | email and full_name present on Sign Up variants and Invite Sent |
| Dead weight | legacy_pulse_v1, Old Dashboard Viewed (last seen 2025) |
Ranked fix list
Severity reflects impact on numbers your team already uses. High items first. Each fix is written so engineering can implement without a call.
1
Collapse the four sign-up names into one canonicalHigh
Evidence
Last 30 days: Sign Up 1,840 · signup_completed 620 · user_signed_up 210 · Signup Completed 95. Same product moment; four chart definitions.
Why it matters
Activation and acquisition reports silently disagree depending on which name an analyst picks. Funnel step one is not stable.
Fix
- Pick one canonical, e.g.
Sign Up Completed (past-tense, Title Case).
- Stop firing the other three in the client SDK and any server path.
- In Amplitude, merge or map historical aliases to the canonical (or document a chart-level mapped view until history is backfilled).
- Update the tracking plan row and owners the same day the code ships.
2
Finish the Workspace rename — stop team_createdHigh
Evidence
Workspace Created 520 and team_created 340 both fire in the same 30-day window. Your notes say the rename shipped August 2025; mobile (or an old build) still emits the old name.
Why it matters
Workspace creation is undercounted by ~40% if charts use only the new name; double-counted if someone unions both without deduping users.
Fix
- Find every remaining
team_created call site (likely older mobile build or a forgotten server job).
- Ship
Workspace Created only; keep a temporary dual-fire only if you need a measured cutover week, then kill the old name.
- Map historical
team_created → Workspace Created in the taxonomy.
3
Unify login: Log In · login · User Logged InHigh
Evidence
Volumes: 9,200 · 3,100 · 180. Near-dup clustering catches Log In/login; User Logged In stays separate and still dribbles in.
Why it matters
DAU/WAU proxies and “returning user” segments drift by source file.
Fix
- Canonical:
Log In with property method (password · sso · magic_link — already present on many rows).
- Remove
login and User Logged In producers; alias history.
4
One check-in event — including the no-hyphen / snake variantsHigh
Evidence
Check In Submitted 5,400 · checkin_submitted 980 · Check-In Submitted 140. Hyphen variant clusters with the Title Case name; checkin_submitted does not and is easy to miss in a UI-only pass.
Why it matters
Check-in is your core product action. A 15%+ shadow stream breaks retention curves.
Fix
- Canonical:
Check In Submitted.
- Require
workspace_id (see #7 for key spelling).
- Alias both variants; delete producers.
5
Upgrade / purchase: merge aliases and investigate double-countHigh
Evidence
Upgrade family: Plan Upgraded 410 · plan_upgraded 155 · Subscription Upgraded 60. Purchase pair: Purchase Completed 290 vs purchase_completed 275 — nearly equal volume, classic client + server double-fire shape. Keep Refund Processed separate.
Why it matters
Revenue and conversion charts can read ~2× on purchases if both names are summed. Upgrade reporting is split three ways.
Fix
- Canonical upgrade:
Plan Upgraded. Canonical purchase: Purchase Completed.
- Confirm whether purchase fires from both browser and webhook; keep one path (prefer server) and pass a shared insert id if you must dual-send.
- Do not merge refunds into purchases.
- Require numeric
amount + currency + plan_type on both (see #6, #8).
6
Remove personal data from event propertiesHigh
Evidence
Sample rows for Sign Up variants and Invite Sent carry email and full_name. Your own notes flag a 2025 growth experiment as the likely source.
Why it matters
Event properties are the wrong place for direct identifiers: wider export surface, harder retention/deletion, and easy leakage into shared charts.
Fix
- Stop sending
email and full_name on events immediately.
- Identify users with Amplitude user properties / identity API (or your warehouse profile table), not on every event.
- Scrub or drop the properties on historical data per your retention policy.
7
One key for plan, one for workspace — stop the three-way splitMed
Evidence
Plan is split across plan, plan_type, and planType (each populated on about a third of sample rows). Workspace id appears as workspace_id, Workspace ID, and sometimes org_id with the same ws_* values.
Why it matters
Breakdowns by plan or workspace look empty for large slices of traffic. Required-field checks on the plan fail even when “a plan field” was sent.
Fix
- Canonical keys:
plan_type, workspace_id. Snake case everywhere.
- Reserve
org_id for a real organization id if you have one; do not overload it as workspace.
- Alias the old keys in the warehouse or taxonomy map during transition.
8
Normalize plan / country / status values; block free text in plan_typeMed
Evidence
Values pass shows pro/Pro/PRO, pro_annual/Pro Annual, country US/U.S./us/USA/United States, status active/Active/ACTIVE. At least one plan value is a free-text deal note, not a category.
Why it matters
Segment and cohort filters under-count. Free text in a category key makes every new deal a new “plan.”
Fix
- Allow-list
plan_type: free · pro · pro_annual · team · enterprise. Put deal notes in a separate optional string property if you truly need them.
- Store country as ISO-3166 alpha-2 (
US, CA, GB, DE).
- Lowercase status enums at the producer.
9
Require amount (number) on revenue eventsMed
Evidence
In the sample of upgrade/purchase-like rows, roughly one in four arrives with an empty amount. Populated values arrive as digit strings (49, 49.00, 99) rather than a consistent number type. currency mixes USD and usd.
Why it matters
Revenue sums drop nulls; type mixes break some warehouse casts.
Fix
- Validate at the producer: number
amount, uppercase ISO currency.
- Quarantine failures to a side stream instead of silently omitting.
10
Page views and button clicks: one name each, or drop them from product analyticsMed
Evidence
Page views: 128k + 44k + 8.9k under three names. Buttons: 22k + 6.7k + 1.2k. Both families cluster cleanly once casing/tense is normalized.
Why it matters
High-volume noise crowds the event list and makes taxonomy reviews harder. Rarely used for product decisions in SaaS if you already have session replay or a warehouse pagefeed.
Fix
- If you keep them: one
Page View, one Button Clicked with button_id (not Button ID).
- If you do not use them in Amplitude charts, stop sending and reclaim the noise budget.
11
Own or kill the feature-flag firehoseMed
Evidence
experiment_flag_exposed 45,000 and Feature Flag Evaluated 12,000 — neither appears in the tracking plan. Combined volume rivals your intentional product events.
Why it matters
Orphan high-volume events inflate bills and bury the taxonomy. If experimentation needs them, they should be documented and named once.
Fix
- Decide: product analytics vs experiment tool. If the experiment platform already logs exposures, drop these from Amplitude.
- If you keep one, pick a single canonical and add it to the plan with an owner.
12
Reconcile the tracking plan with productionMed
Evidence
Plan lists 22 events; inventory has 36. Plan rows with zero fires in the window: Onboarding Completed, Activation Milestone, NPS Submitted, Logout, Password Reset Requested. Your notes confirm onboarding “never shipped.”
Why it matters
Analysts trust the spreadsheet; production diverged in 2025. New events ship without owners.
Fix
- Mark never-shipped rows as deprecated or remove them.
- Add every production name you intend to keep (after the merges above).
- Assign an owner column that is a real person or team, reviewed quarterly.
13
Align source and utm_source on acquisition eventsLow
Evidence
Sign-up rows alternate between source and utm_source for the same idea, with casing drift (google vs Google).
Why it matters
Channel reports need a single field.
Fix
- Prefer
utm_source (and friends) when the value is campaign traffic; use a separate signup_source for product-defined origin if needed.
- Lowercase at ingest.
Evidence
legacy_pulse_v1 last seen 2025-12-02 (3 events) · Old Dashboard Viewed last seen 2025-08-19 (1 event).
Why it matters
Clutter and confusion for anyone browsing the full event list.
Fix
- Block/hide in Amplitude; remove any leftover producers; note as deprecated in the plan.
15
Identity: stop sending events with no user_id when the user is knownLow
Evidence
About 8% of sample rows have an empty user_id while other identity fields may still be present.
Why it matters
Breaks user-level funnels and inflates “anonymous” counts after login.
Fix
- After auth, ensure the SDK has the user id before product events fire.
- Allow truly anonymous pre-auth events; do not mix the two without a merge path.
Keep separate (do not merge)
| Pair | Why |
Invite Sent vs Invite Accepted | Different funnel steps; merging destroys invite conversion. |
Purchase Completed vs Refund Processed | Opposite money direction. |
pro vs pro_annual (plan values) | Different SKUs; casing variants within each SKU should merge. |
Suggested first week
- Ship fixes #1–#6 (names + PII + workspace rename).
- Turn on allow-lists for
plan_type and required amount on revenue events (#7–#9).
- Decide flag-event and pageview policy (#10–#11); refresh the tracking plan (#12).
About this sample
This document is a public sample of a Cold Index $400 Diagnostic. The company Northloop, its people, and its data are fictional. A real Diagnostic is invoiced after delivery, due in 14 days, and credited toward an Audit or Estate booked within 30 days. Book: hello@coldindex.net · https://coldindex.net/audit/