Blog · Agency measurement
An agency Pixel Helper check is not a contract pass on the client pixel.
An ad ops manager at an agency owns the client question and the vendor login. The site that must fire the pixel belongs to someone else. They can open Events Manager, they can open Tag Assistant on a shared login, and they usually cannot open the pull request that builds the conversion worker.
Pixel Helper shows that a browser hit left the page. It shows an event name and parameters the helper understood. It does not show the server body. Meta event_time lives only on the Conversions API. A 13-digit Date.now() in that field is a batch Meta rejects, and the helper on the thank-you page stays green because the pixel never sent a clock. The client hears that the pixel works. Purchase in Ads Manager does not move.
The check that fits this job is the artifact they were actually sent. Copy the request URL from Chrome Network, preserve log across redirects, and paste it into the playground at pixellint.org. Paste the JSON the client or the partner emailed, after redacting tokens. The playground runs the same engine as the CLI. It does not log into the ad account. It tells you whether that URL and that body match the contract, which is the question an agency can answer before they ask engineering to change a trigger they do not own.
What the helper treats as a fire
A Purchase with no value and no currency still fires. The helper can show the event. Meta still wants value and currency on Purchase, on the pixel and on the server, or the optimization is a count with no money. A typo such as Purchse is a custom event. The helper shows a hit. Standard optimization does not train on it. Two base codes, theme plus GTM, are two PageViews. The helper shows both. Dedup never runs, because PageView was not given one eventID.
The browser parameter is ev on facebook.com/tr, and eventID is the fourth argument to fbq. The server field is event_name and event_id. An agency comparing a helper screenshot to a CAPI export will search the pixel for event_name and conclude the name was dropped. It was sent as ev. Equality is the string Purchase on both sides, including case. purchase and Purchase do not dedupe.
Network is the copy you paste. Filter facebook.com/tr, preserve log, and do not trust GTM preview alone. Preview can list a tag as fired while the published container never sent it, or while the request was blocked. The URL in Network is the fired artifact. The playground checks that URL. A helper overlay is a summary of it.
The JSON in the email is the other pipe
Clients forward a CAPI body from a staging worker. It often has test_event_code set, event_time in milliseconds, and a raw email because the hasher was bypassed for the demo. Test Events shows the row. Production will not, once the code is stripped, and it will reject the clock and the raw address if those stay. An agency that signs off on the staging screenshot has signed off on a body production does not send.
Ask for two artifacts: the Network URL from a published page on a clean browser, and a redacted production JSON with the test field absent. Paste both. event_id on the JSON has to equal eventID on the pixel. fbc is fb.1, then a millisecond creation time, then the fbclid. A raw fbclid in that field is a miss the helper never displays, because the helper did not build the server payload.
What an ad ops manager at an agency can change without a deploy is the ask: the event name, the test code, the value and currency, the id that must be shared. What they cannot see from the vendor UI is trigger order inside a container they do not publish, or an fbp that died on a checkout host they do not control. Say which of those the pasted artifact proved. Do not tell the client the implementation is done because the helper was green.
The two pastes
Illustrative pair. The URL is what Network shows. The JSON is what the worker posts. The helper only speaks for the URL.
https://www.facebook.com/tr?id=123456789012345&ev=Purchase&cd[value]=84.50&cd[currency]=USD
{
"data": [{
"event_name": "Purchase",
"event_time": 1759010400,
"event_id": "order-1842",
"action_source": "website",
"event_source_url": "https://shop.example/thanks",
"user_data": { "em": ["<sha256 hex>"], "fbc": "fb.1.1759010400123.AbCdEf" },
"custom_data": { "value": 84.50, "currency": "USD" }
}]
}
Paste the URL as a URL and the JSON as JSON. A 13-digit event_time on the second artifact is the failure mode the first artifact cannot reveal. A missing id on the pixel query, if the page even exposes it, is the failure mode a CAPI-only screenshot cannot reveal. You need both, or you are signing one pipe.
Redact before you paste into a ticket or the playground. Cookies, raw emails, and tokens do not belong in Slack. The playground may store what you submit. A client HAR is not a fixture. Strip it to the host, the event, the id, and the presence of a hash.
A second hit the helper will also call healthy
A noscript image is a second request to facebook.com/tr, with noscript=1. The helper can show the JavaScript event and the image. Both count until eventID ties them to one server event, and the image rarely carries that id. Two base snippets, one in the theme and one in the container, are two PageViews on every load. An ad ops manager at an agency sees a healthy helper and a PageView total that is twice the sessions. The paste that proves it is both URLs from Network, not a screenshot of the overlay.
Safari expires script-writable cookies on a short window. The _fbp the pixel set on the landing host may be gone by the time a late purchase fires. The server cannot mint a fresh fb.1 plus a random and call it the same browser. It can rebuild fbc when it stored the fbclid and the landing time in milliseconds. The middle segment is milliseconds. event_time on that payload stays in seconds. An agency does not implement that rebuild. They can look at the JSON they were sent and see a raw fbclid sitting in the fbc field, which is the miss to send back.
The same thank-you page often loads a Google tag. The client will ask for Google CAPI. There is no product by that name. The browser value is gclid on the landing query. The Conversion Linker cookie is _gcl_aw, and that cookie string is not the upload field adIdentifiers.gclid. Paste the Google hit only when the question is the Google tag. Keep it out of the Meta verdict. An agency that folds both into one green check will sign a Meta helper pass over a Google identifier they never opened.
What an agency ad ops manager can finish without the repo
- On a published page, not GTM preview, copy the facebook.com/tr URL from Network and paste it into the playground.
- Paste the redacted production CAPI body. Confirm test_event_code is absent and event_time is ten digits.
- Confirm Purchase matches Purchase, and that value and currency exist on both artifacts.
- Confirm the server event_id is the id the page was supposed to pass as eventID. If the client cannot show the fourth fbq argument, say so.
- Do not read a Pixel Helper green check as a server pass. The helper did not see event_time.
- Write the ask as fields, not as a request to rebuild the container, unless the fired URL itself is wrong.
The vendor count is still a different report
Ads Manager can show purchases while the contract check fails a second event the bidder also trains on, or the reverse: a clean pair of artifacts and a vendor total that lags because of dedup delay or a 48 hour window. The playground does not reconcile the client invoice. It reconciles the payload.
Pixellint is not affiliated with Meta. An ad ops manager at an agency can refuse to call a pixel live when the pasted URL and the pasted JSON disagree. That is the evaluation. Installing the CLI is the client engineering team's job when they have a worker repo. Until that repo exists, the website is the tool that matches the access this job actually has.
Sources
Contract pages
The dated argument is above. These pages are the field lists.