A WhatsApp QR code is a link to wa.me drawn as a pattern. Scanning it opens a chat with your number, with a message already typed and waiting to be sent. Nobody installs anything, you do not need a WhatsApp Business account, and there is no service in the middle that could switch it off.
This is the reason a WhatsApp code fails, far more often than anything to do with the pattern. The link needs the number in full international form: country code first, digits only, and no national trunk prefix. The number on your business card is almost certainly not in that form.
| Written as | What wa.me needs | What happens otherwise |
|---|---|---|
| 07700 900123 | 447700900123 | WhatsApp says the number is invalid |
| +44 7700 900123 | 447700900123 | Fine — the + and spaces are removed |
| 0044 7700 900123 | 447700900123 | Fine — 00 is the dialling prefix, stripped |
| (555) 123-4567 | — | No country code, so there is nothing to dial |
What makes this expensive is when you find out. The link builds either way. The QR code scans either way. WhatsApp only tells the customer the number is invalid after they have scanned it — by which point the sticker is in the window and the menus are printed.
So this tool checks the shape before you print. Spaces, dashes, brackets and a leading + are stripped for you, and so is a 00 international prefix, since no phone number legitimately begins with a zero and the intent there is unambiguous. A remaining leading zero is flagged rather than silently removed: making it into a working number means knowing which country it belongs to, and a wrong guess would point your customers at a stranger’s phone. Numbers too short to contain a country code, or longer than the fifteen digits an international number is allowed, are flagged too.
One thing it cannot tell you: whether that number is actually on WhatsApp. That is a shape check, not an existence check, and finding out would take a request to WhatsApp — which this page does not make. Send yourself a test scan before you print a hundred of them.
The message is the part that makes the code work — it gives a customer who does not know what to say a way to start. It is also the only part whose length you control, and it travels inside the URL percent-encoded, so a space costs three characters and an emoji twelve. That lands directly on the printed code as finer modules. The same number, printed 30 mm square:
| Pre-filled message | Modules across | Module size at 30 mm |
|---|---|---|
| None | 25 × 25 | 0.91 mm |
| “Hello, I would like to know more about your product.” | 41 × 41 | 0.61 mm |
| The same, plus one 👋 emoji | 45 × 45 | 0.57 mm |
| Two sentences (85 characters) | 49 × 49 | 0.53 mm |
A one-sentence opener costs 64% more modules than no message at all; two sentences cost 96%, which makes the code nearly twice as fine at the same printed size. The working floor is around 0.4 mm per module. The single emoji costs more than the entire sentence it decorates.
None of that means skip the message. It means keep it to one line, and print the code a few millimetres larger than you were going to. Every figure above came from generating the real link and decoding it back.
Worth being clear about, because businesses sometimes treat it as a form. The text lands in the customer’s message box; they can edit it, or delete it, before sending. It is an opener, not a submission. Two consequences follow.
It is read through glass, often at an angle, sometimes into direct sun, by someone standing on a pavement rather than leaning in. Three habits follow, and the first is the one businesses get wrong: put it at eye level, not at the bottom of the door. A code at knee height is read by nobody, however well it is made. Second, give it a white tile of its own rather than dropping it onto a dark vinyl panel — the clear margin around the pattern is part of the code, not styling. Third, size it for the pavement, not for the desk you designed it on: a code reads from roughly ten times its own width, so a 50 mm sticker is about half a metre, and somebody standing back from the glass is further away than that.
The rest of the printing question — minimum size, contrast, error correction, what file to send a printer — is the same for every kind of code, and it has a page of its own with the measurements on it: printable QR codes and what actually makes them scan.
One thing that is specific to WhatsApp, though: test it with a stranger’s phone before you print a run. Not yours. Yours already has the number in its address book and a WhatsApp session open, which hides exactly the failure this page opens with — a number in the wrong format behaves very differently on a device that has never seen it.
The code is worth printing wherever somebody is already holding their phone and has a question you can answer in a sentence. It is a poor fit wherever the next step is a form.
| Placement | Opening message that works | Why |
|---|---|---|
| Shop window, after hours | “Hello, are you open tomorrow?” | The question people actually have at a closed door, and it answers itself in one reply |
| Table tent or menu | “Hello, I’d like to order from table __” | Leaves a blank the customer fills, so the first message already carries the table |
| Delivery note or invoice | “Hello, about order __” | Turns a support email into a thread, and the customer supplies the reference |
| Trade stand | “Hello, we met at __” | A conversation that survives the journey home, unlike a business card |
| Product packaging | “Hello, I have a question about __” | Cheaper than a printed manual and it reaches a person |
Two placements to think twice about. A receipt is usually thrown away before anyone scans it, and the moment for a question has passed. And anywhere the answer is really a booking, a payment or a form, the code should point at that instead — a chat that ends with “can you fill this in” has cost the customer a step rather than saving one.
One habit that saves more grief than anything else on this page: put a person behind it before you print it. A code on a window is an invitation to message at 9pm on a Sunday, and an unanswered WhatsApp reads as a closed business rather than as a business that is closed. Set an away message, or do not print the code.
The number is inside the pattern, so there is no re-pointing it. Moving to a new number, or switching the business onto a different handset with a different SIM, means reprinting everything that carries the old one. That is the static trade in its most concrete form, and it is worth a moment’s thought before an order of several thousand flyers.
The hedge, if you expect the number to move, is to point the code at a short page on your own website that carries the WhatsApp link, rather than at wa.me directly. You lose the one-tap directness — the visitor gets a page with a button instead of a chat window — and you gain the ability to change the number without reprinting. For a sticker on a shopfront that will outlive the phone, that is usually the better trade; for a leaflet with a three-week life, it is not.
Codes get scanned from screens more than people expect — somebody sees your post on a desktop and photographs it, or opens your PDF on a laptop. A wa.me link opened on a computer goes to WhatsApp’s web interface, which needs the visitor’s phone to have been paired with it already. If it has not, they land on a page asking them to scan a different QR code with their phone, which is a confusing place to send somebody who was simply trying to ask about your opening hours.
Nothing about the code fixes that, and it is not a reason to avoid one — the overwhelming majority of scans are from the phone that holds the WhatsApp account, which is exactly the case it is designed for. It is a reason to make sure a phone number or an email address appears somewhere near the code in plain text, so the desktop visitor has a route that does not depend on pairing.
The link is inside the pattern. There is no redirect, no short link and no dashboard, so nothing can stop working because a subscription lapsed, and nobody is keeping a list of who scanned your window. Generators that offer scan statistics do it by pointing the code at their own server first — that is what makes counting possible, and it is also what makes the code theirs rather than yours.
The honest trade: a static code cannot be re-pointed. If your number changes, you reprint. For a business phone number that is usually the right side of the bargain.
Making it is private too. The number and the message are turned into a pattern by code running in your own browser — the page has no fetch, no XMLHttpRequest and no form, so there is no route for either to leave your machine. You can confirm that from the Network tab in about thirty seconds.