SMS QR code generator
100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.
SMS settings
Design
Add a centre logo
The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.
More design options
The dark half of the code. Keep it well below the background in lightness.
Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.
Contrast 11.5:1 between the modules and the background.
PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.
A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.
The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.
Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.
Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.
The ring of the three finder patterns.
The eye inside each finder pattern.
The blank margin around the code, measured in modules. 4 is the specified minimum.
Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.
A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.
Live preview & export
Enter the number the message should go to.
Export
Raster, for screens
Complete the form to enable the downloads.
Export size and encoded text
- Payload
- Nothing encoded yet
- Symbol
- Not built yet
- Recovery
- M
Waiting for input
An SMS QR code opens the phone's messaging app with your number in the To field and a message already written. The sender still has to press send, and their carrier still charges for the message at their normal rate.
When someone scans it
The phone opens its messaging app with the number and the draft text filled in. The person taps send themselves.
Why SMSTO: rather than sms:
The payload written here is SMSTO:+447700900123:STAND14 please send the price list. The number sits between the first and second colon and the message runs to the end of the string. The syntax comes from the ZXing barcode project; there is no RFC behind it, and it became the common choice because it is what the widest range of scanner apps read and write.
The formally specified alternative is the sms: URI from RFC 5724, written as sms:number?body=text. It is a real standard, but implementations diverge in exactly the place that matters here. Handling of the body parameter and of multiple recipients differs between iOS and Android, so a code built on sms: works on one platform and produces an empty draft on the other.
Only the first colon after the prefix is a delimiter. A reader takes the number up to it and everything after it as the body, so a colon or semicolon inside the message is passed through exactly as typed and needs no escaping. Escaping it would be the worse failure: every reader that does not unescape would put a visible backslash into the draft. The number cannot break the separator either, because it is reduced to a plus and digits before it is written.
Getting the number right
Write the number in E.164 form: a leading plus, the country code, then the subscriber number with nothing else in it. A UK mobile printed as 07700 900123 becomes +447700900123, dropping the national trunk zero after the country code. Spaces, brackets and dashes are stripped before encoding, but the trunk zero is not something a generator can guess at, so it has to come out when you type it.
The plus matters more than it looks. Without it the phone treats the digits as a national number and dials them against whatever country the SIM is registered to, so a code printed for a shop in Bristol fails for a visitor with a German SIM standing in front of it.
Five- and six-digit short codes are a separate system. They are allocated per country and per carrier, they do not take a country code, and they are not reachable from a foreign network. If you print one, expect it to work only for domestic subscribers on the carriers that provisioned it.
Message length, encoding and cost
One SMS segment holds 160 characters when the text fits the GSM 7-bit alphabet. A single character outside that alphabet switches the whole message to UCS-2 and drops the limit to 70 characters per segment, and emoji always trigger that switch. Longer messages are split and reassembled, and the sender is charged for each segment.
The same characters cost twice inside the QR code. Anything outside ASCII is stored as UTF-8 in byte mode, so an accented word or an emoji uses two to four bytes per character and pushes the symbol up a version.
A short reference word is usually the point of a pre-filled SMS. It arrives as an ordinary text from an ordinary number, so it is the sender's message to keep or edit, and there is no delivery receipt and no guarantee they send it at all.
Questions and answers
Does the message send by itself?
No. The scan can only open a draft in the messaging app. The recipient number and the text are filled in, and the person reads, edits or deletes the message and presses send. Nothing leaves their phone until they do.
Why does this use SMSTO: instead of the sms: standard?
SMSTO: has no RFC but is the syntax scanner apps read most consistently. RFC 5724's sms: URI is properly specified, yet iOS and Android differ over how the body parameter and multiple recipients are handled, so a body written that way can arrive empty on one of the two platforms.
Can I use a five-digit short code?
You can encode one, but it will only work for subscribers in the country and on the carriers where the short code is provisioned. Short codes take no country code and are not reachable from abroad, so a visitor with a foreign SIM gets a failed send rather than a useful error.
Do emoji work in the pre-filled text?
They do, at two costs. On the carrier side an emoji forces the whole message into UCS-2, cutting a segment from 160 characters to 70. In the QR code an emoji occupies four bytes of the payload, so a handful of them can push the symbol up a version.
How a static QR code works
Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.
Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.