Free tool Analytics script size: measured, not copied from marketing pages
Every analytics vendor says its script is light. We downloaded each one from its public URL on the same day and counted the bytes: uncompressed, gzip, Brotli and what Chrome receives. The table lists the date and the exact URL so you can check it yourself — and the box below measures any script you paste.
- Measured 2026-11-10
- 10 scripts, exact URLs
- Your script stays in the browser
Download size of analytics scripts
Sorted by gzip size. TapCub is highlighted because it is ours; its number comes from the same measurement as everyone else's.
Measured script sizes
Each file was downloaded with curl three times: asking for no compression, for gzip, and for Brotli. “Chrome gets” is the encoding and size the server chose for Chrome's usual Accept-Encoding header.
| Script and URL | gzip | Brotli | Chrome gets | Uncompressed | JS files |
|---|---|---|---|---|---|
| Plausible (script.js)plausible.io/js/script.jsThe classic script URL, still served. | 1,283 B | 1,271 B | 1,361 Bzstd | 2,841 B | 1 |
| Fathomcdn.usefathom.com/script.js | 2,090 B | 2,100 B | 2,283 Bzstd | 6,981 B | 1 |
| Plausible (pa-….js)plausible.io/js/pa-6_srOGVV9SLMWJ1ZpUAbG.jsThe per-site script plausible.io loads on its own website; the size depends on the options enabled. | 2,487 B | 2,493 B | 2,658 Bzstd | 5,972 B | 1 |
| TapCub1.0.5static.pathclue.com/client.jsCore script. The extensions in the next table load only when their feature is switched on. | 2,852 B | 2,828 B | 2,970 Bzstd | 5,631 B | 1 |
| Umami Cloudcloud.umami.is/script.js | 4,134 B | 4,334 B | 4,334 Bbr | 9,246 B | 1 |
| Simple Analyticsscripts.simpleanalyticscdn.com/latest.js | 4,860 B | 4,895 B | 5,147 Bzstd | 9,611 B | 1 |
| Cloudflare Web Analyticsstatic.cloudflareinsights.com/beacon.min.jsBrotli was not offered in this test. | 10,264 B | not offered | 10,264 Bgzip | 31,853 B | 1 |
| Matomo (matomo.js)5.14.2cdn.jsdelivr.net/gh/matomo-org/matomo@5.14.2/matomo.jsThe file shipped in the 5.14.2 release, fetched through jsDelivr's GitHub mirror. Self-hosted: compression depends on your server, and plugins can add scripts. | 22,178 B | 19,293 B | 19,293 Bbr | 68,294 B | 1 |
| Microsoft Clarity (clarity.js)0.8.77scripts.clarity.ms/0.8.77/clarity.jsLoaded by a per-project tag (www.clarity.ms/tag/…, not measured), which then loads this file; further modules load on demand. | 26,564 B | 25,350 B | 25,350 Bbr | 73,892 B | 2 |
| PostHog (array.js)us-assets.i.posthog.com/static/array.jsFull library. Recordings, surveys and other extensions load as separate files when enabled. | 120,880 B | 121,277 B | 121,115 Bbr | 376,161 B | 1 |
Bytes are what crosses the network for the script file itself. Collection requests (the hits sent back) are not counted, and “JS files” counts only scripts downloaded on a default install. Some CDNs compress on the fly at a fast setting, which is why Brotli is occasionally larger than gzip.
Not listed: Google Analytics 4 (gtag.js), Google Tag Manager, Baidu Tongji, 51.la and Mixpanel. On the measurement day our connection to googletagmanager.com, hm.baidu.com, sdk.51.la and cdn.mxpnl.com was reset, and gtag.js, gtm.js and hm.js are generated per site ID anyway, so there is no single checkable number. Use the box below to measure the one on your own site.
TapCub extensions that load on demand
A default TapCub install downloads only the 2,852 B gzip core. These files are added only when you switch the feature on, measured the same day.
| File | gzip | Brotli | Uncompressed | Loaded when |
|---|---|---|---|---|
| client-id-1.0.5.js | 3,003 B | 3,044 B | 6,443 B | Identification, a consent requirement or autocapture is on for the site |
| client-auto-1.0.5.js | 2,541 B | 2,568 B | 5,418 B | Autocapture is on (plan and site setting) |
| client-attr-1.0.5.js | 1,166 B | 1,136 B | 2,321 B | The snippet carries data-attribution |
| client-replay-1.0.5.js | 1,297 B | 1,268 B | 2,274 B | Session replay is on |
| client-rec-1.0.5.js | 23,683 B | 24,378 B | 77,145 B | A session is sampled for replay (the rrweb recorder) |
The live chat widget is a separate script and is not included here.
Measure your own script
Paste a script, or enter its URL and press the button. The size and gzip size are computed in your browser with CompressionStream (the browser's default gzip level, so a few per cent off a server's). Brotli cannot be computed in the browser.
Fetching sends one request from your browser straight to that address, without cookies. It only works if the server allows cross-origin requests; otherwise open the URL and paste the code.
Nothing you paste leaves this page.
Uncompressed
—
gzip
—
gzip (KB)
—
gzip ÷ raw
—
Version v1.0Updated Update history
What script size does and does not tell you
Bytes are easy to compare. What they cost a page depends on how and when the script runs.
gzip and Brotli
The compressed size is what the visitor downloads. A few kilobytes either way is rarely noticeable on its own; tens of kilobytes on a slow mobile connection are.
Uncompressed size
The browser has to parse and run the uncompressed code on the main thread. That cost grows with the raw size and with what the script does at start-up, and it shows up in interaction responsiveness rather than in download time.
JS files
Each extra file can mean another request, and a script on a different domain needs its own connection. A small loader that fetches a large file costs both.
Async loading
Analytics snippets normally load with async or defer, so they do not block the first render. Size still matters on pages that are already heavy, and on low-end phones.
These are file sizes, not page-speed scores. To see the effect on your own pages, compare Core Web Vitals with and without the script, or look at it in your browser's network and performance panels.
Compare, then measure your own
The table is a starting point; your site's snippet is what counts.
-
1
Pick the column that matches your question
gzip or Brotli for download size, uncompressed for parse and run cost, JS files for extra requests.
-
2
Check the URL and date
Each row links to the exact file measured. If the vendor shipped a new version since, the size has probably changed.
-
3
Measure the script on your site
Copy the analytics script URL from your page source and fetch it above, or paste its code. Per-site scripts such as gtag.js can only be measured this way.
How the sizes were measured
One machine, one day, public URLs, no cache. The commands are simple enough to repeat.
- Uncompressed:
curl -H "Accept-Encoding: identity", bytes of the body - gzip / Brotli:
Accept-Encoding: gziporbr, bytes actually sent by the server (not recompressed by us) - Chrome gets:
Accept-Encoding: gzip, deflate, br, zstd; the server picks the encoding - TapCub's live file is byte-for-byte the same as the 1.0.5 build in our repository; its gzip size matches our build-time size check
| Column | Request header | What it shows |
|---|---|---|
| Uncompressed | Accept-Encoding: identity | Code the browser parses and runs |
| gzip | Accept-Encoding: gzip | Download for older clients and many proxies |
| Brotli | Accept-Encoding: br | Download where Brotli is offered |
| Chrome gets | gzip, deflate, br, zstd | What a current Chrome downloads (zstd where supported) |
| JS files | — | Script files on a default install, not counting hits |
Reading three rows
How to read the numbers for a small, a medium and a large script from the table.
| Script | gzip | Uncompressed | Reading |
|---|---|---|---|
| Plausible script.js | 1,283 B | 2,841 B | Smallest download in the table; does little at start-up |
| TapCub client.js | 2,852 B | 5,631 B | Core only; SPA tracking and Web Vitals included, extensions on demand |
| Matomo matomo.js 5.14.2 | 22,178 B | 68,294 B | Full tracker API in one file; served from your own server |
A script that does more (SPA tracking, performance metrics, heatmaps, replay) is larger for a reason. Compare scripts that do the same job, or add up a vendor's optional files for the features you need.
Where size comparisons mislead
Four traps in “our script is only X KB” claims.
Counting only the loader
Some snippets download a small tag that then fetches the real library. Count every file a default install loads.
Comparing raw with gzip
Marketing pages mix uncompressed and compressed sizes. Compare the same column for every script.
Trusting an old number
Scripts change with every release. A size without a date and a URL cannot be checked.
Treating size as speed
A small script that runs heavy work at start-up can hurt responsiveness more than a larger one that idles. Measure Web Vitals on your pages.
A small core, features loaded when you use them
The TapCub snippet loads analytics first and fetches the rest only when a feature is on for your site.
Async core snippet
One script loaded asynchronously; single-page-app navigation is tracked without extra code.
Learn moreWeb Vitals in the same report
Real-user LCP, INP and CLS by page, so you can see whether any script — ours included — slows a page.
Learn moreNo cookie, no local storage
By default the script writes nothing to the browser.
Learn moreAnalytics script size FAQ
Still have a question?
Chat with the team behind TapCub — we usually reply within a few hours on business days.
How big is the Google Analytics 4 script?
We did not get a reliable measurement on the test day, and gtag.js is generated per measurement ID, so its size depends on your configuration. Open your page source, copy the gtag.js URL and fetch it with the tool above to measure the one your visitors download.
Does an analytics script slow down my site?
An async analytics script does not block the first render, but it still uses bandwidth and main-thread time. The larger and busier the script, the more it can affect responsiveness on low-end phones. Compare Web Vitals with and without it.
How big is the TapCub tracking script?
The core client.js measured 2,852 bytes gzip (5,631 uncompressed) on 2026-11-10. Extensions for identification, autocapture, attribution and session replay download only when those features are switched on — sizes are in the second table.
Why is Brotli sometimes larger than gzip here?
We record what the server actually sent. Some CDNs compress on the fly with a fast Brotli setting, which can come out slightly larger than a gzip file compressed ahead of time.
Why not measure with my browser's network panel?
You can: the “transferred” size there is the same idea as our “Chrome gets” column. It includes response headers, so it is a little larger than the body size in the table.
Is the smallest script the right choice?
Only if it does what you need. Session replay, heatmaps and product analytics need more code. Decide on features first, then compare scripts that cover them.
Update history
New features, fixes and data refreshes for this tool, newest first.
-
· v1.0
LaunchedFirst release.
Data this tool relies on
- Measured analytics script sizes — checked 2026-11-10, reviewed every 3 months (next review by 2027-02-10)
Missing something or found an error? Tell us — requests that come up often go into the next update. All tool updates
Check what the script costs on your own pages
Measure your snippet, then watch Web Vitals on the pages that matter.