Website Analytics Detector | Tags & Pixels
Pricing
$3.00 / 1,000 website checkeds
Website Analytics Detector | Tags & Pixels
Detect exposed analytics, tag managers and marketing pixels on supplied websites. Export vendor signals for implementation reviews. HTTP-only results cannot prove tracking is absent or assess consent compliance.
Pricing
$3.00 / 1,000 website checkeds
Rating
0.0
(0)
Developer
Nick McNemar
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Inventory visible analytics tags on websites
Website Analytics Detector: Detect exposed analytics, tag managers and marketing pixels on supplied websites. Export vendor signals for implementation reviews. HTTP-only results cannot prove tracking is absent or assess consent compliance.
Start with a small example
- Open Input, switch to JSON and paste the example below. Replace the example startUrls with your own research targets when ready.
- Check the live Pricing tab and set a run spending limit.
- Run the Actor, then open the Workflow output view. Inspect
url,analytics,tagManager,advertising,marketingAutomation,error. - Export JSON for nested data or CSV for a spreadsheet. Review a small sample before increasing the scope.
{"startUrls": ["https://wordpress.org","https://www.hubspot.com","https://www.nytimes.com"],"filterTechnologies": ["Google Tag Manager","Google Analytics","Linkedin Insight Tag","Cloudflare Browser Insights","Naver Analytics","Hotjar","Mixpanel","Segment","Amplitude","Microsoft Clarity","Matomo","Plausible","Heap","FullStory","Meta Pixel","Facebook Pixel","TikTok Pixel","Pinterest Tag","Snapchat Pixel","Adobe Analytics","Piwik PRO","Fathom","Simple Analytics","Umami","Tealium","Adobe Experience Platform Launch"],"onlyMatching": false}
At the rate checked September 9, 2026, 3 saved rows cost $0.009 in Actor event fees ($3.00 per 1,000 rows). Actual returned rows determine the event fee. Taxes and other account services may be separate.
What can I use it for?
- Selling analytics, CRO and privacy tools. Find every site on a list running Google Analytics but no consent manager, or running Hotjar, or running no analytics at all, and pitch accordingly.
- Agency prospecting. Sites with Google Tag Manager installed are sites that already invest in measurement; sites without any tag manager are the ones that need help.
- Privacy and compliance audits. Inventory which third-party trackers load on a portfolio of client or subsidiary sites before a cookie-consent or GDPR review.
- Competitive research. See which measurement and experimentation stack competitors rely on.
- Market sizing. Measure the adoption of Matomo, Plausible or Fathom against Google Analytics within an industry or region.
- Enriching your data. Add
tagManager,analyticsandadvertisingcolumns to a spreadsheet of accounts in one run.
What data does it return?
One record per website:
| Field | Meaning |
|---|---|
url, finalUrl, statusCode, title | What you asked for, where it resolved to, and the page title |
matchesFilter | true when the site loads any of the tools you listed under Tools to look for |
matchedTechnologies | Which of those tools were found, e.g. ["Google Tag Manager", "Linkedin Insight Tag"] |
tagManager | Google Tag Manager, Tealium, Adobe Launch and similar |
analytics | Google Analytics, Matomo, Plausible, Mixpanel, Amplitude, Heap, Hotjar, FullStory, Microsoft Clarity and others |
advertising | Ad platforms whose tags ship in the page: LinkedIn Insight Tag, Meta Pixel, TikTok Pixel, Google Ads and similar |
marketingAutomation, liveChat | HubSpot, Klaviyo, Intercom and similar, when loaded directly |
cms, ecommerce, cdn, hosting | The rest of the stack, for context |
technologyCount | Total technologies detected |
technologies | The complete list with categories, versions and confidence scores |
error | null on success, otherwise why the site could not be checked |
Sites that time out or refuse the connection are still returned with an error, so input and output line up one to one.
Illustrative output
Values explain the output shape; they are not a live result or guaranteed field coverage.
{"url": "https://www.hubspot.com","finalUrl": "https://www.hubspot.com/","statusCode": 200,"title": "HubSpot | Software & Tools for your Business - Homepage","matchesFilter": true,"matchedTechnologies": ["Linkedin Insight Tag", "Cloudflare Browser Insights"],"tagManager": null,"analytics": "Cloudflare Browser Insights, Linkedin Insight Tag","advertising": "Linkedin Insight Tag","marketingAutomation": "HubSpot","cdn": "Cloudflare","technologyCount": 8,"technologies": [{ "name": "Linkedin Insight Tag", "categories": ["Analytics", "Advertising"], "version": null, "confidence": 100, "website": "https://business.linkedin.com/marketing-solutions/insight-tag" },{ "name": "HubSpot", "categories": ["Marketing automation"], "version": null, "confidence": 50, "website": "https://www.hubspot.com" }],"error": null}
How to use it
- Paste your domains under Websites to check, upload a file, or pass them through the API as
startUrls. - Leave Tools to look for at its defaults for a broad inventory, or narrow it to one tool —
Google Tag Manageralone, say — to build a targeted list. - Switch on Store only matching websites to pay only for the sites that load the tools you listed and discard the rest.
- Click Start and download the results as JSON, CSV or Excel from the Output tab, or read them from the dataset via the API.
Input example
{"startUrls": ["https://wordpress.org","hubspot.com","https://www.nytimes.com"],"filterTechnologies": ["Google Tag Manager", "Google Analytics", "Matomo"],"onlyMatching": false}
Raise Max concurrency for large lists. Turn on Proxy configuration only if some sites block the platform's IP range — most do not.
How detection works — and what it deliberately does not do
The detector fetches each homepage once and inspects the response headers, cookies, HTML, script sources, inline scripts and meta tags against more than 7,600 technology fingerprints. Tag managers and analytics suites are among the easiest technologies to fingerprint because their loader snippets sit directly in the page: googletagmanager.com/gtm.js, the gtag('config', …) call, snap.licdn.com for the LinkedIn Insight Tag, static.hotjar.com, cdn.mxpnl.com and so on.
What this actor does not do is execute the page's JavaScript. That is a deliberate trade-off — it is what makes the check fast and cheap — and it has one consequence you should understand before you buy: tags that a tag manager injects at runtime are not visible. If a site loads Google Tag Manager and GTM in turn fires Meta Pixel, TikTok Pixel and Hotjar, this actor reports Google Tag Manager and not the three tags behind it. Tools loaded directly in the page are reported; tools loaded through a container are reported as the container. For most prospecting and audit jobs — "which sites run GTM", "which sites run Matomo instead of Google Analytics", "which sites have no analytics at all" — that is exactly the signal you want. If you need the full runtime tag inventory of a page, you need a browser-based tool.
The fingerprint database is the open-source webappanalyzer technology dataset, used under the GNU GPL v3. The matching engine in this actor is original code.
Pricing
You pay per website saved to the dataset. With Store only matching websites on, that means per matching site; with it off, per site checked. There are no subscriptions, seats or minimums, and you can cap the maximum spend of a run before it starts.
Scope and responsible use
The actor requests only the publicly served homepage of each URL you provide, exactly as a browser would. It requires no login, no cookies and no credentials, does not crawl beyond the page you give it, does not execute scripts or fire any tracking tags itself, and does not attempt to bypass any access control or bot-protection challenge. You are responsible for using the results in accordance with the laws that apply to you and the terms of the websites you check.
Limitations
- Very large retail and media homepages that deliberately stall automated traffic can exceed the request timeout; they come back as rows with an
errorrather than being dropped. - Tags injected at runtime by a tag manager are reported as the tag manager, not individually (see above).
- Sites that load their entire interface through client-side JavaScript may expose fewer signals on the first response.
- Server-side tagging setups that proxy analytics through the site's own domain can hide the vendor.
- Only the URL you supply is fetched; tags present only on inner pages are not seen.
Something not detected?
Open an issue on this actor's Issues tab with the URL and the tool you expected. Include a reproducible input and the expected signal so the report can be investigated.
Interpret empty results and errors
A null technology field means no recognized signal was found in the inspected response; it does not prove absence. A returned error means that URL was not successfully analyzed. With onlyMatching: true, non-matches and errors are omitted from the dataset, so a zero-row result cannot distinguish an unavailable site from no matches. Start with onlyMatching: false when checking coverage.
Every saved row, including an error row, incurs the configured per-row event fee. Proxy selection and run duration can affect operating costs. Do not increase concurrency or enable a more expensive proxy merely to work around an unclear result.
For a reproducible problem, open this Actor’s Issues tab with a small public input, expected behavior and relevant error text. Remove tokens and confidential information. No response-time or uptime guarantee is offered.
Use the result in an automation
In Make or n8n, use the Apify integration to run this Actor with the same JSON input, wait for completion, then retrieve its default dataset. Route failed runs and error rows to a review step before sending valid results to your spreadsheet or CRM. Scheduling does not make these Actors emit only new records: deduplicate downstream using the source URL or record ID.
For Node.js, install the official apify-client package and set your own APIFY_TOKEN environment variable. The following example starts a paid run with a small spending limit.
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const input = {"startUrls": ["https://wordpress.org","https://www.hubspot.com","https://www.nytimes.com"],"filterTechnologies": ["Google Tag Manager","Google Analytics","Linkedin Insight Tag","Cloudflare Browser Insights","Naver Analytics","Hotjar","Mixpanel","Segment","Amplitude","Microsoft Clarity","Matomo","Plausible","Heap","FullStory","Meta Pixel","Facebook Pixel","TikTok Pixel","Pinterest Tag","Snapchat Pixel","Adobe Analytics","Piwik PRO","Fathom","Simple Analytics","Umami","Tealium","Adobe Experience Platform Launch"],"onlyMatching": false};const run = await client.actor('keystonelabs/website-analytics-detector').call(input, {memory: 512, timeout: 180, maxTotalChargeUsd: 0.10});if (run.status !== 'SUCCEEDED') throw new Error('Run did not succeed: ' + run.id);const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 100 });console.log(items);
The first 100 rows are retrieved in this example. Use the dataset API pagination for a larger result. Keep credentials out of shared inputs and source files.
A useful next step
- Website Tech Stack Detector | Bulk URL Lookup: qualify a website list by its technology. This is a separate Actor with its own input and price.
Understand the run at a glance
Open Run summary in Output for counts of unique URLs, analyzed responses, failures, matches and saved rows. It remains useful when onlyMatching produces an empty dataset. The summary is written at normal completion and does not add a billable dataset row. Failed or aborted runs may not have a final summary; check run status first. The summary contains counts only, not a second copy of scraped content.