Many website owners add analytics scripts without fully understanding what actually runs in the browser. To highlight the difference, let's compare two analytics approaches: Queantic — a minimalist tracking pixel — and Plausible, a popular lightweight analytics script.
Queantic: 96 Bytes of Tracking
Queantic uses a remarkably simple technique to track pageviews and user visits — just a single image tag with an onerror attribute. Here is the entire snippet you add to your site:
<img onerror=src='//qntc.it/t/586c45fa?'+location src>
Here’s what happens when a browser encounters this tag:
-
The browser tries to load the image, but the
srcattribute is left empty on purpose, causing it to fail instantly. This failure isn't a mistake — it's a trick to activate the next line of logic while keeping the code extremely short. -
The
onerrorhandler runs as a result. It dynamically sets a newsrcthat points to our tracking endpoint, appendinglocation— which is JavaScript shorthand for the current page’s full URL. This captures where the hit came from without any extra setup. -
The updated
srctriggers a second image load — this time successfully — and silently sends your visit data to the tracking server. The closingsrcat the end finalizes the tag structure and ensures it's valid HTML. No scripts, no bloat — just 96 bytes of precision.
This approach results in an extremely lightweight tracking footprint — under 100 bytes — without any additional JavaScript or complex logic.
Plausible: What’s Really in script.js
On the surface, Plausible appears simple. You add a single script tag to your HTML, like so:
<script defer data-domain="yoursite.com"
src="https://plausible.io/js/script.js"></script>
But beneath this innocuous line lies a full-fledged analytics engine consisting of over 200 lines of JavaScript, executing every time a visitor loads your page. Here’s a unminified snapshot of what Plausible’s script does:
(function () {
const locationInfo = window.location;
const documentInfo = window.document;
const currentScript = documentInfo.currentScript;
const config = {};
let isPaused = false;
let currentURL = locationInfo.href;
let customProps = {};
let lastScrollDepth = -1;
let visibleStart = 0;
let accumulatedVisibleTime = 0;
function sendEvent(endpoint, data, options) {
if (window.fetch) {
fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "text/plain" },
keepalive: true,
body: JSON.stringify(data)
})
.then(response => {
if (options?.callback) {
options.callback({ status: response.status });
}
})
.catch(error => {
if (options?.callback) {
options.callback({ error });
}
});
}
}
function sendEngagement() {
const engagementTime = getEngagementTime();
if (!isPaused && (lastScrollDepth < maxScrollDepth() || engagementTime >= 3000)) {
lastScrollDepth = maxScrollDepth();
const payload = {
n: "engagement",
sd: Math.round((lastScrollDepth / scrollHeight()) * 100),
d: config.domain,
u: currentURL,
p: customProps,
e: engagementTime,
v: 20
};
visibleStart = 0;
accumulatedVisibleTime = 0;
sendEvent(config.endpoint, payload);
}
}
function handleVisibilityChange() {
if (document.visibilityState === "visible" && document.hasFocus() && visibleStart === 0) {
visibleStart = Date.now();
} else if ((document.visibilityState === "hidden" || !document.hasFocus()) && visibleStart) {
accumulatedVisibleTime += Date.now() - visibleStart;
visibleStart = 0;
sendEngagement();
}
}
function getEngagementTime() {
return visibleStart ? accumulatedVisibleTime + (Date.now() - visibleStart) : accumulatedVisibleTime;
}
function scrollHeight() {
const body = document.body || {};
const html = document.documentElement || {};
return Math.max(
body.scrollHeight || 0,
body.offsetHeight || 0,
body.clientHeight || 0,
html.scrollHeight || 0,
html.offsetHeight || 0,
html.clientHeight || 0
);
}
function maxScrollDepth() {
const body = document.body || {};
const html = document.documentElement || {};
const viewportHeight = window.innerHeight || html.clientHeight || 0;
const scrollTop = window.scrollY || html.scrollTop || body.scrollTop || 0;
return scrollHeight() <= viewportHeight ? scrollHeight() : scrollTop + viewportHeight;
}
function trackEvent(eventName, options = {}) {
const isPageview = eventName === "pageview";
if (
/^localhost$|^127(\.[0-9]+){0,2}\.[0-9]+$|^\[::1?\]$/.test(locationInfo.hostname) ||
locationInfo.protocol === "file:" ||
window._phantom || window.__nightmare || window.navigator.webdriver || window.Cypress ||
window.__plausible
) {
return skipEvent(eventName, options, "ignored environment");
}
try {
if (localStorage.plausible_ignore === "true") {
return skipEvent(eventName, options, "localStorage flag");
}
} catch (e) {}
const payload = {
n: eventName,
v: 20,
u: locationInfo.href,
d: config.domain,
r: documentInfo.referrer || null
};
if (options.meta) payload.m = JSON.stringify(options.meta);
if (options.props) payload.p = options.props;
if (options.interactive === false) payload.i = false;
if (isPageview) {
isPaused = false;
currentURL = payload.u;
customProps = payload.p || {};
lastScrollDepth = -1;
accumulatedVisibleTime = 0;
visibleStart = Date.now();
if (!engagementTrackingInitialized) {
document.addEventListener("visibilitychange", handleVisibilityChange);
window.addEventListener("blur", handleVisibilityChange);
window.addEventListener("focus", handleVisibilityChange);
engagementTrackingInitialized = true;
}
}
sendEvent(config.endpoint, payload, options);
}
function skipEvent(eventName, options, reason) {
if (reason && config.logging) {
console.warn("Ignoring Event:", reason);
}
if (options.callback) {
options.callback();
}
if (eventName === "pageview") {
isPaused = true;
}
}
let engagementTrackingInitialized = false;
function initializePlausible() {
config.endpoint = currentScript.getAttribute("data-api") || new URL(currentScript.src).origin + "/api/event";
config.domain = currentScript.getAttribute("data-domain");
config.logging = true;
let height = scrollHeight();
let depth = maxScrollDepth();
window.addEventListener("load", () => {
height = scrollHeight();
let count = 0;
const interval = setInterval(() => {
height = scrollHeight();
if (++count === 15) clearInterval(interval);
}, 200);
});
document.addEventListener("scroll", () => {
height = scrollHeight();
const currentDepth = maxScrollDepth();
if (currentDepth > depth) depth = currentDepth;
});
(function setupSPATracking(trackFunc) {
let lastPathname;
const triggerPageview = (force = false) => {
if (!force && lastPathname === locationInfo.pathname) return;
lastPathname = locationInfo.pathname;
trackFunc("pageview");
};
const history = window.history;
if (history.pushState) {
const originalPushState = history.pushState;
history.pushState = function () {
originalPushState.apply(this, arguments);
triggerPageview(true);
};
window.addEventListener("popstate", () => triggerPageview(true));
}
if (documentInfo.visibilityState === "hidden" || documentInfo.visibilityState === "prerender") {
documentInfo.addEventListener("visibilitychange", () => {
if (!lastPathname && documentInfo.visibilityState === "visible") {
triggerPageview();
}
});
} else {
triggerPageview();
}
window.addEventListener("pageshow", (event) => {
if (event.persisted) triggerPageview();
});
})(trackEvent);
const queued = (window.plausible && window.plausible.q) || [];
for (let i = 0; i < queued.length; i++) {
trackEvent.apply(this, queued[i]);
}
window.plausible = trackEvent;
window.plausible.init = initializePlausible;
window.plausible.l = true;
}
initializePlausible();
})();
As you scroll through this seemingly endless chunk of code, ask yourself: is all this really necessary? From event tracking and scroll depth detection to engagement timers, visibility listeners, and SPA routing logic — this script is doing a lot more than simply recording a pageview.
All of it runs on every page load, in every user’s browser, just to send basic analytics data. For a service that claims to be simple and privacy-friendly, that's a surprising amount of bloat.
Queantic offers the same insights—without the baggage. Take a look at our demo.