Skip to content

Best practices

QR code best practices, tested

63 rules for QR codes that scan the first time, from design and print to screens, placement and safety, each with what to avoid. Where guides disagree most, on inverted codes, logo size, contrast and minimum size, we tested Apple's own QR reader on simulated phone photos and give you our numbers.

  • 63 rules, 1 sentence each
  • 4 disputed rules tested
  • A checklist you can print

Section 1 of 8

Design that scans

Colour, a logo and a frame tell people whose code it is and what it opens. Keep them inside these limits and the code still scans.

  • Deep violet on whiteDark to a camera, so it reads.

  • A margin of 2 squares or moreNothing printed inside it.

QR code that opens https://qrplify.com/

Scan to open qrplify.com

qrplify.com

  • 3 corners left wholePhones find the code by them.

  • Logo 28% of the widthAt error level Q.

  • Says what the scan doesWith the address under it.

Avoid

  • Pale on whiteToo little contrast to read
  • Light on darkSome readers cannot find it
  • A logo too bigOver 30% of the width
  • Text in the marginWords run into the code
  1. Use a dark colour on a light background.

    Avoid: Pale colours, or colours close to the background.

    Why

    Black on white is safest. Dark blues, purples and greens on white read in our tests; red did too, but scanners that use red light miss it.

  2. Pick 2 colours that differ in brightness, not only in hue.

    Avoid: Pairs like blue on green that turn the same grey.

    Why

    A blue and a green that look nothing alike failed all 20 of our simulated scans. Keep the pair at 3.5:1 or more: every pair from there up read on both readers.

  3. On a dark design, put the code on a light panel.

    Avoid: White squares straight on a dark background.

    Why

    Apple's reader read all 66 of our inverted images, but a second reader, OpenCV, read none in our colour test, and some fixed scanners cannot read them.

  4. Leave a clear margin at least 2 squares wide on every side.

    Avoid: Text, borders or pictures inside the margin, or a code trimmed to its edge.

    Why

    In our test, 2 squares read as well as the standard's 4 on white, dark and busy designs; at about 1 square, a common scanner library missed up to 1 in 4 on dark and busy ones. The standard asks for 4, so use 4 where there is room.

  5. Leave the 3 large corner squares whole.

    Avoid: Logos, frames or stickers over a corner.

    Why

    Phones find the code, and which way up it is, by these 3 squares. Cover any of them and the code may not read.

  6. Keep the code square, flat and undistorted.

    Avoid: Stretching, skewing, mirroring, shadows or heavy restyling.

    Why

    A squashed, mirrored or heavily styled code may not read at all. To resize it, keep its proportions.

  7. Keep a centred logo within 30% of the width, at level Q or H.

    Avoid: Big logos, and logos at level L or M.

    Why

    Measured with its white border, that size read on every code we tried, while logos covering 25 to 30% of the area, as some guides suggest, failed. Use H where it will get worn.

  8. Say what the scan does, next to the code.

    Avoid: A bare code, or words too small to notice.

    Why

    "Scan to see the menu" tells people what they get, and a logo alone does not. If only 1 app can read the code, name it.

  9. Keep any gradient dark from end to end.

    Avoid: A gradient that fades into a pale colour.

    Why

    Judge a gradient by its lighter end, and keep that end at 3.5:1 or more. Guides warn gradients can blur the squares, so test any you use.

What the camera sees

  • Blue on greenFailed all 20 simulated scans
  • Deep violet on whiteFar apart: the pair on the code above
QR code that opens https://qrplify.com/

On a dark design: a light panel

qrplify.com

Section 2 of 8

Size it for the distance

Size the code for the distance people scan from. The farther away they stand, and the longer the link, the bigger it needs to be.

  • 1 cm per 10 cmEach size matches the distance it is read from.

QR code that opens https://qrplify.com/, shown at the card size
Card: 2 cmRead from about 20 cm
QR code that opens https://qrplify.com/, shown at the table card size
Table card: 5 cmRead from 50 cm
QR code that opens https://qrplify.com/, shown at the poster size
Poster: 20 cmRead from 2 m

Not to scale. All 3 open qrplify.com.

  • 2 cm at the leastThe card size, for anything held.

  • 20 cm from 2 mThe poster size, for a wall.

  • The squares grow tooAbout 1 to 2.4 mm for each metre away.

