Last updated: 4 November 2026
TagLens is a developer diagnostic tool. It records the analytics activity of a web page you are visiting so you can see what your tracking did and did not send. This policy describes exactly what it handles and where that data goes.
TagLens does not have a server. Nothing it records is transmitted anywhere unless you ask the AI analysis feature a question (below). There is no account and no login, and no third party receives any of it. Everything the extension captures stays in your own browser's storage on your own machine.
TagLens asks you one question about itself, once: whether it may count you as a user. If you say yes, it sends Google Analytics up to six small requests a day, one per feature you used — the feature and the version — and nothing about any site. If you say no, or never answer, it sends nothing. See Being counted below.
Beyond that count, the only other thing that can leave your machine is a feature you switch on yourself: AI analysis, which lets you put questions about a recording to an AI model using your own API key. When you use it, TagLens sends that model a fact sheet about the recording — event names, how many times each fired, whether each reached Google Analytics, the findings on the report, and the values the site put in its data layer — page types, placements, search terms, product names and the like. It does not send a person's identifiers: parameters that identify someone — email, phone, user, account, session and device ids, addresses, and anything shaped like one — are listed by name only, and their values never leave your machine. Nothing is sent until you type a question, and nothing at all is sent if you never connect a key. The key is stored in your browser's local storage and is shown back to you only as its last four characters.
TagLens is a diagnostic tool, so a small amount of it has to be in place before you decide to record — otherwise pressing record would always miss the beginning of the page, which is the part being diagnosed. On every page you open, in every frame, whether or not you are recording, TagLens:
dataLayer in the page so that a push made in the first
milliseconds of a page load is not lost.data-tag-assistant-prod-present, on the page's root
element. This switches on a reporting channel that Google's own tag already carries and that
Google's Tag Assistant uses. It makes the tag write down, in the page, each event it sends, which is
what lets TagLens tell apart events that leave together in a single batched request. The attribute has
to be in place before Google's tag starts, and Google's tag reads it exactly once, so it cannot be
switched on only when you press record.
One thing happens outside the page, and it is worth stating plainly. Chrome hands an extension that is allowed to read requests a copy of every analytics request any tab sends, headers included, before that extension gets to decide whether it wants it. TagLens looks at each one to see whether it is a tracking request at all, and on a tab you are not recording it is dropped without being stored, shown or counted. There is no way to ask Chrome for one tab's requests only; the choosing has to happen after they arrive.
Apart from that, nothing about the page or about you leaves a tab you have not recorded. Two things are worth stating precisely, because "not recording" is not quite the same as "never recorded":
While you are recording, and only on the tab you are recording, TagLens captures:
dataLayer pushes made by the page, including their contents. When
recording starts, up to the last 300 entries already sitting in the page's dataLayer are
read as well, marked as having happened before recording began, because they are the part of the page
load you pressed record to see.Because analytics payloads are the subject of the tool, a recording will contain whatever the site under test chose to put into them. On some sites that can include identifiers such as a user or account ID. TagLens surfaces this to you — that is frequently the defect being looked for — but it does not extract, separate, or transmit it.
Recordings are kept in a database called taglens in your browser's own IndexedDB storage.
Your settings, saved journeys and comparisons are kept in chrome.storage.local, and the
recording in progress is mirrored into chrome.storage.session so that Chrome shutting the
extension down mid-session cannot lose it. All three are areas of your own browser profile on your own
device. The unlimitedStorage permission is requested so that a long recording is not silently
truncated.
A recorded session is a draft until you press save this session. A draft is written to disk as it goes — so that closing your browser or Chrome suspending the extension cannot lose it mid-session — but it is not kept. It is discarded when you close the last TagLens view, once the recording it came from has finished. A draft whose tab you still have open is not thrown away underneath you; it waits, and goes the next time you close TagLens after that tab is gone.
A session you save with that button is kept until you delete it or remove the extension. Recordings made before saving existed are kept for 30 days. Recordings a saved journey was cut from, and journeys used as a comparison baseline, are kept for as long as the thing that refers to them. A recording made by replaying a journey is shown as saved, because you asked for the run; it is kept while the journey still refers to it, and otherwise ages out with the rest. Once there are more than a hundred recordings the oldest go first, counting only the ones you did not save yourself — what you saved is not deleted to make room.
Uninstalling the extension removes them with it. TagLens has no ability to recover a recording once deleted, because it never held a copy.
TagLens makes exactly three kinds of outbound network request in its entire codebase. The second happens only if you connect a key to the AI analysis feature, and the third only if you answered yes to being counted (see Being counted below).
While you are recording, when it detects that the page has loaded a Google Tag Manager container, it
performs a single GET for that container's public definition in order to determine which tags
should have fired. Where TagLens saw the page request the container, it fetches that same URL —
the identical URL the page itself has already requested, on whichever host the page loaded it from:
usually googletagmanager.com or the site's own server-side Tag Manager domain. Where the page
holds a container TagLens never saw requested (a container loaded through a first-party loader path), it
fetches the container's public definition from the URL the page's own script tag names, or failing that
from googletagmanager.com by the container's public id. No data is sent with that request and
no cookies or credentials are attached to it. On a tab you are not recording, this request is not made at
all.
The second is the AI analysis feature. With a key you have connected, TagLens sends your question and the fact sheet described above to the endpoint you chose — Google AI Studio, or another OpenAI-compatible endpoint you name — and shows you the answer. That request carries your key and nothing about you or your browser beyond the fact sheet. What the provider does with what it receives is governed by that provider's terms; on Google's free tier, for example, Google states that content may be used to improve its products, and TagLens says so on the screen where you connect. No question is sent until you ask one. When a question needs a row the fact sheet does not carry, the model may ask TagLens for rows by event name and time window; TagLens answers with at most twenty rows per request, a few requests per question, each row scrubbed by the same rules as the fact sheet, and the answer's footer names every lookup it made.
The ask ChatGPT button on the header (the same press as for ChatGPT in the export menu) saves the raw export on your device — every recorded event with its full payload, values as recorded, the same file as the json export — and opens chatgpt.com with TagLens's reading instructions typed into the message box; you attach the file there yourself. It exists so you can ask about your own recording without connecting a key. TagLens sends nothing; the file leaves your device only when you upload it, under that service's terms.
There is no other fetch, no XMLHttpRequest, no sendBeacon and no
WebSocket anywhere in the extension.
The Chrome Web Store can say how many people installed TagLens; it cannot say how many open it. So TagLens asks you, once, on its live screen: Count you as a TagLens user? Nothing is sent until you answer count me. No sends nothing, and so does never answering. You can change your answer at any time under view ▾ › settings › count me as a user.
If you said yes, then the first time each day you do one of six things — open TagLens, start a recording, see what a container expects, replay a flow, ask the AI, or export — TagLens sends one small request to Google Analytics, to a property that belongs to TagLens. It carries:
tl_open, tl_record, tl_container,
tl_replay, tl_ask, tl_export);It never carries the site, its address, an event, a parameter, a value, a payload, a recording, or anything typed. The same feature is sent at most once a day, so the numbers mean people who did this today, not how often. Google receives the request from your connection, as it does any request to Google; TagLens reads only the counts, uses them for nothing but knowing how many people use TagLens and which parts, and does not sell or share them. If a later version ever changes what is sent, it asks the question again before sending anything new.
eval, no new Function, and no remotely-loaded code. All
code that runs is the code reviewed and shipped in the package.The debugger permission is granted when you install TagLens, and Chrome shows it to you at
that moment. It cannot be made optional: Chrome refuses to accept debugger in an extension's
optional_permissions and silently drops it, which is why an earlier version of TagLens that
tried to ask for it only on demand had a replay button that could never work.
It is used for one thing: re-driving a recorded journey when you press replay. TagLens opens a new window of its own for the replay and attaches the debugger only to the tab inside it, for the length of that run, detaching when the run ends or is stopped. It is never attached to a tab you are browsing in, and never while you are recording by hand or reading a recording back. A replay is itself recorded, in the separate window, so for the length of a replay TagLens is both recording and attached — to the window it opened, never to yours.
While the debugger is attached, Chrome displays its own banner across the top of the tab saying TagLens is debugging it. If you would rather not grant it, the only way to decline is not to install the extension — but nothing is sent anywhere either way; see “What TagLens never does” above.
Questions about this policy: hnkhan123.hk@gmail.com