Browse the help centre

A WhatsApp QR code you can change after it is printed

How a live QR code works, why pointing one straight at a wa.me link is a risk, and how to put several numbers behind one printed code so a ban or a lost phone costs you nothing.

How-to

On this page

A QR code on a counter, a flyer or a shopfront window is printed once and lives there for years. The number behind it does not.

Most WhatsApp QR generators encode wa.me/65XXXXXXXX directly into the image. That works until the day it does not — and when it stops, it stops silently. A dead QR code produces no error anyone can see: the customer's camera opens WhatsApp, the chat goes nowhere or to a stranger, and they walk away. You find out weeks later, from the leads that never arrived.

Juno's growth widgets encode a link to us instead, and forward the scanner on. That one extra hop is the whole feature.

What a live code actually is

When you create a QR widget, Juno gives you a short link like juno.medpath.com/w/K7M2P9RD, and that is what the QR image contains. When somebody scans it:

  1. their phone opens our link,
  2. we look up where the code should currently point,
  3. we send them straight on to WhatsApp, with your prefilled message already in the box.

The scanner never sees the hop — it takes a fraction of a second and lands in the same place a direct link would. What changes is that the destination is a field in your console rather than ink on a wall.

Three things follow from that:

  • Changing your number is a form edit. Every poster, flyer, card and window sticker already printed keeps working.
  • The code becomes measurable. A direct wa.me QR is invisible until somebody happens to message you. Ours is counted at the moment of the scan, so you can tell "nobody walks past that poster" from "the poster works and the number is broken".
  • The short link is permanent. Juno never reissues it — not when you rename the widget, not when you retarget it. Reissuing would kill every code already printed, so it is simply not possible.

Putting more than one number behind one code

A single destination survives a number changing. It does not survive a number being taken away: an account restricted by Meta, a phone lost, a staff member who leaves with the SIM in their pocket. From that moment the code is a dead end for everyone who scans it.

So a code can point at a pool of numbers, and each scan is handed to one of them.

To set it up: Growth widgets → your code → Manage numbers → Add a number. Give each one a label your staff will recognise ("Front desk", "Dr Lim", "Second line") — labels are for you, and the customer never sees them.

Each number has a tick box, In rotation. That box is the point of the whole arrangement:

The morning an account is restricted, untick it. Every code already printed keeps working through the remaining numbers, with no reprint, no redirect service and no waiting.

Unticking is not deleting. The number keeps its history, so you can still see how much traffic it was carrying before it went — which is usually the first question anybody asks.

Random or in turn

Assignment decides how a scan picks a number:

  • In turn — each scan goes to the next number in the list, cycling. Traffic is split evenly and predictably. Choose this when the numbers are equivalent, for example three staff phones sharing a front desk.
  • Random — each scan picks a number at random. Over a busy day the split evens out; over a quiet morning one number may legitimately get nothing.

If you are unsure, choose in turn. Random is fine mathematically, but with three numbers and eleven scans somebody will notice one line was quiet and conclude the code is broken.

Numbers that are unticked are skipped by both, always.

What a live code will not do

Worth saying plainly, because rotation is sometimes sold as something it is not:

  • It is not a way around WhatsApp's rules. Every number in the pool must be one you are entitled to use, and each is judged by Meta on its own quality rating. Spreading messages across numbers to send more than the rules allow is exactly the pattern that gets all of them restricted.
  • It does not merge the conversations. A customer sent to number A has their chat with number A. If those numbers are connected to Juno as channels, every conversation lands in the same shared inbox regardless — which is the usual reason to run several.
  • It is not consent. Scanning a code starts a conversation; it is not permission to message somebody afterwards. See opt-in and opt-out.

Making it look like yours

A code taped to a counter is part of your shopfront, and a black square out of a generator looks like a black square out of a generator. Customise on any code offers a shape, a colour and an optional logo for the middle.

  • Shape — Classic (square), Soft (rounded) or Dots. Each option shows your actual code, so you are choosing a picture rather than a name.
  • Colour — six presets, or the picker for your own brand colour. The ground behind the code is derived from whatever you choose, so a custom colour looks as considered as a preset.
  • Centre logo — optional. We shrink whatever you upload, leave a margin around it, and raise the code's error correction so the parts it covers can be rebuilt. PNG, JPEG or WebP; a simple mark works far better in the middle of a code than a detailed one.

A colour that is too light is refused, and that is the one place we say no. Pale marks read on the screen where you picked them and fail on paper in a shop window — which you find out weeks later, from the leads that never came. So the colour is measured against the ground it will actually be printed on, and Save stays disabled until it clears. There is no "use it anyway", because the cost is paid by a poster already on a wall.

The look is stored against the code, so PNG and SVG download it the way you see it. Changing it does not change the link — everything already printed keeps working, it just looks different next time you print.

One habit worth keeping: after changing a code's look, scan it once with your own phone before it goes to a printer.

Reading the statistics

View statistics opens the code's own page. Over the last 30 days you get:

  • Total scans, and the daily shape of them — the answer to "has this poster gone quiet?"
  • By number — how the split actually landed. A number sitting at zero while the others move is a number to check.
  • Where from — the country, and where the network reports it, the city. This is how you find out the flyer in one mall is doing all the work.
  • Device and time of day — phone versus computer, and the hours people actually scan. A code that peaks after closing time is an argument for an automatic reply, not a bigger poster.
  • Recent scans — the visits individually, newest first, with Load more to page back through them. Useful for confirming a code works within seconds of testing it, and for finding the afternoon the scans stopped.

What we keep, and what we do not

The location comes from the network the scan arrived on, resolved at the edge before it reaches us. Juno does not store the IP address of anyone who scans your code, and there is nowhere in the record to put one. A country and a city answer everything a poster's owner needs; the address itself is an identifier belonging to a member of the public who pointed a camera at a sticker and agreed to nothing.

Nor do we keep the browser fingerprint. "Phone or computer" is derived at the moment of the scan and the rest is discarded.

Scan records are kept for a year by default and then deleted. Your lifetime counters — total scans per code and per number — are not affected by that.

Printing it

PNG for anything digital or small; SVG for a printer, because it stays sharp at any size. Both encode the same permanent short link.

Two practical notes from codes that did not work:

  • Test it before it goes to print. Scan it with your own phone, then open View statistics — your scan should be there. It takes ten seconds and catches the one mistake that is expensive to fix.
  • Say what the code is for. "Scan to chat with us on WhatsApp" beside the image roughly doubles what a bare square gets, and it is also the honest thing to do: people should know what opening it will do.

If a code stops working

  • "This code is not set up yet." — the code resolves, but every number behind it is unticked or there is none at all. Add or re-tick a number; the printed code itself is fine.
  • "This code is no longer active." — the widget was deleted. Nothing can bring the code back; a deleted widget's link is gone for good, which is why deleting one asks first.
  • It scans, opens WhatsApp, and nobody replies. — the code is doing its job and the problem is further along. Start with messages not arriving.