Guide
How to Track QR Code Scans on Shopify (and Tie Them to Sales)
The three levels of QR code tracking for a Shopify store — UTM links, dynamic codes with scan analytics, and order attribution — and how to set each one up.
Printing a QR code is easy. Knowing what it did is not. A code on a flyer, a box or a shop window can bring you dozens of visits a week or none at all — and with a plain QR code, you’ll never know which.
This guide walks through the three levels of QR code tracking available to a Shopify store, from free to precise, so you can pick the one that matches what you need to decide.
Why a plain QR code tells you nothing
A QR code made with a free generator is usually static: the web address is written directly into the pattern of squares. When someone scans it, their phone opens that address. Nothing sits in between to count the scan.
Your store sees a visit, but it can’t tell that it came from the code — let alone from which code, if you printed several.
Level 1: UTM parameters (free, with any generator)
The simplest improvement is to add UTM parameters to the address before you generate the code:
https://yourstore.com/products/aurora-tee?utm_source=flyer&utm_medium=qr&utm_campaign=spring
Analytics tools such as GA4, and Shopify’s own marketing reports, can then group visits under that source and campaign.
It’s free and better than nothing, but it has real limits:
- You can’t change anything after printing. A typo in the address, a sold-out product or a finished promotion means reprinting.
- You count visits, not scans. If the page loads slowly or the shopper closes it, nothing is recorded.
- Long addresses make dense codes. More characters mean smaller squares, which are harder to scan from a distance.
- One code per placement, made by hand. Comparing ten flyers means ten different static codes to manage.
Level 2: dynamic QR codes with scan analytics
A dynamic QR code stores a short link instead of the final address. Each scan goes through that link, which records the scan and then sends the shopper to the destination you chose.
That one change unlocks a lot:
- Every scan is counted, with the time, the type of device and the approximate country.
- The destination can change at any time. The printed code stays the same.
- Codes are short, so the pattern is less dense and easier to scan.
- Placements can be compared: one code per flyer, box or event, each with its own numbers.
In TrackQr, every code is dynamic. You pick the destination from your catalog — a product, a collection, a pre-filled cart, a discount, a page — name the code after where it will be printed, and the scans appear in the dashboard. Bots are filtered out so they don’t inflate the numbers.
Level 3: sales attribution per QR code
Scan counts tell you a code gets attention. They don’t tell you whether it sells. For that, you need to connect a scan to an order that may happen minutes or days later.
Here is how TrackQr does it:
- The scan gets an ID. When someone scans a code, TrackQr creates a random scan ID and passes it to your store along with the shopper.
- The ID stays in the cart. The TrackQr app embed — switched on once in your theme editor — keeps the ID in the shopper’s browser for 7 days and adds it to their cart.
- The order carries the ID. When the shopper checks out, the order includes the scan ID.
- The order is matched to the code. TrackQr reads it and adds the order and its amount to that QR code.
You end up with revenue, orders, conversion rate and average order value for each printed code. One scan can lead to several orders within the 7 days; each one counts.
It’s worth knowing the limits, too. Attribution works when the purchase happens in the same browser as the scan, within 7 days, on your online store. A shopper who scans with their phone and buys a week later on a laptop won’t be matched — the sale still appears in your Shopify reports, just not on the code.
A simple setup for your next campaign
- Create one code per placement. Name them clearly: “Flyer · North district”, “Box insert · Coffee 250 g”.
- Point each code to a dedicated destination: a product, a discount applied automatically, or a campaign page.
- Add UTM parameters anyway, so GA4 sees the traffic too. Set them on the code and TrackQr appends them to the destination.
- Print with a clear call to action next to the code — “Scan for 15% off” — and scan a printed proof before the full run.
- After two weeks, compare. Scans first, then orders and revenue. Divide each print run’s cost by its attributed orders to get a real cost per order.
Which level do you need?
- You print one code and only want a rough idea: UTM parameters are enough.
- You print several codes and want to compare them, or change destinations: you need dynamic codes with scan analytics. TrackQr counts scans on every plan, including the free one, with detailed analytics from the Starter plan.
- You want to know which code made money: you need attribution, included in TrackQr’s Growth plan.