pixellint

Launch · PMs · marketers · engineers

Ship the dictionary before you ship the tag

The expensive mistakes are product mistakes: Purchase on landing, Lead on page view, no owner for GTM, staging ids in production. The validator catches syntax. You catch intent.

Dictionary before snippet

1. Write the event dictionary as one page, not a Slack thread: ads name, analytics name if they differ, when it fires, value definition (tax in or out), who may add events. 2. Name Purchase only on paid orders, Lead only on a real lead, PageView on every view you mean to count. 3. Include the dedup key (event_id / fbq eventID / order id) so engineering does not mint two UUIDs. 4. Include the clock the vendor actually wants: Meta seconds, TikTok ISO, LinkedIn milliseconds, GA4 microseconds. 5. Freeze v1 of the page before anyone pastes a base code.

A tag without a dictionary is how Purchse reaches production and how finance argues with media about a number that was never defined. The validator will not stop a correctly spelled Purchase on the landing page. You will.

Owners

1. Name who publishes GTM (workspace, production container, and the rollback). 2. Name who rotates CAPI tokens and Measurement Protocol api_secret. 3. Name who is on call when Test Events is empty. 4. If the answer is the agency, write the agency's name, contract end date, and the offboard plan for tokens they minted. 5. Name who may add custom events without a dictionary change. If that list is everyone, it is no one.

Tokens in a contractor laptop and a GTM container whose only admin left are how you discover ownership on a Friday incident. Write it down while it is boring.

Environments

1. Separate pixel ids or measurement ids for staging. 2. test_event_code and debug_mode only in QA, stripped by a flag in prod. 3. GTM environments exist to swap those ids; use them. 4. Block production tokens on localhost and preview hosts in the client. 5. event_source_url=http://localhost:3000 must never hit production CAPI.

QA buys the product ten times a day. If those Purchases hit the production pixel, the model learns that your office converts at 100%. Then real users look expensive. See QA pixels in staging.

// staging: separate pixel id, or production id plus test_event_code
// production: no test_event_code, no debug_mode, no localhost event_source_url

PII and legal

1. Decide which fields may leave the browser or the shop backend. 2. Ads CAPI hashes email and phone on the vendor recipe; product analytics may keep email in the clear. Write both rules. 3. IP and user-agent stay plaintext on conversion APIs. 4. Consent: what fires before the CMP, what waits, what the server still sends. 5. No live HARs in tickets without redaction.

A CDP destination that fans raw email to five vendors is a legal multiplier you signed up for in a dropdown. See the engineer PII checklist. The PM still owns the yes.

Success metric and CI

1. Pick the conversion Ads Manager will optimize (usually Purchase or Lead, not PageView). 2. Define Event Match Quality or the vendor analog on that event, not on PageView. 3. Define a broken-payload budget (purchase without currency below a stated rate). 4. Require pixellint validate url and pixellint validate json on the fixtures that encode the dictionary. 5. Do not accept GTM preview alone as go-live.

The validator catches syntax. You catch intent. A green DebugView on one laptop is not a launch. See the marketer CAPI checklist for both pipes, and contract-test pixels in CI for the binary.

pixellint validate url @fixtures/meta-pixel.txt --rulepack vendor/meta
pixellint validate json @fixtures/meta-capi.json --rulepack vendor/meta-conversions-api

Check the artifact

Paste the pixel URL or JSON body into the playground. Same engine as pixellint validate. Nothing leaves the tab.