# How to Track QR Code Scans (and Which Scans You Can Count)

Source: https://lots.link/blog/track-qr-code-scans
Published: 2026-10-14T03:31:07.433856+00:00

To track QR code scans, make the QR code point at a short link instead of straight at your page. Every scan then passes through the short link's redirect and is recorded as a click, with the time, device, approximate location and referrer. Give each printed placement its own short link (or tag it with `utm_medium=qr`) and you can tell scans apart from everything else.

That's the whole trick. A QR code is just a URL drawn as squares. Nothing in the image reports back when someone points a camera at it, so the counting has to happen on the server the URL leads to. If that server is your link shortener, you get the scan count. If the code points straight at your website, only your website analytics can see the visit, and only if it can tell where it came from.

I ran this end to end on 13 October 2026 through the LotsLink MCP server: created a short link with UTM tags, opened it once the way a phone does after a scan, read the analytics back, then deleted the test link. The outputs are below.

## What you need

- A LotsLink account. Short links, clicks, QR codes and analytics are free and unlimited, and new accounts get 4,000 free credits, valid 90 days, no card.
- The page you want people to land on.
- Optional: an AI agent connected to LotsLink over MCP (Claude, ChatGPT, Claude Code, Cursor or any client with remote MCP). Setup per agent is on [lots.link/mcp](https://lots.link/mcp). Everything below also works in the dashboard.

## Step 1: Create one short link per placement

Decide where the code will be printed: the flyer, the table tent, the packaging insert, the conference badge. Each of those gets its own short link. That one decision is what makes scans countable later.

In the dashboard, create the link with a custom slug and fill in the UTM fields. From an agent, ask:

> In my LotsLink workspace, create a short link to https://example.com/menu with the slug `menu-table-tent`, utm_source `table_tent`, utm_medium `qr` and utm_campaign `autumn_menu`. Don't put this link anywhere except the QR code.

Here's what came back when my agent ran `lotslink_create_link` (trimmed):

```json
{
  "success": true,
  "short_url": "https://lots.link/blogqr-1013",
  "link": {
    "final_slug": "blogqr-1013",
    "original_url": "https://www.lotstech.com/mcp/lots-link?utm_source=flyer&utm_medium=qr&utm_campaign=blog-qr-test",
    "utm_source": "flyer",
    "utm_medium": "qr",
    "utm_campaign": "blog-qr-test",
    "qr_code_url": null,
    "click_count": 0,
    "is_active": true
  }
}
```

LotsLink appends the UTM tags to the destination for you, so the page behind the code receives them on every scan. `qr_code_url` is empty until you make the code.

Pick the slug with care. Slugs are 7 to 40 characters, and changing one later changes the public URL, so a code you already printed with the old URL stops working.

## Step 2: Make the QR code from that short link

In the dashboard, open **QR Codes**, stay on the **Generate** tab, choose **Select Link** and pick the link you just made. Set the size and the **Foreground Color** and **Background Color** (keep strong contrast so phones read it), then click **Generate QR Code** and **Download**. The code encodes your short URL, and it's saved on the link, so it shows up in your **Library** tab and on the link itself.

If your agent's connection lists the `lotslink_create_qr_code` tool, it can do the same thing: ask it to "make a QR code for the menu-table-tent link, 1024 pixels, black on white" and it returns a PNG URL ready to print. QR codes are free and unlimited, like links.

Two rules that save a reprint:

- **Always make the code from the short link.** A QR code that points directly at your website skips LotsLink, and none of its scans will appear in your link analytics. If you designed the code in another app, paste the short URL into it, not your page URL.
- **Test it before printing.** Scan it with your phone, then check that one click arrived (Step 4).

## Step 3: Let people scan it

Print it, stick it up, ship it. Each scan opens the short URL, LotsLink records the visit, and the browser is sent on to your page with a `307` redirect.

To check the redirect, I opened the short link once the way a phone camera hands a URL to the browser: a mobile Safari user agent and no referring page.

```text
HTTP/2 307
location: https://www.lotstech.com/mcp/lots-link?utm_source=flyer&utm_medium=qr&utm_campaign=blog-qr-test
cache-control: no-store
```

Then I sent two requests the way machines do: a plain `curl` request and one with Facebook's link-preview user agent. Both were redirected too, but neither was counted. Known bots, link previews, prefetches and `HEAD` requests are left out of the numbers, so a code shared in a chat app doesn't inflate your scans when the app fetches a preview.

## Step 4: Read the scan analytics

Ask your agent:

> How many times was the menu-table-tent link opened in the last 7 days? Break it down by device, country and referrer.

The agent calls `lotslink_get_link_analytics`. Mine came back like this after the test scan and the two bot requests (city removed):

```json
{
  "metrics": { "totalClicks": 1, "clicksInPeriod": 1, "peakDay": { "date": "2026-10-13", "clicks": 1 } },
  "geography": { "countries": [{ "country": "IN", "clicks": 1 }], "cities": [{ "city": "<my city>", "country": "IN", "clicks": 1 }] },
  "devices": { "desktop": 0, "mobile": 1, "tablet": 0, "unknown": 0 },
  "referrers": { "top": [{ "referrer": "direct", "clicks": 1 }] },
  "timeline": [{ "date": "2026-10-13", "clicks": 1 }]
}
```

One click, not three: the scan counted and the bot requests didn't. The device was read as `mobile` and the referrer is `direct`, which is what a camera scan normally looks like, because the camera app doesn't send a referring page.

For the individual records, ask for the click details (`lotslink_get_click_details`). Each record has the time, user agent, referrer, country, city and device type. Here's the one from my test, trimmed:

```json
{
  "clicked_at": "2026-10-13T06:31:56Z",
  "ip_address": null,
  "referrer": null,
  "country": "IN",
  "device_type": "mobile"
}
```

Note the `ip_address: null`. LotsLink doesn't store visitor IP addresses. You can also export a link's or a workspace's clicks as CSV or JSON, and the same charts are in the dashboard.

When I was done, I asked the agent to delete the test link. It returned `"Link deleted successfully"`, a search for the slug came back empty, and the short URL returned `404` about a minute later (found links are cached at the edge for up to a minute).

## How to tell scans from other clicks

A scan and a click look the same to the redirect: both are a browser opening the short URL. So you separate them by design, not by guessing:

| Method | How | What you get |
|---|---|---|
| **One link per placement** (strongest) | The link appears only inside the QR code, never as text in posts or emails | Every click on that link is a scan, or someone typing the printed URL. Compare placements link by link |
| **`utm_medium=qr` on the link** | Set utm_source to the placement (`flyer`, `menu`, `badge`) and utm_campaign to the campaign | Your website analytics group QR visits under medium `qr`. Google's [URL builder guide](https://support.google.com/analytics/answer/10917952) says to always set `utm_source`, `utm_medium` and `utm_campaign`, and shows the values in the Traffic acquisition report |
| **Referrer and device** (weak) | Look for `direct` and `mobile` | A hint only: email apps, chat apps and typed URLs also show up as direct, and plenty of mobile clicks aren't scans |

Use the first two together. The separate link gives you the scan count in LotsLink without any website setup, and the UTM tags carry the source into whatever analytics your site already runs, where you can see what people did after they landed.

## What scan analytics include, and what they don't

**Included:** recorded visits to the short link, all-time and for a period, average per day, the peak day, a daily timeline, top countries and cities, devices (desktop, mobile, tablet) and referrers, plus each click's record and CSV or JSON export.

**Not included:**

- **Unique visitors.** No IP address or visitor ID is stored, so a person who scans the same code twice counts twice. Read the numbers as scans, not people.
- **Scans of codes that point somewhere else.** Only codes that open a LotsLink short URL are counted.
- **Bots and previews.** Known crawlers, link previews, prefetches and `HEAD` requests are left out on purpose.
- **What happened on your page.** Sign-ups and purchases after the scan belong to your website analytics, which is why the UTM tags matter.
- **Exact location.** Country and city are approximate and can be missing.

## Keep printed codes working

- **Don't change the slug** of a link that's already printed. The old URL stops working.
- **Pause instead of delete.** Deactivating a link stops the redirect but keeps its analytics, and you can turn it back on. Deleting removes the link and its click history for good.
- **Expiry dates are for short campaigns.** A link with an expiry stops redirecting after that time, which suits an event badge, not a product box that stays on shelves for a year.
- **Your own domain is optional.** Codes on lots.link work and track the same. If you want `go.yourbrand.com` in the URL under the code, add a custom domain: that's the only thing LotsLink charges for, $4 per domain a month from credits, or Starter at $9 a month for 3 domains. Details on the [pricing page](https://lots.link/pricing).

## Common questions

### Can you track QR code scans for free?

Yes. Point the QR code at a LotsLink short link. Links, clicks, QR codes and analytics are free and unlimited, and each scan is recorded as a click with device, approximate location and referrer.

### Does a QR code scan count as a click?

Yes, when the code opens a LotsLink short URL. The scan goes through the same redirect as a click and is recorded the same way. A QR code that points straight to another website doesn't pass through LotsLink, so it isn't counted.

### How do I know a click came from the QR code and not a social post?

Use a separate short link for each printed placement and put it only in the QR code. Every click on that link is then a scan. Add `utm_medium=qr` and a `utm_source` for the placement so your website analytics can group those visits too.

### How do I track QR code scans in Google Analytics?

Add UTM tags to the link behind the QR code: `utm_source` for the placement, `utm_medium=qr` and `utm_campaign` for the campaign. Google Analytics shows those values in its Traffic acquisition report. LotsLink adds the tags to your destination for you when you fill the UTM fields.

### Can I see how many unique people scanned my QR code?

No. LotsLink doesn't store visitor IP addresses or visitor IDs, so the count is scans, and one person scanning twice counts twice. Bots and link previews are left out.

### Can my AI agent read my QR code scans?

Yes. Connect LotsLink to your agent over MCP and ask for a link's analytics: total clicks, timeline, countries, cities, devices and referrers, or the individual click records. Setup for each agent is on [lots.link/mcp](https://lots.link/mcp).

## Start with one placement

Pick the next thing you're printing, give it its own short link with `utm_medium=qr`, make the QR code from that link and scan it once to see the click arrive. If you want to compare shorteners that your agent can drive first, I checked seven of them in [the best URL shorteners with MCP support](https://lots.link/blog/best-url-shorteners-with-mcp-support).

[Create your first tracked QR code on LotsLink](https://lots.link), or [connect your agent](https://lots.link/mcp).