Avoid

  • Too small for distanceCard size on a poster
  • Too dense to resolveLong link, tiny squares, blurred
  1. Make the code 1 cm wide for every 10 cm of scanning distance.

    Avoid: Sizing by eye, or by the space left over.

    Why

    Measure from where people will stand: from 50 cm it needs 5 cm, from 2 m, 20 cm. Add 20 to 30% for dim light, curves or older phones.

  2. Print it at least 2 cm across on anything people hold.

    Avoid: Codes under 2 cm on cards, labels and packs.

    Why

    A 1 cm code can be too small for reliable scans, so guides agree on 2 cm. Go bigger for long links or rough paper.

  3. For long links or long distances, check the size of the squares too.

    Avoid: A dense code sized only by the 10:1 rule.

    Why

    With a model 12 MP camera, Apple's reader needed squares of about 0.3 mm at 30 cm and 1 mm at 1 m. A dense code from 1 m needed up to 11 cm.

  4. From the nearest spot, check the whole code fits on a phone screen.

    Avoid: A wall code too big to frame from close up.

    Why

    Apple and Google both tell people to get the whole code inside the camera's view, so a code can be too big for where people stand.

Section 3 of 8

Paper, ink, finish and weather all change what a camera sees. Pick the material for where the code will live, and keep every square sharp.

  • Matte cardNo shine to throw glare back.

  • Flat, away from foldsSo the squares stay square.

QR code that opens https://qrplify.com/

Scan to open qrplify.com

qrplify.com

Printed on matte card

  • Dark ink, white stockClear contrast once printed.

  • Clear card all roundThe margin survives the trim.

Avoid

  • Gloss and glareLight bounces off the squares
  • Across a foldThe crease breaks the pattern
  • On a tight curveThe squares bend away
  • A blurry fileLow resolution, soft edges

Section 4 of 8

On screens and phones

A phone cannot easily scan a code on its own screen, so on phones, give people a link to tap. On every other screen, size the code in pixels and give it time.

  • On the big screenA code for phones across the room.

  • A solid light panelNever straight over video.

QR code on a screen that opens https://qrplify.com/

Scan to open qrplify.com

On the phone itself

Open qrplify.com

A link to tap, no code

  • A link on the phoneA phone cannot easily scan itself.

  • The same words on bothEach says what will open.

Avoid

  • Code on a phoneIts own camera cannot scan it
  • Over moving videoNo solid panel behind it
  • Up for 3 secondsGone before phones are out
  • Lost in dark modeA transparent file turns dark
  1. On a phone screen, give people a link to tap, not a code.

    Avoid: A code people must scan with the phone showing it.

    Why

    A phone cannot easily scan its own screen. On a page seen on phones and computers, put the link beside the code. A code that opens the page it sits on needs no link: people are already there.

  2. In emails, texts, social posts and videos, add a link people can tap.

    Avoid: A bare code in an email, which looks like phishing.

    Why

    Many will read them on the very phone the code needs. Safety advice also tells people not to scan codes in emails they did not expect.

  3. If people must scan a code on their own phone, tell them how.

    Avoid: Assuming everyone knows the screenshot route.

    Why

    Screenshot it, then press and hold the code in Photos on iPhone, or use Google Lens on Android. Many people do not know that: our scanning guide shows how. A code that opens the page it sits on needs neither steps nor a link, since nobody has to scan it.

  4. Use a code on a TV or computer to move people to their phone.

    Avoid: Making people type long addresses or passwords on a TV.

    Why

    That is where screen codes work best: the phone opens the page, or signs people in, with no typing. Passkeys can work this way.

  5. Show a screen code at least 150 pixels wide.

    Avoid: A big image shrunk by the browser or email app.

    Why

    Guides set about 150 pixels for a short link. Export it at the size shown, or as SVG: a shrunk image softens the edges of the squares.

  6. Give a screen code a solid white background, margin included.

    Avoid: Transparent files that vanish in dark mode.

    Why

    In dark mode, email apps can change the colours around an image, and a transparent code then sits on dark. A white background in the file keeps it dark on light.

  7. Leave a code on a slide or sign for at least 15 seconds.

    Avoid: A code that rotates away after a few seconds.

    Why

    People must notice it, find a phone, open the camera and aim. If the screen moves on sooner, show a short address instead.

  8. On TV, show the code on a solid panel for 10 seconds or more.

    Avoid: A small code flashed over moving video.

    Why

    TV guides ask for 5 to 10 seconds at the least, or the whole spot, at about 15% of the screen width. Say it in the voiceover, and test from the sofa.

Section 5 of 8

Make the code

