TL;DR
- A live event is not a decision-ready event. The dangerous failures are often missing properties, broken identify() behavior, dropped account context, duplicate firing, and unreconciled business metrics.
- Open the raw event payload. Counting events is not enough. You need to inspect whether required properties are present, typed correctly, and populated consistently.
- Frontend and server-side captures need separate QA. Browser events fail differently from backend events, and PostHog's own group analytics guidance treats those implementations differently.
- Critical metrics should be checked against source-of-truth systems. If activation, upgrade, cancellation, MRR, or retention disagree with the database or Stripe, stop and reconcile before the dashboards become operating infrastructure.
There is a predictable moment in almost every analytics implementation where the project sounds more complete than it really is. Engineering says the event tracking is shipped. Product sees activity in PostHog. Dashboards start to get requested. That is usually the moment the real QA work should begin, not end.
The problem is not that teams forget to check whether events fire. They do check that. The problem is that the hidden failures sit one layer deeper:
- the event fires but required properties are missing
- the event fires but one property silently changed type
- the user is captured but never identified correctly
- the event shows up at the person level but lost the account or workspace context
- the browser event and the server-side event describe the same moment in different ways
- the dashboard count looks plausible but does not reconcile with the source system
This matters more in B2B SaaS because many of the important questions are asked at the account level, not the individual-user level. A setup can look healthy in the activity feed and still be analytically broken for activation, retention, expansion, or churn work.
The Failure Mode Most Teams Discover Too Late
In one healthcare SaaS implementation, the event stream looked alive. The events were firing. The team could see them in the analytics tool. But a deeper QA pass found that event properties were effectively at 0% implementation. The counts existed. The metadata that made the events segmentable did not.
That distinction is strategic, not cosmetic. Without properties, the team could not segment by plan, role, account, activation state, or workflow context. The dashboards would have looked real while the answers remained structurally wrong.
Property completeness can fail even when events fire correctly. That is exactly why raw event QA belongs between implementation and dashboarding, not after executives start asking for trend lines.
The same implementation eventually required validation across 152 specified events, including 114 app events and 38 website events, plus identity logic, group/account structure, and data quality checks against source systems. The lesson is simple: implementation completeness is not visible from the event count alone.
The 10-Point PostHog Tracking QA Checklist
| Check | What to verify | Why it matters |
|---|---|---|
| 1. Environment | Events land in the intended PostHog project and environment | Stops test traffic and live traffic from contaminating each other |
| 2. Raw payload | Required properties exist with correct values on the event itself | Prevents “event fired, but unusable” failures |
| 3. Property integrity | Types, enum values, null handling, and identifiers are consistent | Broken properties quietly destroy segmentation |
| 4. Identity | identify() runs at the right moment and user transitions are clean | Without this, person-level reporting drifts fast |
| 5. Reset behavior | Logout and user-switch flows do not bleed identities or groups across sessions | Shared devices and role-switching can poison data silently |
| 6. Account grouping | Group or account context exists where B2B analysis needs it | Most meaningful B2B questions happen at the account level |
| 7. Frontend vs server-side | Browser events and backend events are QA'd separately | They fail in different ways and need different checks |
| 8. Duplicates | Refreshes, retries, double-clicks, and bulk actions do not overcount | Duplicate events make dashboards look more persuasive than they are |
| 9. Reconciliation | Critical metrics align with DB, Stripe, or manual calculations | This is where trust in the analytics layer is earned |
| 10. Privacy hygiene | No forbidden PII or PHI lands in payloads or properties | Bad tracking can create both data-quality and compliance risk |
The checklist is deliberately post-implementation. It assumes the taxonomy exists and the code has shipped. The job now is to prove the setup is usable.
1. Open the Raw Event, Not Just the Chart
The fastest bad habit in PostHog implementations is verifying the existence of an event in the activity stream and calling that QA. That is not enough. You need to open the event and inspect the payload.
At minimum, check:
- required properties are present
- property names match the tracking spec exactly
- values are populated from the correct source
- IDs look like real IDs, not placeholder or fallback values
- numbers are numbers and enums are controlled strings
If the event was supposed to distinguish by plan, practice, account, role, feature surface, workflow, or acquisition source, confirm those properties are actually there. The dashboard cannot recover meaning that the event never carried.
2. Validate Identity and Account Context Explicitly
PostHog's own documentation on identify makes the identity layer clearer than most teams operationalize. The tool can merge anonymous and identified behavior, but only if the implementation uses identify() correctly and does not create distinct-ID chaos later.
That means the QA pass should not stop at event capture calls. It should also verify:
- when identify() runs in the user journey
- whether person properties are set when they should be
- whether logout or user-switch flows call reset() where needed
- whether the same human can accidentally become multiple pseudo-users
In B2B SaaS, that is still only half the job. PostHog's group analytics layer exists because the unit of analysis is often the account, company, workspace, or practice, not the person. If the account context is missing, the event may be valid technically and useless strategically.
So the QA pass should ask:
- does this event have the group/account context it needs?
- does the same event behave the same way across all major account types?
- do key account properties update when the account changes plan, status, or lifecycle state?
The setup and the QA pass are different jobs
The setup guide covers what to configure in PostHog. This checklist covers what to prove after the instrumentation is already live.
3. Test Frontend and Server-Side Tracking Separately
This is one of the most important practical distinctions in the whole article. PostHog's tutorial on frontend vs backend group analytics explicitly treats the two implementations differently, and the QA pass should do the same.
Browser-side events are stateful. They live inside a session and usually follow a flow like identify -> group -> capture. They break when UI triggers misfire, when sessions retain stale user/group context, or when a user changes state without reset logic being handled correctly.
Server-side events are stateless. They often represent activation milestones, billing events, account status changes, or webhooks. They break differently: incomplete payloads, missing group data on one code path, delayed capture, or missing reconciliation identifiers.
So do not QA them as one layer. Check them separately:
- Frontend/browser: trigger behavior, duplicate clicks, session carryover, logout resets, stale group associations
- Server-side/backend: payload completeness, idempotency, webhook reliability, event ordering, group data on every capture where needed
If both layers exist, both layers need their own sign-off. A clean browser layer does not guarantee a clean backend layer, and vice versa.
4. Reconcile the Important Numbers Before Anyone Trusts the Dashboards
The most serious QA work starts where the analytics tool meets the operating system of the business. For critical events and metrics, PostHog should be checked against the source systems that actually own the truth.
In one implementation, that meant validating:
- activation counts against database queries
- upgrade and cancellation events against the billing system
- MRR-related logic against Stripe-synced values
- retention outputs against manual calculations
The standard was not vague directional comfort. It was explicit agreement within a small tolerance. That is the difference between “the dashboard is interesting” and “the dashboard can settle an argument.”
In one validation plan, the target was for PostHog to match source-of-truth systems within a narrow tolerance on critical metrics. The point is not mathematical perfection. The point is making the trust threshold explicit.
If those checks fail, the right move is usually boring and disciplined: stop the dashboard work, fix the event layer, re-run the validation, then continue. Dashboards should be downstream of verified instrumentation, not the tool you use to discover the instrumentation was broken.
5. Review Privacy and Payload Hygiene Before the Setup Scales
This is easy to underweight until the tracking layer has already spread across product, website, billing, and support systems. In the healthcare SaaS work behind several of these examples, privacy-safe tracking was not optional. IDs had to be hashed where needed, patient-level information could not be sent, and forbidden fields had to stay out of analytics payloads entirely.
Even outside healthcare, the operational lesson holds: payload review belongs in QA, not just in legal review. If developers can accidentally send names, raw emails, internal notes, or other sensitive strings inside event properties, the system is not ready.
So the checklist should explicitly ask:
- are any properties carrying data they should not carry?
- are account and contact identifiers privacy-safe for the use case?
- did a convenience shortcut in implementation quietly widen the payload?
When to Stop Building Dashboards and Fix the Instrumentation First
There are a few red flags that should pause dashboard work immediately:
- events are visible but the required properties are absent
- the same user or account appears under multiple identities
- account-level analysis is impossible because group context is missing
- browser and server-side events disagree about core milestones
- critical counts do not reconcile with source systems
- payload review finds forbidden or unsafe fields
At that point, the fastest path is not more visualization work. It is remediation: clean the tracking plan, fix the instrumentation, re-run the QA checklist, and only then expand dashboards or reporting workflows.
If dev says tracking is done, that is the start of the validation layer
ProductQuant helps teams pressure-test PostHog setups so activation, retention, account health, and revenue dashboards are built on data the team can actually trust.
FAQ
Is this checklist only relevant if we use both frontend and server-side tracking?
No. The checklist still matters for browser-only setups. The split becomes more important if you also capture activation, billing, or account-state events from the backend, but raw payload QA, identity validation, and duplicate checks still matter either way.
Do all PostHog setups need group analytics?
No. But many B2B SaaS teams eventually need an account-level model. If the important questions are asked at the company, workspace, or practice level, that grouping layer needs its own QA pass, not a casual assumption that it works.
How closely should PostHog match our source systems?
Close enough that the team trusts it for real decisions. For the highest-value metrics, the right standard is usually explicit and tested, not vague directional agreement.
What is the most common hidden failure after tracking ships?
Usually not total event loss. It is missing properties, broken identity, missing account context, duplicate firing, or unreconciled business events. Those failures are more dangerous because the dashboards still look authoritative.
Sources and Further Reading
- PostHog docs: Capturing events
- PostHog docs: Identifying users
- PostHog docs: Group analytics
- PostHog tutorial: Frontend vs backend group analytics
- The Complete PostHog Setup Guide for B2B SaaS
- JTBD-Focused Event Taxonomy Design for B2B SaaS
- The Product Analytics Implementation Checklist We Use With Every Client
Do not let “tracking is live” become the same thing as “tracking is usable.”
Once the PostHog layer becomes trusted, activation, retention, account health, and revenue questions get easier to settle. Until then, the dashboards are mostly decoration.