QR code size for a till receipt
Paste the link for the code at the bottom of your receipts and pick your printer. You get the printed width at every module size (the “QR size 1-16” setting in the till software), which one to use, the code drawn at the printer's exact dots and the ESC/POS bytes. It all runs in your browser.
Most receipt printers are 203 dpi (8 dots a millimetre); some older Epson models are 180. 58 mm paper at 203 dpi prints 384 dots across (48.0 mm). Level M is the usual default.
Width at each module size
29 × 29 squares (version 3), plus a 4-square white margin on every side. Pick a row to draw it.
| Dots a square | Square | Width | Verdict |
|---|---|---|---|
| 1 | 0.13 mm | 4.6 mm | too small |
| 2 | 0.25 mm | 9.3 mm | too small |
| 3 | 0.38 mm | 13.9 mm | smallest that works |
| 4USE THIS | 0.50 mm | 18.5 mm | comfortable |
| 5 | 0.63 mm | 23.1 mm | comfortable |
| 6 | 0.75 mm | 27.8 mm | comfortable |
| 7 | 0.88 mm | 32.4 mm | comfortable |
| 8 | 1.00 mm | 37.0 mm | comfortable |
Under 0.3 mm a square, an older phone at arm's length can't see it (2 dots at 203 dpi failed every photo in our test); from 0.45 mm there's room for fading and scuffs.
4 dots a square · 18.5 mm wide on the receipt
Print the link in text under it, so a faded code can still be typed.
384 pixels wide, one pixel per printer dot: for till software that prints a logo image. Upload it at 100%, no scaling.
ESC/POS bytes
Epson's QR commands (GS ( k): model 2, size 4, level M, store, print; centred. Send them raw to printers that take ESC/POS (Epson, Star in ESC/POS mode, most generic 58/80 mm models).
1B 61 01 1D 28 6B 04 00 31 41 32 00 1D 28 6B 03 00 31 43 04 1D 28 6B 03 00 31 45 31 1D 28 6B 20 00 31 50 30 68 74 74 70 73 3A 2F 2F 62 35 39 2E 6C 69 6E 6B 2F 72 2D 68 69 67 68 2D 73 74 2D 74 31 1D 28 6B 03 00 31 51 30 1B 61 00
Python (python-escpos)
from escpos.printer import Usb # or Network("192.168.1.50")
from escpos.constants import QR_ECLEVEL_M
p = Usb(0x04b8, 0x0202) # your printer's vendor and product id
p.set(align="center")
p.qr("https://b59.link/r-high-st-t1", ec=QR_ECLEVEL_M, size=4, native=True)
p.cut()Before every till prints it
- Print a test receipt and scan it with an old phone, in dim light, at arm's length. Then fold it, keep it in a wallet for a day and scan it again.
- Keep the link short. A short link per till makes a 25 × 25 code; a survey address with a receipt number can need 49 × 49, with squares half the size.
- Say what it opens in one line above the code (“Tell us how we did, 2 questions”), and keep it clear of the fold.
- Pale print? Thin white lines through the code mean dead dots on the print head; they cut through the totals too.
What a receipt code should open, how many people scan one and what thermal paper does to it over time: a QR code on a till receipt. Need a short link per till first? Make the set in one go.