What the code holds, and its error level, decide how many squares it has. Shorter content means fewer, bigger squares at the same print size.

  • Short content, big squaresIt can print smaller and still read.

QR code that opens https://qrplify.com/, 25 squares across
qrplify.com: 25 squares20 characters. Opens qrplify.com.
QR code that opens https://qrplify.com/blog/how-small-can-qr-codes-be-and-still-scan-reliably/?utm_source=qrplify&utm_medium=qr-code, 45 squares across
With tracking tags: 45 squares113 characters. Opens the post on minimum size.
  • Tracking tags add squaresSame width, finer squares, harder to read.

  • Error level M for bothEnough for clean indoor print.

Avoid

  • Squashed to fitThe layout broke the square
  1. Keep what the code holds short.

    Avoid: Long addresses with tracking tags pasted into the code.

    Why

    At level M, qrplify.com makes 25 squares across, and a blog page with tracking tags, 113 characters, makes 45. With fewer squares, each prints bigger at the same size.

  2. Put the full address in the code, starting with https://.

    Avoid: A bare domain, or a page without HTTPS.

    Why

    The https:// tells the phone it is a web link. People are also told to look for HTTPS before they trust a page.

  3. Link to the exact page the code promises, not your home page.

    Avoid: A home page, a sign up wall or an unrelated offer.

    Why

    People expect the page to match where they found the code: "Scan to review us" should open the box to write in.

  4. Make the page work on a phone, and load fast.

    Avoid: A desktop page that is slow or hard to read.

    Why

    Everyone who scans arrives on a phone. A page that renders poorly or loads slowly wastes the scan.

  5. Use error level M indoors, Q or H with a logo, and H outdoors.

    Avoid: Level H everywhere, or L on print that will wear.

    Why

    A higher level can add squares: the blog page's code grows from 45 at M to 57 at H. Use what the place needs.

  6. Test the printed proof with 3 phones, in the light where it will hang.

    Avoid: 1 scan on your own phone, from the screen.

    Why

    Use a current iPhone, a current Android and 1 a few years old, at the real distance, straight on and at an angle. Our tests did not cover Android phones.

  7. Test again once the code sits in the final layout.

    Avoid: A layout that trims the margin or shrinks the code.

    Why

    Layout tools can crop the margin, resize the code or swap in a blurry copy. The QR code decoder shows exactly what a file holds.

Static or dynamic?

A static code holds your content in its pattern: it needs no account, and it can never change. A dynamic code holds a short link: you can change where it goes after printing and count its scans, and it keeps working while the provider keeps that link running.

Choose dynamic when the destination may change, when you want scan counts, or when the address is long. Static vs dynamic QR codes compares them in full.

Section 6 of 8

Pick the right type

Most jobs need a plain web link. Choose another type only when it saves people a step.

  • A web link by defaultEvery phone camera opens it.

Web link QR code that opens https://qrplify.com/
Web linkOpens qrplify.com.
Contact card QR code with QRplify's email and website
Contact cardOffers to save QRplify's email and website.
  • A contact card for detailsA scan offers to save them.

  • More fields, more squaresKeep only what people need.

  1. Use a web link for anything that lives on a page.

    Avoid: A special type when a plain page would do.

    Why

    Every phone camera opens a web link, and you can update the page behind it at any time.

  2. Use a contact card for your details, with only the fields people need.

    Avoid: A full contact card printed at the smallest size.

    Why

    A scan offers to save them to the phone's contacts. Each field adds squares, so for long details, link to a contact page instead.

  3. Use a WiFi code only where sharing the password is fine.

    Avoid: A WiFi code for a private or staff network.

    Why

    The password sits inside the code, and the phone asks before it joins. A short password keeps the code simpler.

  4. For a phone number or email, use the call or email type.

    Avoid: Plain text, or a number without its country code.

    Why

    The right type opens the dialler, or a new email addressed to you. Add the country code so the number works from abroad.

  5. For an app, use 1 link that sends each phone to its own store.

    Avoid: An iPhone only code, or an app link with no fallback.

    Why

    The same code then serves the App Store and Google Play. If it opens inside your app, people without the app still need a useful page.

  6. If a menu or document may move to a new address, use a dynamic code.

    Avoid: A static code to a PDF you will replace.

    Why

    A static code to a page you edit keeps working. A dynamic one also survives a new file or a new address.

  7. Use a calendar code to add an event to the phone in 1 tap.

    Avoid: A calendar code for an event whose date may change.

    Why

    A tap adds the event to the calendar and shows its details. The date sits in the code, so use a web page for events that may move.

