Chrome extension · Free · No Hopkin account
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
// 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
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.
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.
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.
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.
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.
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
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.
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.
Individual decoded events with the findings anchored to each one, filtered by vendor, event name, page or timestamp.
Begins a session on the current tab. Idempotent by default, so “make sure something is recording” is safe to call more than once.
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
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.
Where your data goes
There is no server, no account and no network egress of any kind. The extension observes; it does not phone home.
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.
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.
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.
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.