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 — Founder of TrackRev.io

Muzahid MarufUpdated

Link tracking · 9 min read
On this page
  1. 01How QR code tracking works
  2. 02What a scan records and what it misses
  3. 03Setting up a trackable QR code
  4. 04Where the trail from scan to charge goes cold
  5. 05A worked example: three placements, one $59 plan
  6. 06Choosing a QR code generator with tracking
  7. 07QR code tracking in TrackRev

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

SignalWhat the redirect recordsLimit
Time and deviceTimestamp, OS and browser from the user agentCrawlers can pose as scans; TrackRev flags bots
LocationCountry and city from the IP addressApproximate; Bitly lists city-level data under Bitly Premium, $199 a month billed annually
ReferrerNone, because the camera app opens the URL directlyUntagged scans reach Google Analytics 4 as direct traffic
VisitorAn anonymous ID in a cookieA name exists only once the visitor gives an email
Repeat scans1 row per request3 scans by 1 person count as 3 unless the tool counts by visitor ID

Bitly details from its pricing page, October 2026.

Setting up a trackable QR code

Steps 1 to 4 need no code.

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.

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 URLCharactersLevelVersionCapacity in bytesModules per sideModule width at 30 mm
Short link29M342290.81 mm
Short link, logo29H434330.73 mm
URL with 4 UTMs108M7122450.57 mm
URL with 4 UTMs, logo108H10119570.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.

Landing page
<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 pointWhat happensRepair
Scan on a phone, buy on a laptopNo cookie crosses from phone to laptopCapture an email on the phone visit
Safari Intelligent Tracking PreventionScript-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 checkoutA Stripe Payment Link page (buy.stripe.com) can't read your cookiePass a client_reference_id up to 200 characters; a 36-character UUID fits
No pixel on the landing pageThe _vid parameter arrives unreadInstall 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.

PlacementPrint costScansTrialsCustomersMonthly revenueScan to customerCost per customer
Booth banner$180420425$2951.2%$36
Badge insert$240310311$590.3%$240
Table tent$6095196$3546.3%$10
Total$4808259212$7081.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.

QuestionBitlyUniqodeTrackRev
Entry priceFree; Bitly Core $10 a month billed annuallyStatic free; dynamic from $9 a month, annual billing onlyFree; Indie $29 a month, Growth $299 a year
Free tier2 QR codes a month, unlimited scansUnlimited static codes; 14-day trial of dynamic50 links, 1,000 tracked events a month
QR codes on paid plans5 on Bitly Core, 10 on Bitly Growth, 200 on Bitly Premium a monthScan limits per plan, reset every yearUnlimited links and events
Higher tiersBitly Growth $29 a month annual or $35 monthly; Bitly Premium $199 annual or $300 monthlyUniqode Core $49 a monthThe same features on both paid plans; TrackRev Growth adds up to 10 workspaces, up to 10 tracked domains and unlimited seats, billed yearly
Scan history30 days on Bitly Core, 4 months on Bitly Growth, 1 year on Bitly PremiumNot stated in its pricing FAQNone listed in its plan features
Revenue per codeNot mentioned on the pricing pageNot mentioned in its pricing FAQPaid plans, via Stripe, Paddle, Polar or Lemon Squeezy sync
Fits whenCounts are enoughYou need single sign-on and SOC 2 reportingA 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.

PostLinkedIn

Frequently asked questions

Muzahid Maruf — Founder of TrackRev.io

Written by

Muzahid Maruf

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