Section 7 of 8

Place it where people scan

A code works where people have a reason, a moment and a free hand to scan it. The table below gives a size and a spot for each use.

  • Upright on the tableEasy to aim at from a seat.

  • Where people sitTime and a free hand to scan.

QRplify

QR code that opens https://qrplify.com/

Scan to open qrplify.com

qrplify.com

  • Says what the scan doesBefore anyone lifts a phone.

  • The address under itTo type it, or check where it goes.

Avoid

  • Flat on the tableHard to aim at when seated
  • Where people rushNo time to stop and scan
  • 2 codes, no labelsPeople scan the wrong one

By use

UseSizeWhereAvoid
Business card Size2 to 2.5 cm WhereA plain area, with its margin kept clear. AvoidA full contact card squeezed in small.
Flyer or menu Size2.5 to 4 cm WhereA flat panel, beside the offer it opens. AvoidA fold, gloss, or a corner nobody reads.
Table card Size4 to 5 cm WhereUpright, in the middle, facing the seats. AvoidA sticker flat on the table top.
Poster Size10 to 15 cm WhereAbout 1 to 1.6 m up, where people wait. AvoidNear the floor, or above head height.
Shop window Size15 to 25 cm WhereAt eye height, with a white back. AvoidGlare, or a code with nothing behind it.
Packaging Size3 to 4.5 cm WhereThe flattest panel, away from folds and seams. AvoidCurves, seams, or 2 codes side by side.
Receipt Size2.5 to 4 cm WhereLinking to a review or a return offer. AvoidThe menu, for guests already leaving.
Direct mail Size2.5 to 4 cm, as for a flyer WhereOn the message side, beside the offer. AvoidThe lower right of the address side, kept for US postal barcodes.
Vehicle Size45 to 75 cm WhereA flat panel, seen when the van is parked. AvoidHandles, wheel arches, and hopes of highway scans.
Billboard Size3 to 9 m, read from 30 to 90 m WhereOnly where people stand still, such as platforms. AvoidRoadside boards: show a short address instead.
Clothing Size5 cm or more WhereCentre chest, on fabric that does not stretch. AvoidRibbed or stretchy fabric, seams and folds.
Event badge Size2 cm or more WhereOn the front, matte, clear of the lanyard. AvoidThe bottom edge, where lanyards and jackets cover it.
Email signature or social post Size256 px WhereBeside a link people can tap. AvoidA code alone: phone readers cannot scan it.
  1. Put the code where people already look, next to what it is about.

    Avoid: A code tucked in a corner, far from its topic.

    Why

    People read things that sit close together as related. A code beside what it describes gets noticed; a code in a far corner gets missed.

  2. Place it where people can stop and hold a phone still.

    Avoid: Moving vehicles, roadside signs and busy doorways.

    Why

    Tables, counters, queues, platforms and waiting rooms give people time. On a moving van or a road sign, there is none.

  3. Hang wall codes between chest and eye height, about 1 to 1.6 m up.

    Avoid: Codes near the floor, or above head height.

    Why

    Guides range from 90 cm, for people who sit or use a wheelchair, to 1.8 m. Tilt a high wall screen down.

  4. Check the light where the code will hang, at the hour people use it.

    Avoid: Glare, deep shadow, or a dim corner.

    Why

    A code that scans at noon can fail under evening lamps. In a dim place, print it bigger or light it.

  5. Show 1 code per surface, or label each and keep them apart.

    Avoid: 2 unlabelled codes side by side.

    Why

    With 2 codes in view, a phone may pick the wrong one. A single code to a page of links often works better.

  6. Give each placement its own code, to see where people scan.

    Avoid: The same code on the window, the menu and the flyer.

    Why

    Separate dynamic codes count scans for each spot, so you can see which spots earn their space and which to drop.

  7. Treat the table's sizes as a floor, and go bigger when in doubt.

    Avoid: Copying a size from a different use.

    Why

    Guides differ: a business card from 1.5 to 2.5 cm, a flyer from 2.5 to 4 cm. A bigger code costs a little space; a smaller one can cost the scan.

Section 8 of 8

Where the scan goes

A code tells people nothing about where it leads until they scan it, and scammers stick their own codes over real ones. Show the address, keep the page working, and make a fake easy to spot.

  • The address, printedUnder the code, for people to check.

  • A design people knowA plain sticker over it stands out.

QR code that opens https://qrplify.com/

Scan to open qrplify.com

qrplify.com

After the scan, before the page opens

Websiteqrplify.com

