A QR code on a till receipt: one short link per till, sized for a 58 or 80 mm thermal printer, still readable when the paper fades

The receipt is the one piece of paper every customer leaves with. Most of them don't keep it long, but it's already printed, it costs nothing extra, and a QR code at the bottom can open the feedback form, the returns page or the reorder button. Plenty of tills can print one today with a setting you've never touched.

This guide covers what a receipt code should open, how often people actually use one, one link per till or branch so you can compare them, how big the code comes out on 58 mm and 80 mm thermal printers (we worked it out for three typical links), what fading does to it, and what counts as a scan.

What the code should open

One code, one job. A receipt that offers feedback, a loyalty sign-up, the returns policy and the Instagram account gets none of them done. Pick by what the customer might want next:

text
The code opens               Good for                          Keep it
---------------------------  --------------------------------  ----------------------------------------
A short feedback form        Cafés, restaurants, hairdressers,  2-3 questions, no sign-in, works on a
                             anywhere the visit is the product  phone in one hand
The returns or warranty      Shops selling things people bring  Return window, what to bring, the
page                         back: clothes, electronics, tools  address; a form if returns go by post
Reorder / the next order     Takeaways, refills, pet food,      Opens the item or the menu, not the
                             anything bought again              home page
A copy of this receipt       Bigger purchases, warranty items   Needs a per-receipt link (see the size
                                                                table: it makes the code bigger)

Whatever it opens, put a short link you control in the code, not the survey tool's address. The receipt layout lives in the till software and changing it is a job nobody wants; a short link lets you change the survey, swap providers or move the returns page without touching the till. It's the same reasoning as codes on restaurant tables, where the printed thing outlives what it points to.

Print one line of text above the code saying what it opens and what's in it for them: 'Tell us how we did (2 questions)' or 'Returns: 30 days, scan for the form'. A bare code at the bottom of a receipt is easy to miss: in a DMN survey of about 500 Canadian fast-food customers (2016), 45.9% hadn't noticed that their receipt carried a survey offer at all.

How many people will use it

Fewer than you'd hope, which is why the link has to be quick. That same DMN survey is one of the few with numbers on receipts specifically:

text
What customers did with a fast-food receipt (DMN, ~500 people, Canada, 2016)
---------------------------------------------------------------------------
Threw it away straight away                                    48.6%
Took it home only to throw it away                             22.5%
Took it home meaning to do the survey                          10.7%
Didn't notice the receipt had a survey offer                   45.9%
Of those who noticed it, took the survey                       56%
Why the rest didn't: forgot 23.5%, no time 18.9%, too complicated 13%
(the biggest reason: the reward wasn't worth their time)

Those receipts carried a typed web address and a code number, not a QR code. A QR code takes out the typing, and it helps: in a case reported by MaritzCX on CustomerThink, adding a QR code to receipt survey invitations more than tripled the number of responses, and the share completed on a phone went from 14% to 36%. Even so, plan on a few scans per hundred receipts, not dozens. The quickest win is the same in both studies: make the thing behind the code short, and say on the receipt how short it is.

One link per till or branch

Give each till or branch its own short link, all opening the same form, and you can compare them. The count on its own is misleading, though: a busier branch prints more receipts. Divide by the receipts each one printed (your till reports have that):

text
Worked example (made-up numbers)  Receipts that week   Scans   Scans per 100 receipts
--------------------------------  ------------------  ------  ----------------------
High Street, till 1               1,400                 21     1.5
High Street, till 2               1,100                 19     1.7
Station kiosk                       900                 27     3.0

High Street gets the most scans, but the kiosk's customers scan twice as often per receipt.
Worth asking why: shorter queue, staff mentioning it, or a different type of customer.

If you also tag the destination (?utm_source=receipt&utm_medium=print&utm_campaign=high-st-t1), the form or site's own analytics can tell the visits apart too; our UTM naming sheet keeps the tags consistent across branches. Making a link per till by hand gets tedious past five or six; the campaign link set tool makes a named short link for each place on a list in one go.

How big the code comes out on a thermal printer

Receipt printers are thermal: a row of tiny heating dots across the paper. The common ones print at 203 dpi, which is 8 dots per millimetre, so one dot is 0.125 mm. Some older ones (Epson's TM-T88V among them) print at 180 dpi. The paper widths and how much of them the printer can reach:

text
Paper roll   Printable width   Dots across at 203 dpi
-----------  ----------------  ----------------------
58 mm        48 mm             384
80 mm        72 mm             576

Printers that support QR codes natively (most built in the last decade; Epson's TM-T88 line from the IV onward) take a module size: how many dots wide each square of the code is, from 1 to 16 in the ESC/POS command set (GS ( k, function 167). Libraries default to 3 or 6. Your till software might call it 'size', 'scale' or 'QR size 1-16'.

A QR code's grid gets bigger as the link gets longer, so the link decides the printed size as much as the setting does. We worked it out for three typical receipt links at error correction level M, with the 4-square margin (quiet zone) a code needs around it:

text
Link in the code                       Characters  QR version  Squares   Width in mm at 203 dpi, by dots per square
                                                               a side    2      3      4      5      6      8
-------------------------------------  ----------  ----------  -------  -----  -----  -----  -----  -----  -----
Short link, one per till                       25           2       25    8.3   12.4   16.5   20.6   24.8   33.0
  https://b59.link/r-br2-t3
Survey address with store and till             62           4       33   10.3   15.4   20.5   25.7   30.8   41.0
  https://feedback.example-shop.com/
  s?store=0214&till=03&lang=en
Survey address + receipt ID + UTM tags        145           8       49   14.3   21.4   28.5   35.7   42.8   57.1
  (one address per receipt)

Width includes the quiet zone. 58 mm paper fits up to 48 mm; 80 mm paper up to 72 mm.

Two things fall out of that table. First, every combination fits on the paper; width is never the problem. Second, the long, per-receipt address needs 49 squares a side to the short link's 25, so at the same printed size each of its squares is about half as wide. That's what matters when the paper fades and the phone is old.

Our free receipt QR sizer does this sum for your own link: paste it, pick the paper and the printer's dpi, and it shows the width at each module size, draws the code at the printer's exact dots and gives you the ESC/POS bytes.

The receipt QR sizer: a short link on 58 mm paper at 203 dpi, widths by module size and the code drawn at printer dots
The receipt QR sizer on b59.link

Our test: how small is too small

We drew each of those codes at 2, 3, 4 and 6 dots a square, simulated the photo a phone takes of it (blur, sensor noise, JPEG compression) and decoded them with ZXing, the open-source reader many apps use. Close up, at about 20 camera pixels per millimetre (a recent phone held near the receipt), everything decoded. At 8 pixels per millimetre (an older phone, or the receipt held at arm's length), 2 dots a square failed every time for all three links (0 of 5 photos each), while 3 dots and up decoded every time. At 2 dots a square each square is a quarter of a millimetre, and the camera simply can't see it.

So: 3 dots a square is the floor, 4 is comfortable. For a short link on 58 mm paper that's a code 12 to 17 mm wide, about the size of a fingernail, which fits comfortably under the total.

What thermal paper does to the code

Thermal paper has no ink. The heat turns a coating dark, and the same reaction keeps going slowly in reverse: heat, light, plastic sleeves, hand cream and alcohol all fade it. The National Archives of Australia warns that modern thermal papers 'can be expected to display significant fading in as little as five years' even when stored well, and advises copying anything that matters. Paper makers sell longer-life grades: Zebra rates its Z-Select 2000D receipt paper for 12 years, but only stored at 18-24 °C and 40-60% humidity, out of the light, and doesn't warrant even that. A receipt in a car's glovebox or stuck to a sunny fridge gets nothing like those conditions.

What fading does to a code depends on how it fades. In the same simulation, even fading barely mattered: with the black squares faded all the way to a pale grey (210 out of 255, where white is 255), the decoder still read almost every photo in good light. That matches what we saw testing coloured codes on real phones: in good light almost any contrast scans, and the trouble starts in dim light, where codes with less than about 100 levels of grey between dark and light began to fail. A receipt read by a bright window is fine; the same receipt in a dim stockroom at warranty time may not be.

Patchy damage is what kills receipt codes: scuffing in a wallet, a fold right through the code, a worn print head leaving thin white lines. When we knocked out a scattered share of the printed dots, results swung a lot from photo to photo, but the trend was clear: with about 10% of the dots gone most codes still read, at about 20% most failed, and at 30% just 3 of 180 photos read, with level L and level M error correction alike. Error correction is built to repair damaged patches of a code, not a code that's been lightly sanded all over.

What to do about it:

- Keep the link short. Fewer squares means bigger squares at the same printed size, which an old phone in poor light can still see. A short link per till does that; a full survey address with a receipt ID does the opposite.
- Print the code at 4 dots a square if the layout allows, and not across the fold line where receipts get creased (the bottom of a long receipt usually is).
- Print the address under the code in plain text (b59.link/r-br2-t3), so a faded code can still be typed.
- Replace the print head and the paper when the print goes pale. A head with dead dots draws thin white lines through every code it prints; you'll see them on the totals too.
- Buy paper rated for the job. If the receipt doubles as a warranty proof, a longer-life grade is cheap insurance. Your customers will thank you more for a receipt they can still read in a year than for the QR code.

Receipts kept for a warranty

Some receipts are kept for years on purpose: in the European Union the legal guarantee on goods runs for at least two years from delivery (Directive (EU) 2019/771), and plenty of electricals carry longer manufacturer warranties. For those shops, a code that opens 'this receipt, as a PDF' or 'register your product' is more useful than a feedback form, and it solves the fading problem for the customer, because the record no longer depends on the paper.

That does mean a per-receipt address, the 145-character row in the table above. Two cautions if you build one. Make the code in the address long and random (not the receipt number, which anyone could step through to see other people's purchases), and keep the code at 4 dots a square or more, because a version 8 code has small squares to begin with. Better still, store the long address on your side and put a short per-receipt link in the code: same job, a version 2 code.

What counts as a scan

A scan you can count is a phone opening the link. That's it. A few things to keep in mind when you read the numbers:

text
What happened                                Counted as
-------------------------------------------  -----------------------------------------------
Customer scans, the form opens, they leave   1 scan, 0 responses: normal, compare the two
Customer scans twice (first one timed out)   2 clicks, 1 person; look at visitors, not clicks
Staff scan test receipts while setting up    Clicks you should ignore; note the date you
                                             went live
Customer photographs the receipt to scan     Nothing yet; may turn up days later
at home
Code too faded or creased to read            Nothing at all: invisible in your numbers

The last row is the one to remember: a code that stopped working doesn't send you an error, the scans just drop. If one till's scans fall to zero overnight, print a test receipt from it and look at the code.

On b59.link the stats page for each link shows the clicks, the number of visitors and each click's time, device and browser, so you can see test scans from the day you set it up and leave them out.

Setting it up: a checklist

1. Decide what the code opens. One thing.
2. Make one short link per till or branch, pointing at it (tagged with UTM if your form or site has analytics).
3. In the till's receipt layout, add the QR code with the short link, module size 4 (3 at the least), error correction M. If the till software can't print QR codes, it can usually print a logo image: use a code image drawn at exactly the printer's dots.
4. Add one line of text above it saying what it opens and how long it takes, and the short link in text below it.
5. Print a test receipt on each till. Scan it with an old phone, in dim light, at arm's length. Fold it, put it in a wallet for a day, scan it again.
6. Note the go-live date. After a month, compare scans per 100 receipts by till, not raw scans.

Size the code for your printer with the receipt QR sizer, then make a short link per till and change what it opens any time without touching the till. Free.

Open the receipt QR sizer

Sources

- DMN (DM Magazine), 'Fast food receipt surveys: who completes them and why?' (29 June 2016), survey of about 500 Canadian restaurant customers.
- CustomerThink, 'QR Codes on Receipt-Based Invitations Increase Response Rate' (MaritzCX client case: responses more than tripled, phone completion 14% to 36%).
- National Archives of Australia, 'Managing records on thermal papers' (fading in as little as five years; store at or below 20 °C and 50% RH; copy onto permanent paper).
- Zebra Technologies, Z-Select 2000D 80 Receipt and Z-Perform 1000D 60 specification sheets (12 and 10 years image life under stated storage).
- Printer datasheets: 58 mm paper, 48 mm print width, 384 dots; 80 mm paper, 72 mm, 576 dots, 8 dots/mm (203 dpi) (HPRT TP805L, Rongta RPP300, Bixolon BM58E); Epson TM-T88V 180 dpi.
- Epson ESC/POS command reference, GS ( k QR Code functions; python-escpos documentation (module size 1-16, default 3).
- Maitre'D POS documentation: QR codes need an Epson TM-T88IV or later.
- Directive (EU) 2019/771 on contracts for the sale of goods, Article 10 (two-year liability period).
- Our own test, 22 October 2026: QR versions and sizes computed with python-qrcode (level M, 4-module quiet zone, 0.125 mm dots); simulated phone photos (Gaussian blur, noise, JPEG at quality 80) at 20 and 8 pixels per mm decoded with zxing-cpp, 5 photos per cell; even fading of the dark squares to grey 20-210; scattered dot loss of 0-40% with patchy fading (grey 110 ± 40), 10 photos per cell, levels L and M. A simulation, not printed paper: real phones and real receipts vary.