Chrome extension · Free · No Hopkin account

Let an AI agent run the tracking audit

Tag Inspector records every ad and analytics tag a page fires, decodes each one, and publishes the whole session back to the page as structured JSON: events, per-vendor counts, findings, and the conversions that were expected and never fired. Any agent that can drive a browser can read it. No MCP server, no API key, no export step.

Free and standalone · No account · No network egress · Sessions stay in your browser

window.__hopkinTagInspector page API v1.1
// Any agent driving a browser can read the audit. No auth, no export step.
const audit = await window.__hopkinTagInspector.getAudit()

{
  "events": { "total": 12 },
  "vendors": [
    { "vendor": "meta",        "eventCount": 2, "droppedCount": 0 },
    { "vendor": "ga4",         "eventCount": 2, "droppedCount": 0 },
    { "vendor": "google-ads",  "eventCount": 3, "droppedCount": 0 },
    { "vendor": "linkedin",    "eventCount": 2, "droppedCount": 0 },
    { "vendor": "segment",     "eventCount": 3, "droppedCount": 0 }
  ],
  "findings": [
    { "severity": "error",   "ruleId": "google-ads.unhashed-enhanced-conversion-data" },
    { "severity": "warning", "ruleId": "google-ads.duplicate-conversion-fire" },
    { "severity": "warning", "ruleId": "linkedin.missing-event-id" }
  ],
  // the conversions that never fired
  "coverage": { "missing": [ { "vendor": "meta", "eventName": "Lead" } ] },
  "redacted": true
}

Dogfood

We ran it on our own site

One recording of one lead form. Four things were wrong, and none of them were throwing an error anywhere. A conversion that never fires produces no alert, just a smaller number in a report nobody questions. Here is the session as the audit reported it.

One form submit, and what each vendor recorded
meta PageView recorded
meta SubscribedButtonClick recorded
meta Lead — not fired —
ga4 lead conversion recorded
google-ads conversion recorded ×3
linkedin conversion recorded ×2
segment track recorded

Every vendor on the page saw the submit except one. Meta saw the click and not the conversion, while two other vendors counted the same submit more than once.

error meta

The lead form was invisible to Meta

The Meta pixel fired PageView and SubscribedButtonClick on the form page, and nothing else. No Lead event ever reached the wire, while GA4, Google Ads, LinkedIn and Segment each recorded the same submit.

The pixel was installed correctly and reported healthy. It was the conversion that was missing Meta had been optimizing delivery against an event it had never once seen.

warning google-ads · linkedin

One submit counted three times

A single form submit fired the Google Ads conversion three times and the LinkedIn conversion twice. Both platforms had been reporting roughly triple and double the leads we actually got.

Neither conversion carried an event ID, so server-side deduplication had nothing to match on: the duplicates could not be collapsed after the fact, only stopped at the source.

error google-ads · segment

A plaintext email address left the page

The submitted email address reached Google Ads as readable text rather than a hash. It also rode along on the Segment call as properties.Email, which fanned it out to every destination connected to that source, not just the one we were looking at.

Tag Inspector redacts personal data in its own output by default; it flagged the payload without reproducing it, which is exactly the behavior we wanted while investigating.

warning google-ads

The conversion had no price on it

The Google Ads conversion carried no value and no currency. Every lead was worth the same nothing to the bidder.

Value-based bidding and any reported ROAS had nothing to work with, and no dashboard says so and no dashboard flags it, because an unpriced conversion looks identical to one worth zero.

We fixed all four. The missing Lead event now fires on submit, the duplicate conversions were traced back to a tag firing on more than one trigger and reduced to one fire each with an event ID attached, the email address is hashed before it leaves the page and no longer travels as a Segment property, and the conversion carries a value and a currency.

The extension found them. Fixing them was still our job. Tag Inspector is a debugging and audit tool: it does not touch your tags, your containers or your site. Its whole output is a report.

Built for agents

Four calls, from the page itself

The API is installed on the page while a recording is running, so an agent can start a session, drive the flow through the DOM, and read the result without a human ever opening DevTools or clicking a button in an extension panel it cannot reach.

getAudit(options?)

The whole session in one object: session summary, environment, per-vendor inventory, event counts, findings, coverage, consent and pages. Narrow it with scope and severity.

queryEvents(filter?)

Individual decoded events with the findings anchored to each one, filtered by vendor, event name, page or timestamp.

startRecording(options?)

Begins a session on the current tab. Idempotent by default, so “make sure something is recording” is safe to call more than once.

status()

Whether anything is recording on this tab, which session, and from which origin. Answers honestly when nothing is, and never throws.

Two things are deliberately absent. There is no stopRecording: a session ends when the tab closes, and a third-party ad script running on the page must not be able to stop the recording that is watching it. And there is no way to switch off redaction from the page. Un-redacting a session is a per-session choice a human makes in the panel, so an agent can never talk the extension into handing over personal data.

Coverage

Seventeen vendors, decoded

Every beacon is captured from the first request, paired back to the JavaScript call that made it, and judged against rules that know how each vendor actually behaves. A call that was made but never reached the network shows up as exactly that, rather than as silence.

Meta Pixel Google Analytics 4 Google Ads Google Tag Manager LinkedIn Insight Tag Microsoft Advertising Reddit Snapchat Pinterest TikTok ChatGPT Ads Segment RudderStack Freshpaint PostHog Amplitude Mixpanel

Where your data goes

Nowhere

There is no server, no account and no network egress of any kind. The extension observes; it does not phone home.

Local storage only

Sessions are written to IndexedDB in your own browser and survive a restart. Exporting one is something you do on purpose, to a file you choose.

Redacted by default

Email addresses, phone numbers, names, street addresses and card or ID numbers in captured payloads are replaced with stable tokens. Showing the real values is a deliberate, per-session choice made in the panel.

Read-only by construction

It watches tags and reports on them. It cannot change a tag, a container, a consent setting or anything else on the page it is auditing.

Point an agent at your checkout

Install it, start a recording, and let the agent read what came back. Our paid MCP servers, which put your ad accounts inside your AI assistant, are a separate product from this one.