The address matches the one under the code.

  • The address, on the phoneShown after the scan, before the page.

  • The 2 matchYour own domain, easy to check.

Avoid

  • A sticker on topA fake pasted over yours
  • No address shownPeople cannot tell where it goes
  1. Print the address under the code: at least the domain, and the path when it is short.

    Avoid: A code with no address, or a different domain.

    Why

    Phone cameras usually show the domain before the page opens, so people can check the 2 match. A short path also helps anyone who would rather type the address.

  2. For a dynamic code, prefer a short link on your own domain.

    Avoid: An unfamiliar short link people cannot place.

    Why

    The phone shows the short link, not your page, and people are rightly wary of shortened links. Scammers abuse the popular shorteners.

  3. Point people to the camera app already on their phone.

    Avoid: Asking people to download a scanner app first.

    Why

    Current iPhones and most Android phones read codes in the camera, and the UK's NCSC advises using the scanner that comes with the phone rather than one from an app store.

  4. Check your codes in public places often for stickers stuck over them.

    Avoid: A new sticker on an old sign, left unnoticed.

    Why

    UK victims reported losing £3.5m to QR code scams in 2024. Scan each code, check where it goes, and teach staff what a fake looks like.

  5. Make public codes hard to fake: your own design, under plastic.

    Avoid: Plain paper codes anyone could copy and cover.

    Why

    A plain sticker over your branded code is easier to spot, though fakes have copied real logos. Bring outdoor codes in after closing.

  6. If your logo is drawn as a code, make it open your own site.

    Avoid: A logo whose code opens another site, or is the only way to reach a page.

    Why

    It is a brand mark that people are not meant to scan, so it can sit light on dark, small, or beside other codes. Some readers will miss it: in our test, Apple's reader and ZXing read all 32 light-on-dark codes, and OpenCV none. Ours, at the top of this page, opens qrplify.com.

  7. In photos and illustrations, show only real codes that open a real page.

    Avoid: A pattern that only looks like a code, or a stock image's code that opens someone else's page.

    Why

    A code inside a photo or illustration is scenery: it need not scan off the screen. Someone may still try to scan it, so it must decode from the full-size image and open a real page. The QR code decoder shows what an image holds.

  8. If people pay by code, offer another way to pay beside it.

    Avoid: Payment by code as the only option.

    Why

    Fake codes turn up most on car park payment machines, and safety advice is to avoid paying by code. A card reader, an app or a phone line lets wary people still pay.

  9. Ask for as little personal information as you can on the page.

    Avoid: Card details or a login asked for right after a scan.

    Why

    Canada's cyber safety advice calls a page that asks for unnecessary personal information a warning sign. A page that asks only for what it needs is easier to trust.

  10. Check the signal where the code hangs: a web page needs it.

    Avoid: A web menu in a basement with no signal.

    Why

    Phones read the code offline, but the page needs a connection. Where signal is weak, offer guest WiFi, or a code that holds the text itself.

  11. Keep the page working and current for as long as the print is out.

    Avoid: A dead link, or last year's offer still showing.

    Why

    Printed codes outlive their events, so send late scans to what is current. Do QR codes expire? covers what stops each kind.

Method

How we tested

What we read, how we read it, and what we left out.

Guides disagree on inverted codes, logo size, contrast and minimum size, so we tested them on 18 October 2026. We made 2 real codes, one for a short address and one for a long address with tracking tags, and read 7,344 images of them with Apple's Vision framework, the code reader built into Apple's devices, on a Mac. Some images were clean files. The rest were made to look like phone photos, with a slight turn, blur, noise and JPEG compression.

18 control checks ran first: clean codes read, and a blank image and codes with their corner squares wiped read as nothing, as they should.

On 7 November 2026 we tested light-on-dark codes again, adding ZXing, an open-source reader, to Apple's and OpenCV. Apple's reader and ZXing read all 32 images, and OpenCV none.

What we did not test: a phone's live camera, Android phones, readers other than Apple's (beyond OpenCV in our colour test and ZXing on light-on-dark codes), real photographs, glare, curved surfaces, and more than 1 logo design.

Sources

45

Before you print

The checklist

All 63 rules as boxes to tick. Tick them here, or print the list.

Design9
Design
Size4
Size
Print10
Print
Screens8
Screens
Content7
Content
Type7
Type
Placement7
Placement
Safety11
Safety

Make yours

Make a code that follows every rule

Static codes are free with no account. A free account adds unlimited dynamic codes you can edit after printing.