SMS QR Code Generator
This writes an SMSTO payload: a number and a message body, separated by colons. Scanning it opens a text message addressed and written, so the person only presses send. The body stays as plain text rather than being percent-encoded, which is the detail that decides whether the message reads properly or arrives full of %20.
A text message addressed and written — they only press send.
Appearance — all of it free
Caption
Print sizing
Both matter. Distance decides how big the code has to look; the printer decides how small a module it can hold. Whichever asks for more is the size to print.
Your code
Fill in the fields above and the code appears here.
What is actually inside this code
Note the spaces. They are real spaces, not %20 — and that is deliberate.
- Send to
- +1 555 123 4567
- Message
- Running 10 minutes late.
encodes as
SMSTO:+15551234567:Running 10 minutes late.
43 bytes — a version 4 symbol, 33 modules a side. The phone opens a text to that number with the message already written.
Why the message is not percent-encoded
SMSTO looks like a URI, so the instinct is to encode the body the way you would encode a query string. That instinct produces a broken message.
The reference implementation almost every scanner descends from splits `SMSTO:` at the first colon after the number and hands back everything after it verbatim. It does not percent-decode. So a body written as `Running%2010%20minutes%20late.` arrives in the message box exactly like that, percent signs and all, and the person has to retype it.
- Body as plain text
- Running 10 minutes late.
- Body percent-encoded
- Running%2010%20minutes%20late.
- What the phone shows
- Whichever one you wrote
There is no decoding step to save you. This tool writes the plain form, and shows you the string so you can see it did.
Capitalisation, of all things
The same reference parser matches the prefix only when it is entirely uppercase or entirely lowercase. `SMSTO:` works and `smsto:` works; `SmsTo:` does not match either branch and falls through as meaningless text. It is an odd thing to have to know, and it is why the prefix here is not something you can type.
SMSTO and sms: are two different formats
There is a proper standard for SMS links — `sms:+15551234567?body=…` — and its body genuinely is percent-encoded, because it genuinely is a query string. So both encodings are correct, for different formats, and mixing them is what goes wrong.
The awkward part is that the standard form is the weaker choice here. Apple's older URL-scheme documentation says not to put message text in a plain `sms:` link at all, while its QR guidance says Camera recognises SMSTO for prefilled content. When the whole point is a number and a message together, SMSTO is the form with the better-documented support.
A last thing worth saying on the printed card: scanning prepares a message, it does not send one. Wording that implies otherwise — "scan to confirm", "scan to cancel" — describes something the code cannot do, and sets up the person to assume a thing happened that has not.
Frequently asked questions
Should spaces in the message be encoded as %20?
No. The SMSTO body is handed to the messaging app verbatim, with no percent-decoding step anywhere in the chain, so %20 arrives as the literal characters %20 and the person has to retype the message. Write it as ordinary text. The encoded string shown on the tool is where to confirm it.
What is the difference between SMSTO and sms:?
Two separate formats. SMSTO is number and body separated by colons, with a plain-text body. The standard sms: URI takes the body as a percent-encoded query. Apple documents Camera recognising SMSTO for prefilled content while its older guidance says not to put text in a plain sms: link, so SMSTO is the better fit when you want both parts.
Does scanning send the message?
No. It opens the messaging app with the recipient and text already in place, and the person decides whether to send it. Worth keeping in mind when writing the caption: anything phrased as "scan to confirm" describes an action the code does not perform.
Why does the prefix have to be all one case?
Because the parser most scanners inherit checks for an all-uppercase prefix or an all-lowercase one and nothing in between. A mixed form like SmsTo: matches neither branch and is treated as plain text. This tool writes the uppercase form, so it is not something you have to get right yourself.
Other things a QR code can do
Every type, one tool
QR Code Generator
Colours, shapes, a logo, a caption, a print-size check and an A4 sheet — all of it free, none of it behind an account, and the code stays yours because the data is inside it rather than on our server.
Open the full QR code generator →