Menu

Free to start / no card needed

Guide

How to track outbound link clicks, with or without cookies

An outbound click is a click on a link that takes the visitor off your site to another domain: a footer link to your other app, a 'made by' badge, a link in a blog post. Page analytics tell you who arrived; they are usually silent about who left, and where to. This is how to track those external link clicks, starting with the tools you may already run and ending with the ones that need no cookie banner on a side project that never needed one.

By Utkarsh Kushwaha · Updated

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 records outbound clicks automatically through enhanced measurement. Check it is on under Admin, Data streams, your web stream, Enhanced measurement, where 'Outbound clicks' is one of the toggles. Each click on a link to another domain is then sent as an event named click, with outbound set to true and the destination in link_url and link_domain.

The catch is where to see it. The standard Events report shows the click event's count but not which link was clicked, because link_url is not a reporting dimension until you register it: add it under Admin, Custom definitions, as an event-scoped custom dimension. It only applies to data collected after that point, so do it the day you turn tracking on. For a quick look without registering anything, a Free-form exploration filtered to event name click will break it down by link URL.

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: Google Tag Manager, for control over which links count

Enhanced measurement counts every link to another domain, including ones you do not care about, and names the event for you. Tag Manager lets you choose. Enable the built-in Click URL and Click URL Hostname variables, create a trigger of type 'Click - Just Links' that fires when Click URL Hostname does not contain your own domain, and attach a GA4 event tag to it with a name of your own, such as outbound_click, passing Click URL as a parameter.

Tick 'Wait for tags' on the trigger if clicks are going missing: it holds the navigation for up to two seconds so the event can be sent first. This route is worth it when you want only some links tracked, want them named, or already manage every other tag through GTM. It inherits all of GA4's consent and blocker costs, and adds a container to maintain.

Option 3: 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 4: 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 5: 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.

Before tracking anything, it helps to know what a page links out to at all: the free outbound link checker on this site lists every external link on a page, grouped by domain, with its anchor text and whether it is followed or nofollow.

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 five above, and the right one mainly if the badge is already how your apps link to each other.

Questions people ask about this

What is an outbound click?
A click on a link that takes the visitor from your site to a different domain. Analytics tools treat it separately from internal navigation because the visitor is leaving: nothing on the next page reports back to you, so the click has to be recorded as it happens.

Where do I see outbound clicks in GA4?
With enhanced measurement on, they arrive as the click event with outbound set to true. The Events report counts them; to see which links were clicked, register link_url as an event-scoped custom dimension, or break the click event down by link URL in a Free-form exploration.

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