How link tracking works without cookies.
Last updated
8 min readThis guide is general information, not legal advice. Privacy law differs by country and by the facts of your case. Ask your data protection officer or a lawyer about your own situation.
In short
You can count every click, the placement it came from, the device, the country and the city, and an approximate number of unique visitors per day, all without setting a cookie. You cannot follow one person across days or devices. That limit is the price of not identifying anyone.
What you can count with no cookie.
When someone opens a short link, their browser sends a request. That request already carries a lot: the browser name, the language, the page that referred it, and the network address it came from. The host in front of the server adds the country and city it infers from that address. Counting needs nothing more, so nothing has to be placed on the visitor's device.
| Field | Where it comes from | Example |
|---|---|---|
| Short link | The key the visitor opened | expo27-rollup |
| Time | The server clock | 14 October, 10:42 |
| Placement | ?s=, ?src= or ?utm_source= on the request | rollup |
| Referrer host | The Referer header, host only, no path or query | mail.example.com |
| Device, browser, operating system | The user agent string | Phone, Safari, iOS |
| In-app browser | Read from the user agent | Inside another app |
| Language | The Accept-Language header | de |
| Country, region, city, time zone | Headers added at the edge from the network address | DE, Hesse, Frankfurt |
| Outcome | What the visitor was sent to | Redirect, fallback, iPhone address |
| Bot and internal flags | Rules on the request, see below | False, false |
| Visitor hash | A one-way hash, see the next section | 32 characters |
Each click is one row. Nothing is sampled, so a count is a count of rows. The city is worth a second look: it is looked up from the network address, so the address is used for a moment, and the city is kept. A city is coarse, but it is still location data and your notice should say so.
0
cookies set by a card view or a short link click
How a unique visitor is counted without an identifier.
To tell 100 clicks from 40 people you need something to compare. 1Namecard computes a SHA-256 hash from four things: a secret that stays on the server, the current date in UTC, the network address and the user agent. It keeps the first 32 characters of the result. The address and the user agent go into the hash and are not stored.
Because the date is part of the input, the same person produces a different value tomorrow. There is no table that maps a hash back to an address. So today's visitors can be counted, and yesterday's cannot be matched to them.
| When | What the phone does | Hash | Counted as |
|---|---|---|---|
| Monday 09:05 | Scans the banner | a41c... | 1 unique visitor |
| Monday 14:30 | Scans it again from the same network | a41c... | Same visitor, 2 clicks |
| Tuesday 10:00 | Scans it once more | 7e02... | A new unique visitor |
Read the numbers with that in mind. Daily unique visitors are reliable. A weekly figure made by adding seven days overstates people, because someone who returns counts again. Two colleagues on the same office network with the same phone model and software version can share a hash and count once. A visitor whose mobile address changes between clicks can count twice. It is an approximation, and good enough to compare placements.
What you cannot count, and what we store.
| We store | We do not store |
|---|---|
| Placement, device, browser, operating system, language | The visitor's IP address in the click record |
| Country, region, city and time zone | A cookie or an ID on the visitor's phone |
| A daily-salted hash of address and user agent | The address or user agent that went into the hash |
| Whether the visit looked like a bot or a team member | A name, an e-mail address or a phone number |
| The referrer's host name | The referring page's path or query |
So you cannot count a person across days, a person across devices, how many times a named contact clicked or whether last week's visitor is back. If you need that, you need identification, and identification needs a lawful basis and usually consent. A lead form is separate: it holds what the person typed and the consent wording they saw, and it is kept until you delete it. It also records technical details of the submission, which only admins can see.
What the ePrivacy rules and the GDPR say.
Two laws matter, and they ask different questions.
Article 5(3) of the ePrivacy Directive covers storing information on a user's device, or reading information already stored there. It is not limited to cookies. Local storage, device fingerprinting and similar techniques can fall in scope, and it requires consent unless the storage or access is strictly necessary for a service the user asked for. A server that only receives what a browser sends anyway, and writes nothing to the device, is generally seen as outside it. But do not treat that as settled. The European Data Protection Board's Guidelines 2/2023 read the Article widely, name URL and pixel tracking, and say IP-based access can fall inside it in some cases. Ask counsel how your regulator reads it.
The GDPR asks a different question: is it personal data? Recital 26 says to consider the means reasonably likely to be used to identify a person. The Article 29 Working Party's Opinion 05/2014 on anonymisation treats hashing as pseudonymisation, not anonymisation. So a hash of an IP address can still be personal data in some views, even with a salt. The daily salt and the server secret make linking hard, and stop any link across days. They do not make the hash provably anonymous.
A cautious team therefore treats its click table as personal data. That means a stated purpose (counting visits to compare placements), a lawful basis you have written down, a retention period and a way to answer requests. The GDPR guide for events covers lead data, and the security page lists how 1Namecard hosts and separates data.
Filter bots and prefetchers, or the numbers lie.
| Source | Why it clicks | How to spot it |
|---|---|---|
| Link-preview crawlers | A chat or social app fetches the link to build a preview | Known user agent names |
| Search and site crawlers | They follow links to index pages | Known user agent names |
| Browser prefetch | The browser loads a likely next page early | Purpose or Sec-Purpose headers |
| Mail security scanners | They open links in a message before delivery | Clicks seconds after sending, odd locations. Often hard to tell |
| QR scanner apps | They check the destination for safety | Hard to tell. Compare scans with form submissions |
1Namecard checks the user agent against a list of crawlers and preview fetchers, and checks the prefetch headers. A match is stored with a reason and left out of every count. Scanners that look like ordinary browsers can still pass. A useful sanity check is to compare clicks with leads: a link with 400 clicks and no form starts has a bot problem or a content problem.
Leave your own team out.
Staff test their own codes, show them to colleagues and open them from the admin. A stand with eight reps can produce hundreds of staff clicks. 1Namecard recognises visits from your own team and leaves them out of the counts. They are stored with a flag, and you can bring them back by ticking Include internal in Analytics or Funnel.
Carry attribution in the address, not in a cookie.
Without a cookie, the memory of where a visit came from has to live somewhere else. The answer is the address. A short link adds ?s= with its key when it sends a visitor to a card. The card page reads it and keeps it in the browser's session storage while the tab is open. When the visitor submits a lead form or meeting request, the placement goes with it, so the lead arrives with its source. Closing the tab clears it.
Be precise about this. Session storage is not a cookie, but it is storage on the device, and Article 5(3) is not limited to cookies. What is stored is a placement word and the buttons tapped, not an identifier. Whether that falls under the exemption for what is strictly necessary is for your counsel. The cookie policy says what 1Namecard stores. The limit is that attribution lasts for a visit: a prospect who scans on Monday, closes the tab and returns on Thursday without scanning has no placement. The UTM guide shows how to tag it as well.
What to tell your privacy notice.
- Included: What you count: visits to your cards and links, with placement, device type, browser, language and approximate location.
- Included: Why: to compare placements and measure your marketing. State the lawful basis you chose.
- Included: How: without cookies on the visitor's device, and with a daily-changing hash instead of a stored IP address.
- Included: How long: 13 months for click and view records.
- Included: Who processes it: your hosting and platform providers, as listed in your processor agreement.
- Included: How a person exercises their rights, and who to contact.
- Included: A separate line for lead forms: what the person typed, the consent wording and how long you keep it.
Link the notice from every card and form, and keep it consistent with what you configure. The short link guide covers the other fields on a link. Review the notice whenever you change what you collect.
Quick answers.
Can you track links without cookies?
Yes. A server can count clicks, placement, device, language and approximate location from the request itself, and estimate unique visitors per day with a salted hash. It cannot follow one person across days or devices, which is what cookies are for.
Is cookieless tracking exempt from the ePrivacy consent rules?
Not automatically. Article 5(3) covers storing or reading information on the device, so counting that writes nothing there is generally seen as outside it. But regulators read it widely, including for URL and pixel tracking. Ask counsel about your case.
Is a hashed IP address personal data?
It can be. European guidance treats hashing as pseudonymisation, not anonymisation, so a hash of an address may still count as personal data in some views. A daily-changing salt reduces the risk and stops tracking across days, but it does not settle the question.
How do I stop bots from inflating my click counts?
Filter known crawlers and preview fetchers by user agent, ignore prefetch requests, exclude your own team, and compare clicks with form starts. Mail security scanners are the hardest to catch, so no filter is perfect.