Menu

One payment / lifetime / no subscription

Guide

How to track outbound link clicks without cookies

Cross-linking your own projects is only worth the footer space if people use the links, and most makers never find out. Page analytics tell you who arrived; they are usually silent about who left, and where to. This is how to count outbound clicks, the ones from your site to your other apps, ideally without a cookie banner on a side project that never needed one.

By Utkarsh Kushwaha · Published

Why your page analytics don't already show this

A pageview tool records the page loading. A click on a link to another domain is the visitor leaving, and unless something records the click itself before the browser navigates away, it never happens as far as your analytics are concerned. The destination sees the visit arrive, but usually as 'direct' or as a bare referrer, with no idea which link on which of your sites sent it.

So the question 'which of my sites sends traffic to which of my apps' needs an event at the moment of the click, attributed to both ends. Everything below is a different way of getting that event.

Option 1: Google Analytics 4, which you may already have

GA4's enhanced measurement records outbound clicks automatically when it is switched on for the data stream: a click event with the destination's domain and URL attached. If GA4 is already on the site, this is the zero-effort answer, and the report is under events, filtered to outbound clicks.

The cost is the one you already pay for GA4: it sets cookies, which in the EU and UK means a consent banner, and visitors who decline or run a blocker are not counted at all. On a small side project that is often most of the traffic you care about.

Option 2: a privacy-first analytics tool

Cookieless tools such as Plausible count visits without identifying anyone, so they generally run without a consent banner. Plausible offers outbound link tracking as an opt-in variant of its script: enable it, and clicks on links to other domains show up as a goal with the destination attached.

It is the cleanest route if you want one dashboard for everything. The trade-offs are a monthly subscription per site, which adds up across five side projects, and that each site's numbers live in that site's dashboard, so seeing which of five sites feeds which of five apps means joining five reports yourself.

Option 3: UTM tags on the links themselves

Instead of counting the click where it happens, you can label it and count it where it lands. Add utm_source and utm_medium to each cross-link, and whatever analytics the destination app runs will attribute the visit to the site and placement that sent it.

It needs no script at all, and it survives blockers better than click tracking does, because the label travels in the URL. It only works where the destination has analytics, it clutters every link, and it counts arrivals rather than clicks: a visitor who clicks and bounces before the destination's script loads is missing from both ends.

A tagged cross-link
<a href="https://quiethours.dev/?utm_source=tinyinvoice.app&utm_medium=footer&utm_campaign=cross-promo">
  Quiet Hours: a focus timer that mutes Slack for you
</a>

Option 4: a beacon and a counter of your own

The smallest honest version is a few lines of JavaScript that, on click, tell a server which link was taken and from which site, and a server that adds 1 to a counter. navigator.sendBeacon exists for exactly this: the browser queues the request and delivers it even though the page is navigating away, so the link opens at full speed and the count is not lost.

Send only what you need, the link and the hostname, and store only integers, and there is nothing personal to put behind a consent banner in the first place. The catch is that you now own an endpoint, its storage, its abuse handling and its dashboard, for every site.

Before </body>
<script>
  document.addEventListener("click", (e) => {
    const a = e.target.closest("a[data-track]");
    if (!a) return;
    navigator.sendBeacon(
      "https://your-counter.example.com/hit",
      JSON.stringify({ link: a.dataset.track, site: location.hostname })
    );
  });
</script>

<a href="https://quiethours.dev" data-track="quiet-hours">Quiet Hours</a>

What none of these can tell you, and what to measure instead

Clicks alone hide the question you actually have. Twenty clicks a month from a site with fifty visitors is a link doing its job; twenty from a site with fifty thousand is a link nobody sees. Count how often the links were shown as well as how often they were taken, and the rate between the two is the number worth watching.

Make Taksh does this for the cross-links it draws: the badge counts how often it is seen, how often its panel is opened and which link is taken, per site and per country, as integer counters with no cookies and no visitor record, and the dashboard shows the funnel and which site sends people to which app. It is one option among the four above, and the right one mainly if the badge is already how your apps link to each other.

Questions people ask about this

Can I track outbound clicks without a cookie banner?
Yes, as long as what you record identifies nobody. Counting which link was clicked and on which site, stored as totals, involves no cookies and no personal data. Tools that set cookies or build visitor profiles, such as a default GA4 setup, are the ones that bring the consent requirement with them.

Why use sendBeacon instead of fetch for click tracking?
A click on an outbound link starts a navigation, and a fetch started at that moment is often cancelled when the page unloads. sendBeacon hands the request to the browser to deliver in the background, so it survives the navigation without delaying the link.

Do ad blockers stop outbound click tracking?
Often, yes. Blockers match well-known analytics domains and script names, so third-party trackers are the first to go. A small beacon to your own domain is blocked far less, and UTM tags, which travel in the link itself, are counted by the destination whatever the source page ran.

What is a good click-through rate for cross-links between my apps?
There is no universal number, because it depends on how prominent the links are and how related the apps are. Measure your own baseline, then compare sites against each other: the one with the lowest rate relative to its traffic is where the links are hardest to notice.

Where Make Taksh fits

Make Taksh is one line of code you paste into each site you own. It renders a small badge in the corner that lists everything you have shipped, reading from one hosted list, so adding your next project is one edit and every site you have already installed it on picks it up within minutes. It is under 8 KB, renders in a shadow root so it cannot touch your CSS, sets no cookies, and draws nothing at all if it fails to load.

See what it looks like · What it costs · How to install it