Analytics · engineers · PMs · marketers
Sampling hides the broken 1%
A dashboard that looks healthy can sit on top of a stream that is 3% malformed. Ads optimization feels that 3%. The weekly screenshot does not.
UI versus export
GA4 Explore sampling is not BigQuery. If you have BigQuery, count null currency on purchase there, count timestamp_micros digit length, count events with no client_id. If you do not, you are flying on sampled UI plus hope. Mixpanel Insights on a sampled board will not show the empty distinct_id row that never joined.
Ads UIs hide invalid traffic after the fact. Volume that looked like a campaign in raw collect hits can disappear after IVT. Product analytics will still show the bots if you did not filter. Agree which UI is the meeting source before you declare a pixel broken.
The 1% you will not click-test
QA on 20 events will never see the 1% of purchases missing currency, the locale that serializes 19,99, the refund path that omits transaction_id, or the app stream that still sends measurement_id. Those are the events value-based bidding trains on. A 99% valid stream still poisons ROAS if the broken 1% is all high-AOV.
Contract-test fixtures catch the 100% cases: wrong clock, unhashed email, missing event name, empty events[]. They will not catch a GTM trigger that only fails on one locale. Pair CI with a sampled raw export, not with a DebugView screenshot.
pixellint validate json @fixtures/ga4-purchase.json --rulepack vendor/google-analytics
pixellint validate json @fixtures/mixpanel-track.json --rulepack vendor/mixpanel
Bots and scanners
Volume spikes from scanners can look like a successful campaign in raw hits and disappear in the ads UI after IVT. Headless Chrome hitting /thank-you with no gclid still fires collect. See bots and invalid traffic. Do not raise bids because staging or a health check converted.
Staging pixel ids exist so this traffic never reaches production. Pointing staging at production because it is easier is a data incident, not a shortcut. See QA pixels in staging.
What to sample
Pull a day of MP bodies or collect URLs. Run pixellint validate json / pixellint validate url on the sample. Chart error codes, not pageviews. vendor.google-analytics.body.purchase_requires_ecommerce_fields at 2% is a shop bug. The same code at 0.01% may be a single bad SKU. Mixpanel empty distinct_id and PostHog captures that 200d without an event name show up the same way: as a rate, not as a missing dashboard row.
HAR archaeology once a week is not a sample. It is one browser. Put fixtures in CI for the schema, and a sampled export for the rate. Neither replaces the other.
Success is a rate, not a green DebugView
DebugView, Mixpanel live view, and Amplitude User Lookup answer did my device send it. They do not answer did last week's 50k purchasers send currency. Do not ship based only on a green personal hit. Define a broken-payload budget (for example, purchase without transaction_id below 0.1%) and measure it in the export.
Pixellint is not affiliated with Google or Mixpanel. The packs catch the schema. You catch the rate.
Check the artifact
Paste the pixel URL or JSON body into the
playground. Same engine as
pixellint validate. Nothing leaves the tab.