QR code tracking: follow a scan through to the sale
QR code tracking in 6 steps: encode a short link, tag the UTMs, add a pixel and tie each scan to the Stripe charge it produced. Includes a worked example.
Muzahid Maruf, FounderUpdated
On this page
Explore with AI
Opens this article inside the chosen assistant with a ready-made prompt.
QR code tracking means printing a code that points at a short link you control, so each scan passes through a redirect that logs it before the visitor reaches your page. That yields counts, device types and rough locations.
Tying a scan to the Stripe charge it produced 3 weeks later takes more.
Key takeaways
- A QR code stores only a URL, so tracking means encoding a link on your own domain and logging each HTTP 302 redirect it triggers.
- A scan carries no referrer, so the 3 UTM parameters Google Analytics 4 expects (source, medium, campaign) are what name the campaign in reports.
- In the invented worked example the 95-scan table tent earned $354 a month and the 420-scan booth banner earned $295, so rank placements by revenue, not scans.
- Safari's Intelligent Tracking Prevention deletes script-written cookies after 7 days without interaction, so capture an email at signup to keep a scan joined to its Stripe charge.
How QR code tracking works
A tracked code holds a URL on your domain, such as go.yourbrand.com/booth-banner. The phone requests it, your server logs the request, and an HTTP 302 response sends the visitor to the real page.
The iPhone Camera app shows the link at the bottom of the screen and opens it only on a tap, per Apple Support, so every counted scan is a tap.
What a static code can still tell you
A static code has no server in the middle, so it can be measured only where it lands.
Add UTM parameters to the encoded URL and Google Analytics 4 tags each arriving session; Google Analytics Help says to always include 3 of them: utm_source, utm_medium and utm_campaign.
Scans that stop before the page loads leave no trace, and the destination can't change after printing (see dynamic versus static).
What a scan records and what it misses
| Signal | What the redirect records | Limit |
|---|---|---|
| Time and device | Timestamp, OS and browser from the user agent | Crawlers can pose as scans; TrackRev flags bots |
| Location | Country and city from the IP address | Approximate; Bitly lists city-level data under Bitly Premium, $199 a month billed annually |
| Referrer | None, because the camera app opens the URL directly | Untagged scans reach Google Analytics 4 as direct traffic |
| Visitor | An anonymous ID in a cookie | A name exists only once the visitor gives an email |
| Repeat scans | 1 row per request | 3 scans by 1 person count as 3 unless the tool counts by visitor ID |
Bitly details from its pricing page, October 2026.
1. Create one tracked link per placement
Placements that share a link share a number, so give each banner, insert and table tent its own link, named after the placement.
TrackRev's free plan allows 50 links; a CSV import creates a set at once, and the REST API returns any link's code as an SVG up to 2,048 px wide.
2. Put the campaign on the destination URL
Write the placement into the destination: utm_source=expo, utm_medium=qr, utm_campaign=launch-oct26 and utm_content=banner-a. Google Analytics 4 treats values as case-sensitive, so Meta and meta become 2 rows. The UTM parameters guide covers naming.
3. Encode the short link, not the destination
The symbology is defined in ISO/IEC 18004:2024, and Thonky's capacity table lists the limits: error correction M fits 42 bytes in version 3 and 122 in version 7, and each side is (version minus 1) times 4 plus 21 modules.
A 29-character short link fits version 3. The same page with 4 UTM parameters runs 108 characters and needs version 7.
| Encoded URL | Characters | Level | Version | Capacity in bytes | Modules per side | Module width at 30 mm |
|---|---|---|---|---|---|---|
| Short link | 29 | M | 3 | 42 | 29 | 0.81 mm |
| Short link, logo | 29 | H | 4 | 34 | 33 | 0.73 mm |
| URL with 4 UTMs | 108 | M | 7 | 122 | 45 | 0.57 mm |
| URL with 4 UTMs, logo | 108 | H | 10 | 119 | 57 | 0.46 mm |
Byte-mode capacities from Thonky's tutorial. Widths assume a 30 mm symbol with a 4-module quiet zone on each side. Generators that mix encoding modes can land 1 version lower.
Levels L, M, Q and H recover 7%, 15%, 25% and 30% of damaged data, as the free QR code generator page tabulates.
A logo needs H, which lowers capacity, and at 30 mm the long URL's modules come out 30% smaller than the short link's.
4. Test the printed proof
Print a proof at final size and scan it with an iPhone and an Android phone from where a person will stand, with a 4-module margin clear, dark modules on a light ground and a line saying what the scan delivers.
5. Install the pixel and capture an email
On each redirect TrackRev appends a 36-character visitor UUID to the destination as _vid, reusing the one in the visitor's existing cookie or minting a new one.
The pixel reads it on the first pageview, tying the click to the browser session. Call identify when the visitor gives an email: email joins a Stripe customer to the scan.
On pages with Stripe Payment Links, the pixel also adds the visitor ID as client_reference_id.
<script async src="https://app.trackrev.io/p.js" data-id="YOUR_WORKSPACE_ID"></script> <script> // Run after the visitor submits your signup form window.trk && window.trk.identify("jane@example.com");</script>Set data-requires-consent="true" and the pixel waits for window.trk.grantConsent() from your banner. The redirect still logs the click server-side, so ask a lawyer where you need a prompt.
6. Connect your billing system
In the Stripe Dashboard, create a read-only restricted key covering 4 resources: charges, customers, subscriptions and PaymentIntents. TrackRev polls every hour, or within seconds with the optional webhook, and also syncs Paddle Billing, Polar, Lemon Squeezy, Creem and Dodo Payments.
Revenue figures start on Indie at $29 a month or Growth at $299 a year, and the free plan stops at link tracking.
Where the trail from scan to charge goes cold
| Break point | What happens | Repair |
|---|---|---|
| Scan on a phone, buy on a laptop | No cookie crosses from phone to laptop | Capture an email on the phone visit |
| Safari Intelligent Tracking Prevention | Script-written storage is deleted after 7 days of Safari use without interaction (WebKit, 2020) | Bind an email within 7 days; the server-side click row stays |
| Hosted checkout | A Stripe Payment Link page (buy.stripe.com) can't read your cookie | Pass a client_reference_id up to 200 characters; a 36-character UUID fits |
| No pixel on the landing page | The _vid parameter arrives unread | Install the snippet on every landing page |
Safari rule from the WebKit tracking prevention post; Stripe limit from its tracking page for payment links.
A scan in a shop followed by a purchase a month later outlives the cookie, so capture the email at signup instead of waiting for checkout.
The Safari ITP post covers the browser rules, and the Payment Links guide shows how to carry the reference to the Stripe webhook.
A worked example: three placements, one $59 plan
These figures are invented to show the arithmetic.
| Placement | Print cost | Scans | Trials | Customers | Monthly revenue | Scan to customer | Cost per customer |
|---|---|---|---|---|---|---|---|
| Booth banner | $180 | 420 | 42 | 5 | $295 | 1.2% | $36 |
| Badge insert | $240 | 310 | 31 | 1 | $59 | 0.3% | $240 |
| Table tent | $60 | 95 | 19 | 6 | $354 | 6.3% | $10 |
| Total | $480 | 825 | 92 | 12 | $708 | 1.5% | $40 |
Invented figures. Monthly revenue is customers times $59.
Ranked by scans the banner leads, and ranked by revenue the table tent does: 19 of its 95 scans (20.0%, against 10.0% for the others) became trials, and 6 of those paid.
The insert costs 24 times as much per customer as the tent. Samples this small prove little; the scan column alone would have funded the banner and passed over the tent.
Choosing a QR code generator with tracking
A QR code tracker is a link tool with a QR button, so compare caps, scan history and reach past the click.
| Question | Bitly | Uniqode | TrackRev |
|---|---|---|---|
| Entry price | Free; Bitly Core $10 a month billed annually | Static free; dynamic from $9 a month, annual billing only | Free; Indie $29 a month, Growth $299 a year |
| Free tier | 2 QR codes a month, unlimited scans | Unlimited static codes; 14-day trial of dynamic | 50 links, 1,000 tracked events a month |
| QR codes on paid plans | 5 on Bitly Core, 10 on Bitly Growth, 200 on Bitly Premium a month | Scan limits per plan, reset every year | Unlimited links and events |
| Higher tiers | Bitly Growth $29 a month annual or $35 monthly; Bitly Premium $199 annual or $300 monthly | Uniqode Core $49 a month | The same features on both paid plans; TrackRev Growth adds up to 10 workspaces, up to 10 tracked domains and unlimited seats, billed yearly |
| Scan history | 30 days on Bitly Core, 4 months on Bitly Growth, 1 year on Bitly Premium | Not stated in its pricing FAQ | None listed in its plan features |
| Revenue per code | Not mentioned on the pricing page | Not mentioned in its pricing FAQ | Paid plans, via Stripe, Paddle, Polar or Lemon Squeezy sync |
| Fits when | Counts are enough | You need single sign-on and SOC 2 reporting | A scan has to end at a charge |
Prices from each vendor's pricing page, October 2026: Bitly, Uniqode and TrackRev's own.
Check what happens to printed codes
A dynamic code points at a redirect the vendor hosts. Uniqode's FAQ says its codes go inactive and stop redirecting after a cancellation or when the 14-day trial ends. Ask any vendor the same before printing.
QR code tracking in TrackRev
TrackRev is SaaS affiliate software with link tracking built in. Each link has a QR button that opens the designer, with PNG or SVG export up to 2,048 px.
Each scan becomes a click with time, country, city, device, browser, OS, referrer and a bot flag.
After printing you can change a campaign's destination, route phones and desktops to different pages, or expire a link by date or click count.
Links can run on your own domain with automatic SSL and 1 CNAME record.
The Camera app shows the URL before anyone opens it, and the Federal Trade Commission's December 2023 alert tells people to check for misspelled or swapped letters, so go.yourbrand.com beats a generic shortener domain.
The branded short link guide covers the DNS.
With the pixel installed and a billing system connected, each paid charge is credited to the link that started the journey under last-touch, first-touch or linear credit, and renewals keep crediting the original click.
Revenue needs a paid plan from $29 a month; the free plan shows scans and no revenue. See the pricing page.
A menu or Wi-Fi code needs only the free generator, and pasting a TrackRev link into it makes its static code trackable.
TrackRev is the wrong tool when nobody buys online, or when the purchase happens in a shop or on a marketplace outside the 6 billing systems it reads.
Bitly or Uniqode fit a team that needs only QR codes and scan counts.
Found this useful? Share it.
Frequently asked questions
- Encode a short link from a link tool and read its scan log. Each scan is 1 request, so the tool counts it, groups it by device and location, and forwards the visitor. A code holding a long URL can't be tracked at the scan.
- Only at the landing page. If the encoded URL carries utm_source, utm_medium and utm_campaign, Google Analytics 4 reports the sessions that load your site. Scans that never load the page leave no trace.
- Not as a person. A scan gives a timestamp, device, browser, approximate location and an anonymous visitor ID; a name appears only if the visitor later gives an email.
- Read the link the camera shows before you tap; an iPhone opens it only on a tap. The FTC's December 2023 alert advises distrusting unexpected codes in email or text, and stickers placed over another code.
- Scans appear within seconds. Revenue follows the billing sync, hourly by default and within seconds with the optional Stripe webhook.
- Within limits. Bitly's free plan allows 2 QR codes a month with unlimited scans, and TrackRev's free plan covers 50 links and 1,000 tracked events a month. Revenue reporting starts at $29 a month, which is $348 over 12 months.

Written by
Founder, TrackRev.io & Contant.io
Muzahid Maruf founded TrackRev.io, SaaS affiliate software with no limit on tracked revenue, and Contant.io. He writes about affiliate programs.
Writes about Marketing attribution · Link tracking · Revenue analytics · SaaS growth
Stop guessing where your revenue comes from.
Set up TrackRev in about five minutes. The free plan covers 1,000 events a month, no card needed.
Start free