# Zebra and label printer settings for QR codes

> Three settings decide whether a Zebra-printed QR scans: darkness (too high bleeds modules together, too low prints grey), print speed (slower is sharper; 2–4 in/s for dense codes) and using the native ^BQ command so modules land on exact dot boundaries. Then verify by scanning a label from every new roll.

Source: https://useqr.app/docs/print/zebra-and-label-printer-qr-settings · Last reviewed 2026-08-21 · UseQR is free forever, no signup.

---

## Darkness: the setting that ruins most codes

Darkness controls how much energy each heating element delivers. On Zebra printers the
absolute scale runs **0–30** (`~SD` in ZPL, or the driver's darkness slider), with `^MD`
applying a relative offset per label.

- **Too high**: heat spreads sideways beyond each element, dark modules grow and the light
  gaps between them close up, thermal's version of
  [dot gain](/docs/print/ink-spread-and-dot-gain-in-qr-codes). Codes look bold and fail.
- **Too low**: modules print grey and patchy, dropping below the contrast a decoder needs.

Start mid-range, print a test code, and step darkness down until the print just begins to
lighten, then back up two points. The correct value changes with **media**: every new label
stock or ribbon pairing deserves a fresh test, because a setting tuned for coated stock
will flood an uncoated one.

## Speed: slower is sharper

Print speed trades throughput for heat control. At high speeds the head has less time per
dot line, printers compensate with more energy, and edges smear along the feed direction,
modules become slightly rectangular. For QR codes, especially at
[4-dot modules on a 203 dpi head](/docs/print/thermal-printer-qr-codes), run **2–4 in/s**.
Reserve 6 in/s and above for labels without small barcodes. If a code scans at 2 in/s and
fails at 6 in/s, the answer is not more darkness. It is speed.

## Calibrate, and pick stock deliberately

Run media calibration after every roll change so the printer registers gaps correctly: a
mis-registered label can clip the code or its [quiet zone](/glossary/quiet-zone) at the
label edge. Stock choice matters as much as settings: direct thermal for short-lived
shipping labels, thermal transfer with the right ribbon for anything that must last: the
decision table is on
[direct thermal vs thermal transfer](/docs/print/direct-thermal-vs-thermal-transfer-for-qr).
Matt-topcoated synthetic stocks give the cleanest module edges; cheap uncoated paper
feathers.

## Use ^BQ, not an image

Generate the code in firmware with the `^BQ` command so every module lands on whole dot
boundaries: full syntax, magnification table and worked labels in the
[ZPL command reference](/docs/print/zpl-qr-code-command-reference). Sending a bitmap from a
design tool resamples the grid and softens edges. If your pipeline must ship images, request
exact-dot-size PNGs from the [keyless API](/docs/developers/free-qr-code-api-no-key), e.g.
`?size=246` for a 41-module code at 6 dots, and place them unscaled.

## The print-then-verify station

Settings drift: heads wear, rolls vary, someone nudges darkness for an address font. The
fix is procedural, not technical, a
[decode-verify](/glossary/decode-verify) step in the workflow:

1. **First label of every roll and every shift**: scan it with a phone from ~20 cm. Ten
   seconds. Use [the scanner](/scan) or any camera app, and confirm the decoded payload
   byte-for-byte, not just "it opened something".
2. **Automated lines**: photograph or scan a sample and post it to
   `POST /api/v1/decode`, comparing the result to the source data in the job: the
   reasoning is laid out in
   [why verify that your QR code decodes](/docs/developers/why-verify-that-your-qr-code-decodes).
3. **Weekly**: print a solid black box across the label width and inspect for white
   streaks from dead head elements.

A verify habit converts silent failure (a pallet of unscannable labels) into a ten-second
catch.

## FAQ

### Why do QR codes from my Zebra printer not scan?
Check darkness first: too high merges modules, too low prints grey. Then speed (drop to 2–4 in/s), then whether the code is sent as ^BQ rather than an image. Recalibrate after every media change.

### What darkness setting should I use for QR codes?
There is no universal number; the 0–30 scale interacts with media and speed. Tune per stock: step down until the print begins to lighten, then back up two points, and re-test with an actual scan.

### What print speed is best for QR labels?
2–4 inches per second for codes with small modules. Higher speeds smear module edges along the feed direction, which shows up as codes that scan intermittently.

### How do I catch bad labels before they ship?
Scan the first label of every roll and shift, and compare the decoded payload to the source data. For automated lines, photograph samples and verify them programmatically against the job data.

## Try it

- https://useqr.app/url
- https://useqr.app/validate
- https://useqr.app/scan
- https://useqr.app/bulk
