# QR codes on thermal printers — dots, density and fading

> Thermal label printers are 203 or 300 dpi, so each module must be a whole number of printer dots — at 203 dpi one dot is 0.125 mm and a readable module needs at least four. Use the printer's native QR command rather than an image, and remember direct thermal prints fade in weeks to months in heat and light.

Source: https://useqr.app/docs/print/thermal-printer-qr-codes · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The dot grid is the law

A thermal head is a fixed row of heating elements: **203 dpi (0.125 mm dots)** on most
receipt and shipping-label printers, **300 dpi (0.085 mm)** on finer label models. There is
no sub-dot rendering — every module edge lands on a dot boundary or gets rounded to one.
Two rules follow:

1. **Each module must be a whole number of dots.** A module requesting 3.6 dots prints as
   an irregular mix of 3- and 4-dot modules, and the decoder's sampling grid drifts off the
   pattern.
2. **Use at least 4 dots per module** — the floor established in
   [DPI for printing](/docs/print/qr-code-dpi-for-printing). Below that, single-dot
   rounding errors are a large fraction of each module.

| Dots per module | Module at 203 dpi | Module at 300 dpi |
|---|---|---|
| 3 (marginal) | 0.375 mm | 0.254 mm |
| **4 (floor)** | **0.500 mm** | **0.339 mm** |
| 6 (comfortable) | 0.750 mm | 0.508 mm |
| 8 | 1.000 mm | 0.677 mm |

## What fits on a real label

At 203 dpi with 6-dot modules (0.75 mm), a version 4 code — 33 modules, 41 with
[quiet zone](/glossary/quiet-zone) — is a 30.8 mm square: comfortable on a 4 × 6 in
shipping label alongside the address block, and workable on a 40 × 40 mm product label at
4-dot modules (20.5 mm). Receipts are narrower than they look: an 80 mm-wide receipt has
~72 mm printable, but keep the code small enough that the payload stays low-version —
[longer URLs make denser codes](/docs/spec/why-longer-urls-make-denser-codes), and dense
codes on 203 dpi paper are where failures start. Check any payload–size pairing with the
[size calculator](/size-calculator).

## Send the command, not a picture

Every serious label language generates QR codes in firmware — `^BQ` in ZPL, equivalents in
EPL, TSPL, DPL and ESC/POS. Firmware places each module on exact dot boundaries; a raster
image sent from a design tool gets resampled onto the grid and reintroduces the rounding
you are trying to avoid. Settings and workflow live in
[Zebra and label printer settings](/docs/print/zebra-and-label-printer-qr-settings), and the
full command syntax in the [ZPL reference](/docs/print/zpl-qr-code-command-reference). If
you must send an image (some consumer printers accept nothing else), generate the PNG at
**exactly** the dot dimensions — e.g. a 41-module code at 6 dots is 246 × 246 px — so pixels
map 1:1 onto dots.

## Direct thermal fades — plan for it

Most receipt printers and many label printers are **direct thermal**: no ink, the paper
itself darkens under heat. The chemistry keeps reacting after printing. In a wallet, a car,
a sunny window or any warm environment, expect the print to fade — or the whole label to
darken — within **weeks to months**; in cool, dark storage, a year or more. A QR code
degrades before it disappears, losing contrast until scans get flaky. If the code must
outlive a delivery cycle, specify **thermal transfer** instead — the decision table is on
[direct thermal vs thermal transfer](/docs/print/direct-thermal-vs-thermal-transfer-for-qr).

## Watch for dead elements

A burnt-out heating element prints a clean white vertical line down every label — through
the code. One dead dot inside a 4-dot module is survivable; a dead dot on a module boundary
can flip a whole column. Print a solid black test box weekly, look for white streaks, and
spot-scan production labels — the habit that catches it is the verify station described in
[why verify that your QR code decodes](/docs/developers/why-verify-that-your-qr-code-decodes).

## FAQ

### What size should a QR code be on a 203 dpi thermal printer?
Make each module a whole number of dots, at least four — 0.5 mm per module. A typical short-URL code (version 3–4) then comes out between 18 and 31 mm wide depending on dots per module.

### Why is my thermal-printed QR code blurry or unreadable?
Usually fractional module sizes from sending a scaled image. Use the printer's native QR command, or generate the image at exact dot dimensions so each module maps to whole printer dots.

### How long does a QR code last on a thermal receipt?
Direct thermal paper fades in weeks to months in heat, sunlight or a wallet — sometimes faster on a dashboard. For anything that must remain scannable beyond a delivery cycle, use thermal transfer with a ribbon.

### Can I print QR codes on a receipt printer?
Yes — ESC/POS and similar command sets generate QR codes in firmware. Keep the payload short so the module count stays low, and expect the print to fade with time and heat.

## Try it

- https://useqr.app/url
- https://useqr.app/validate
- https://useqr.app/size-calculator
- https://useqr.app/bulk
