How IsPixelWorking checks your tracking

IsPixelWorking loads your page in a real browser, watches what your ad tracking sends, and turns that into a report. This page explains exactly what we do, what we do not do, and where the limits are. If something in a report surprises you, this is the place to understand why.

The short version

The browser runs

The free check is two separate visits, A and B, each in a fresh browser with no cookies from the other. Both start at the same time, so a whole check usually takes under a minute. Monitoring plans add run C, on a phone.

Run A: first visit, no interaction (desktop). We load the page on a desktop-sized screen and wait until it settles (up to about 8 seconds). We do not touch anything. This shows what your tracking does before a visitor has answered the cookie banner. It is the basis for "fires before consent" findings. We also take a screenshot.

Run B: arriving from an ad, consent accepted, then button clicks (desktop). We load the page again with test click IDs added to the URL, exactly as an ad click would add them:

We find the cookie banner and click its "accept all" button, then wait a few seconds. This shows what your tracking does once a visitor has agreed. We then check whether your site stored the click IDs in its cookies (for Meta: whether the _fbc cookie contains our test value). Finally we look for call-to-action buttons (such as "Contact us", "Book a call", "Get started") and click up to six of them, recording which tracking events each click sends. If a button opens another page of your site, we also check that the click ID survived the navigation.

Run C: on a phone (monitoring plans). Monitoring plans add a third visit on a phone-sized screen with a mobile browser identity and touch input, also arriving with test click IDs. We accept the cookie banner, check the click IDs, follow one internal link and click up to four buttons on the mobile layout. Because most ad traffic is mobile, we compare which buttons send events on mobile and on desktop, and whether the mobile cookie banner works. In the free check, these mobile checkpoints are shown as "included in monitoring plans".

The test values are obviously fake. Since we stop all requests to ad platforms (see below), they never reach your ad accounts.

We stop tracking data from reaching ad platforms

Checking your tracking should not pollute your ad data. So in every run:

Known limitations of this protection:

What we never do

Button clicks are observations, not verdicts

The report shows which events fired when we clicked each button, for example "Contact us → Lead" or "+48 600… → nothing". We do not grade this. We do not know which actions you count as a conversion, and real conversions usually happen after a form is submitted, which we never do.

Verifying that your leads and sales actually reach Meta needs data from your ad account. That is coming next.

How we handle cookie banners

We recognize the cookie consent tools below and click their "accept all" button directly:

Consent tool
Cookiebot OneTrust Usercentrics
CookieYes Complianz Iubenda
Didomi Termly Osano
TrustArc Axeptio consentmanager.net
Sourcepoint Quantcast Choice / InMobi Choice CookieFirst
Borlabs Cookie Klaro Cookie Script
Shopify customer privacy banner Consentmo (Shopify app) Framer cookie banner
Finsweet Cookie Consent / Consent Pro (Webflow) Squarespace cookie banner Wix cookie banner
Google Funding Choices (Privacy & messaging) Cookie Information FastCMP
Ketch

If your banner is not on this list, we look for a cookie notice on the page and for a button whose text clearly means "accept" (in several languages), and click it.

If we find a banner but cannot operate it, we say so ("Cookie banner could not be operated automatically") and skip the checks that depend on consent instead of guessing. This can happen separately on desktop and mobile. We also never report "does not fire after consent" as critical unless we actually managed to accept your banner.

Where the browser runs

The browser runs on Cloudflare's network in the EU. The exact country can vary from check to check, and every report shows the country the check ran from. If the browser does not end up in the EU, we retry or fail the check rather than run it from elsewhere.

We run from the EU on purpose: many sites only show a cookie banner, or only hold back tracking, for EU visitors. A visitor in another country may see different behaviour.

The browser identifies itself honestly as an automated checker (its User-Agent includes IsPixelWorking/0.1). See our bot page for details and how to opt out.

How findings are scored

Each finding has a severity. The score starts at 100 and each finding subtracts points according to its severity. Any critical finding caps the grade, and the score with it.

When there is no grade. A grade says "we watched this tracking work, and this is how well it works". We only give one when we actually saw enough:

In these cases the report still lists everything we did observe, marked as a partial check. If the visit was only cut short during button clicks, we grade it and say that button coverage was partial.

The score is not a share of conversions kept or lost. It ranks how serious the problems we saw are.

Severity Points off
critical 35
high 15
medium 7
low 2
info 0

