pixellint

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.