How Do I Make a QR Code That Sends a Text Message?
An SMS QR code holds a phone number and a message, like SMSTO:+15105550101:JOIN. Scanning opens a ready text; the person still taps Send.
To make a QR code that sends a text message, encode an SMS link that holds the phone number and the message, such as SMSTO:+15105550101:JOIN. Any QR generator with an SMS option builds this for you. When someone scans it, their phone opens a new text with both fields filled in, and they tap Send.
What goes inside an SMS QR code
The code holds a short line of text that starts with a scheme, then the number, then the message. The phone’s camera reads that line and hands it to the messaging app. Two formats are in common use, plus an older Apple one that leaves the message out.
| Format | Example | Carries a message? |
|---|---|---|
| SMSTO | SMSTO:+1123456:This is a SMS stored in a QR Code! | Yes |
| sms with body | sms:+15105550101?body=hello%20there | Yes |
| sms, number only | sms:12345 | No |
The SMSTO form is what most generators produce. goQR.me’s format page gives the pattern as SMSTO:[number]:[message]. Oddly, it has no formal spec. The ZXing wiki, which documents what barcode readers expect, says SMSTO links “have been observed in the wild, though I am still looking for an official specification for it.”
The sms form is the standard one. RFC 5724 defines it, with the message in a body field made of percent-encoded UTF-8 characters. That’s why a space becomes %20.
Apple’s own archived SMS link reference is stricter. It says the URL “must not include any message text or other information.” That page was last updated in 2017. Current iPhones do fill in a body, but the old rule is why older guides warn that the message may be missing.
How to make an SMS QR code, step by step
Making one takes four steps: pick the number, write the message, generate the code, and test it on two phones.
- Use international format for the number. goQR.me recommends the full form with the plus sign and country code, like
+15105550101, so the code works for a visitor from another country. - Write a short message. Keep it under 160 characters, which is the limit goQR.me gives. A single keyword like
JOINis often all you need. - Generate the code. Choose the SMS type in your generator, paste the number and message, and download a PNG or SVG.
- Test on an iPhone and an Android phone. QuickChart’s SMS QR guide says plainly that behaviour varies between devices, so check both before you print.
You can also type the SMSTO line into any generator’s plain text mode. You get the same code. For print size and placement, our guide to QR code size for printing covers the minimums.
What happens when someone scans it
When someone scans a text-message code, their phone opens a new message with the number and text filled in. The ZXing wiki describes the expected behaviour: readers “should open a new SMS message, ready for the user to compose and send it.”
RFC 5724 backs that up. It says opening an sms link “SHOULD NOT cause a message to be sent without prior user confirmation.” That matters for two reasons:
- You can’t use the code to send texts on someone’s behalf. They see the message and can edit or delete it.
- Your call to action has to ask for the tap. “Scan and hit Send to join” works better than “Scan to join.” Our post on QR code calls to action has more wording examples.
Say a restaurant prints SMSTO:+15105550101:WAITLIST on the host stand. A guest scans, taps Send, and the restaurant’s texting system adds them to the queue.
Why a text-message QR code fails on some phones
Most scan failures here come from multiple recipients, a missing message body, or a code that’s too dense.
- More than one number. RFC 5724 allows a comma-separated list. But Seth Larson tested it in 2025 and found “Apple doesn’t implement RFC 5724 correctly for multiple recipients.” The comma list works on Android. iPhones need a different
sms://open?addresses=form. One number per code avoids the problem. - Message missing on scan. This is usually the scanner app, not the code. Try the built-in camera app before blaming the generator.
- Long messages. Every extra character adds modules to the pattern. A message near the 160-character limit makes a busy pattern that small prints struggle with. See why a QR code won’t scan for the other usual causes.
The limitation: an SMS QR code is static
A text-message code is static, so you can’t change the number or count the scans after it’s printed. The number and message sit in the pattern itself. If your shop changes its texting number, every printed code is wrong.
Static codes also give you no scan data. You’ll see the texts that arrive, but not the scans where someone opened the message and didn’t send it. Our post on static and dynamic codes explains the difference.
My take: put the number on a page when it might change
I’d use a plain SMS code only when the number is stable and the job is one tap, like a waitlist or a support line. For a campaign you want to measure, I’d point a dynamic code at a short landing page with a big “Text us” button. You lose one tap. You gain an editable destination and a count of how many people scanned, which you can compare with the texts you actually received. Our guide to tracking QR code scans covers that setup.
FAQ
Does scanning an SMS QR code send the text automatically?
No. The phone opens the messaging app with the number and message filled in, and the person taps Send. The SMS link standard says opening a link should not send a message without the user confirming.
How long can the pre-filled message be?
Keep it under 160 characters, which is the length guidance most SMS code guides give. Shorter is better anyway: a short message keeps the code less dense and easier to scan.
Can one code text more than one number?
The standard allows a comma-separated list, but iPhones don’t follow it for multiple recipients. Use one number per code if the code has to work on every phone.
Can I change the number in an SMS QR code after printing?
No. The code stores the number and message in the pattern itself, so it’s static. Changing either one means a new code.