Every check starts at 100. Grades: A ≥ 90, B ≥ 75, C ≥ 60, D ≥ 40, F ≥ 0. Any critical finding caps the grade at D, and the score at the top of that range. Checks without enough coverage get no grade (see below).

What we check

Finding Severity What it means
No Meta Pixel found (meta.pixel_missing) info We did not see a Meta Pixel on this page. If you run Meta ads to it, Meta cannot attribute conversions or optimize delivery for this page.
Meta Pixel fires before cookie consent (meta.fires_before_consent) critical The pixel sent data while the cookie banner was still waiting for an answer. For EU visitors this is a likely privacy problem (we report behaviour, not legal compliance), and it often means the consent setup is not wired to your tags at all.
Meta Pixel does not fire after consent (meta.not_firing_after_consent) critical The pixel script is on the page, but no events were sent after cookies were accepted. Meta receives nothing from this page, so ads optimize blind and conversions go unreported.
Duplicate Meta events (meta.duplicate_pixel) high The same event was sent twice for the same pixel within a second, usually because the pixel is installed twice (for example in site code and in Google Tag Manager). Duplicates inflate reported results and confuse Meta's optimization.
Meta events have no event ID (meta.missing_event_id) high Without an event ID, Meta cannot match browser events with server (Conversions API) events, so the same conversion may be counted twice or dropped.
TikTok events have no event ID (tiktok.missing_event_id) high Without an event ID, TikTok cannot match browser pixel events with server (Events API) events, so the same conversion may be counted twice and campaigns optimize on inflated numbers.
Click ID from Meta ads is not stored (meta.fbc_not_set) high When a visitor arrives from a Meta ad, the fbclid in the link should be saved in the _fbc cookie. Without it, Meta loses the link between the ad click and the conversion, which lowers match quality and reported results.
Mobile buttons are tracked differently from desktop (meta.mobile_cta_tracking_mismatch) medium A button that sends an event on desktop does not send it on mobile (or the other way round). Most Meta ad traffic is mobile, so conversions may be missing where they matter most.
Click ID saved by your site code in a non-standard format (meta.custom_fbc_format) medium Your site stores the Meta click ID in its own cookie, but not in the format Meta expects (fb.1.
Two different browser IDs (_fbp) (meta.conflicting_fbp) medium Two _fbp cookies with different values exist. The pixel and your server code may send different browser IDs for the same visitor, which weakens matching between browser and server events.
More than one Meta Pixel (meta.multiple_pixels) low Several different pixel IDs are active. This is fine if intended (e.g. agency and client), otherwise data is split.
No advanced matching (meta.no_advanced_matching) low Events carry no hashed customer data, which lowers Meta's event match quality.
No server-side tracking detected (general.server_side_not_detected) info We saw no sign of server-side tracking (Conversions API, server-side GTM). Server-to-server traffic is invisible from a browser, so this is not proof it is absent.
Server-side tracking detected (general.server_side_detected) info We saw signs of server-side tracking. We cannot see server-to-server traffic, so we cannot tell whether it works.
The site blocked our checker (general.blocked_by_site) n/a The site refused automated access, so we could not check it and show no grade.
Cookie banner could not be operated automatically (general.cmp_not_operable) info We found a cookie banner but could not accept it automatically, so checks that depend on consent were skipped rather than guessed.
Purchase events were not tested (general.purchase_events_not_tested) info We found buy or add-to-cart buttons but never click them on sites that have not been verified, to avoid creating carts or fake conversions.
Button testing stopped early (general.cta_coverage_partial) info After a click we saw a request that looked like a tracking event sent to the site's own server. To avoid feeding test events into ad accounts, we stopped clicking.
Tracking through the site's own domain (general.first_party_tracking_detected) info Requests to the site's own domain looked like tracking events (heuristic). This usually means server-side tagging.

Some findings are marked as possible. These come from heuristics (for example, matching buttons between desktop and mobile by their text) and are more likely to be wrong than the others.

Server-side tracking

Server-to-server traffic (for example the Meta Conversions API sending events from your server) is invisible from a browser. We look for signs of server-side tracking, such as known Conversions API tools, server-side Google Tag Manager, tracking requests to your own domain, or ad click IDs that your site code saves in its own cookies (for Meta and TikTok), and report "detected" or "not detected". We never say that your Conversions API works or is broken: we cannot see it. When we see such signs, missing event IDs on Meta or TikTok events count as high severity, because without them the platform cannot deduplicate browser and server events.

Known limitations

What we do not do