What an SMS QR code is — the `sms:` URI and the keyword-driven opt-in flow
An SMS QR code encodes the sms: URI — the universal click-to-text protocol that has shipped on every smartphone OS since 2007. When the QR is scanned, the scanner's phone opens its native messaging app — iMessage on iPhone, Google Messages on Android — with your phone number and a pre-filled starter message already in the compose window. The sender reviews everything and taps Send.
The productivity win isn't saving the scanner from typing your number. The real value is the pre-filled body — usually a single keyword like JOIN, INFO, RSVP, MENU, or STOP — that drops the scanner straight into a CRM's automated opt-in funnel. The customer scans the QR labeled Text JOIN to 55555 for $5 off your next visit, the keyword goes through with no autocorrect mangling, your SMS platform (Twilio, MessageBird, EZ Texting, ActiveCampaign) parses the keyword, and the automation fires — confirming the opt-in, sending the coupon code, adding the contact to a list, scheduling follow-up touchpoints. No typing, no autocorrect, no abandoned attempts.
SMS open rates run 90%+ within three minutes, against email's 20% over hours — which is why text is the channel of choice for loyalty programs, political campaigns, restaurant tip lines, conference networking, real-estate property inquiries, and customer-support escalations. The SMS QR is the lowest-friction print-to-text bridge into that channel — generate one at EZQR's SMS QR generator.
The `sms:` URI format — what to encode, and the URL-encoding pitfalls that break print
The sms: URI follows a documented format that every major mobile OS implements consistently:
sms:+<E.164-number>?body=<URL-encoded-text>
- `+<E.164-number>` is the destination phone number in international E.164 format — leading
+, country code, no spaces, no dashes, no parentheses. US example:+15551234567. UK example:+447700900123. - `?body=` is the pre-filled message — must be URL-encoded. Spaces become
%20(or+), commas become%2C, ampersands become%26, line breaks become%0A.
Real examples:
- Opt-in:
sms:+15551234567?body=JOIN - Lead capture:
sms:+15551234567?body=INFO%20123%20Main%20St - Conference RSVP:
sms:+15551234567?body=RSVP%20JaneDoe - Restaurant tip line:
sms:+15551234567?body=TIP
Always use E.164 format. The +1 (555) 123-4567 formatting that humans read works in tel: URIs but breaks sms: URIs on some Android builds — the number gets parsed as text rather than a destination. Strip every character except the leading + and the digits.
URL-encode the body, always. A QR encoding sms:+15551234567?body=JOIN ME (with a literal space) fails to scan into Android Messages cleanly. Encode it as sms:+15551234567?body=JOIN%20ME (with %20) and both iMessage and Google Messages render correctly. EZQR's SMS QR generator handles the encoding automatically — paste the human-readable body and the generator outputs the correct URI.
Short bodies scan more reliably than long ones. Every additional character in the body adds to the QR's module count, which raises the print-size minimum and lowers the error-correction headroom for logos. For most opt-in flows, a single 4-6 character keyword (JOIN, MENU, INFO) is enough — the rest of the conversation happens in the SMS thread after the first send.
For the static-vs-dynamic decision see the static vs dynamic guide.
iPhone vs Android — how the same `sms:` URI renders differently
Both iMessage (iPhone) and Google Messages (Android) honor the sms: URI specification, but the rendering quirks differ enough to break naïve QR campaigns.
iPhone (iMessage): the scan opens Messages with the number in the To field and body pre-filled. iMessage auto-routes via iMessage (data, blue bubbles) or SMS fallback (green bubbles) — both land at your business SMS endpoint identically. iMessage tolerates loose URL-encoding (literal spaces sometimes work) and renders %0A as a line break.
Android (Google Messages): more conservative with body parsing — strips some Unicode and occasionally drops the body entirely if URL-encoding is malformed. Commas, ampersands, and line breaks are the failure points. Samsung Messages on some Galaxy builds has additional emoji-rendering quirks.
The required test: scan on at least one iPhone (iOS 18+) and one Android (Android 14+, Google Messages). Verify three things — number in E.164 format, body matches what you pre-filled, Send button enabled. If any fail on either platform, the URL-encoding is wrong. Fix and re-print.
For demographics that prefer voice, pair with a phone QR — the dual QR captures both.
Step-by-step: generate a print-ready SMS QR
The workflow from defining the destination + keyword to handing a print-ready file to the vendor:
Tips
- **Step 1: Get the destination number in E.164 format.** US business numbers as `+15551234567`. International as `+<country-code><number>`. Strip every character except the leading `+` and the digits.
- **Step 2: Decide the keyword or body.** Short, uppercase, unambiguous — `JOIN`, `MENU`, `INFO`, `RSVP`, `STOP`. Coordinate with whatever SMS platform parses the keyword (Twilio, EZ Texting, ActiveCampaign, your CRM webhook).
- **Step 3: Decide static vs dynamic.** Static for permanent counter signage, storefront windows, and printed receipts where the number and keyword won't change. Dynamic ($5/mo Lite) for short-lived campaigns, A/B keyword tests, and per-location attribution.
- **Step 4: Paste the number and body into [EZQR's SMS QR generator](/qr-codes/sms)** — the generator handles URL-encoding automatically.
- **Step 5: Customize colors and embed a logo if needed.** Set error correction to H if a logo covers more than 10% of the code — see the [error correction guide](/blog/qr-code-error-correction-levels).
- **Step 6: Export.** PNG for digital, SVG for vector print, PDF for press-ready — all unwatermarked on the free plan.
- **Step 7: Pair with explicit CTA copy** — `Scan to text JOIN for 10% off` or `Text MENU for daily specials` — in 10–12pt type beside the QR. The single highest-impact scan-rate tweak for any utility QR.
- **Step 8: Test on iPhone AND Android** before the print run. Verify the number, body, and Send button all behave correctly on both. URL-encoding bugs hide on one platform and surface on the other.
- **Step 9: Print a test copy at production size.** Counter signage at 4-5 cm; window decals at 8-12 cm; receipt footers at 1.5-2 cm. See the [QR code size guide](/guides/qr-code-size-guide).
Use cases — where the SMS QR earns its keep
SMS QRs deliver outsized returns on a handful of specific surfaces. Each matches a real audience pattern and a real opt-in or lead-capture context.
Loyalty-program opt-ins. Retail counters, restaurant table tents, coffee-shop chalkboards. Text JOIN to 55555 for a free drink on your next visit with the QR removes the friction of typing. Loyalty platforms (Five Star, Square Loyalty, Toast Loyalty) integrate with SMS providers for the keyword handler — the opt-in fires, the welcome reward returns as an SMS, the customer is in the list.
Lead capture for real estate. Yard signs, open-house cards, listing flyers. Scan to text INFO 123 Main St for price and showings — buyer scans, sends, the listing agent's SMS automation responds with photos, price, square footage, and a Calendly link.
Restaurant tip lines and feedback. Receipt footers, table tents, server name cards. Tip your server: Scan to text TIP 20 to 55555 — direct-to-server tipping has surged since 2023 as cashless tipping volumes rose.
Political and advocacy campaigns. Lawn signs, door hangers, rally handouts. Text PLEDGE to 55555 opt-ins drive donor lists, volunteer signups, and GOTV outreach inside FCC and TCPA rules.
Conference networking, RSVPs, and customer support escalations. Lanyard cards, sponsor booths, storefront windows, packaging. Scan to text RSVP YourName or Need help? Text HELP to 55555 — we reply in 15 minutes route into the right CRM queue with no laptop step.
For payment-adjacent SMS flows (tip lines, donation opt-ins), see the payment use case page and the small business playbook.
Long codes, short codes, toll-free — and the 10DLC carrier-registration trap
Before scaling any US-facing SMS QR campaign, the number on the other end has to be the right type — and registered with the carriers — or the messages get silently filtered. Three number types, three different cost and compliance profiles.
| Number type | Format | Throughput | Registration | Right surface |
|---|---|---|---|---|
| Long code (10DLC) | +15551234567 (10-digit) | ~1 msg/sec (carrier-tier dependent) | Required: 10DLC brand + campaign registration | Low/mid-volume business SMS, lead capture, loyalty |
| Short code | 55555 (5-6 digit) | 100+ msg/sec | Required: Common Short Code Administration + carrier vetting (3-8 weeks) | High-volume marketing, political, mass opt-in |
| Toll-free SMS | +18005551234 | ~3 msg/sec | Required: Toll-free verification through provider | National brands, healthcare, regulated industries |
Tips
- **Always register your 10DLC long code** through your SMS provider (Twilio, MessageBird, Bandwidth, EZ Texting). Unregistered 10DLC campaigns to US carriers get filtered silently — the SMS QR works in your own test, the customer scans, sends, and the message never lands at your CRM. This is the most common reason an SMS QR appears broken after launch.
- **Short codes are the right pick for campaigns above 100 messages/sec sustained** — political donor outreach, mass-market loyalty, large retail chains. The 3-8 week vetting process and $500-1500/month carrier fee are the trade-off.
- **Toll-free SMS suits regulated industries** (healthcare appointment reminders, financial alerts) where the brand-trust signal of a toll-free number matters. The verification process is faster than short codes (1-2 weeks) and the cost is lower.
- **International SMS QRs** route through the same `sms:` URI but each destination country has its own compliance regime (UK Ofcom, EU GDPR + e-Privacy, India TRAI). Check the destination country's bulk-SMS rules before publishing a QR at scale.
Common mistakes that break SMS QRs at scale
Five failure patterns we see repeatedly when teams scale from 'works on my phone' to 'campaign launches across 500 storefronts':
1. Skipping 10DLC carrier registration. The single most common silent-failure mode. The QR scans, the compose screen pre-fills correctly, the user taps Send — and the message gets filtered at the carrier before reaching your SMS provider. The user sees the bubble go through; you see nothing on the receiving end. Register every US long code through your SMS provider before any printed campaign goes live.
2. Bad URL-encoding in the body. Commas, ampersands, line breaks, and emoji in the pre-filled body must be URL-encoded as %2C, %26, %0A, and the appropriate %-codes. Naïve generators that just glue the literal body into the URI break on Android Messages and inconsistent iOS builds. EZQR handles encoding correctly; some competitors don't.
3. Phone number not in E.164 format. +1 (555) 123-4567 works in tel: URIs but breaks sms: URIs on some Android builds. Strip every character except the leading + and the digits. Always.
4. Missing opt-out language. US TCPA (Telephone Consumer Protection Act) requires marketing SMS to include a clear opt-out path — typically Reply STOP to unsubscribe. Your SMS provider's auto-response template should handle this on the first message, but if you write your own opt-in confirmations, the language has to be there. Audit before launch.
5. Printing the QR without prompt copy. Naked QRs on a counter sign convert at half the rate of QRs paired with explicit CTA copy. Scan to text JOIN for 10% off in 10-12pt type beside the QR is the single highest-impact tweak. Customers need to know what happens when they scan.
Tracking SMS-driven scans — when dynamic codes and CRM webhooks are worth the $5/mo
Static SMS QRs are free forever but aren't tracked — the QR encodes the sms: URI directly with no server in the loop. The downstream SMS receipt at your CRM is tracked, but you can't tie the scan back to a specific printed surface.
Dynamic QRs route through a redirect server (EZQR's, on the Lite plan and above) that resolves to the sms: URI on click — every scan logs timestamp, country, device, referrer in your EZQR dashboard. Lite ($5/mo) gives 25 dynamic codes; Pro ($10/mo) gives 100; Max ($20/mo) is unlimited.
When the $5/mo earns its keep for SMS:
Per-location and per-placement attribution. Same Text MENU to 55555 QR on 50 storefronts or across 4 in-venue surfaces (counter sign, table tent, receipt footer, window decal). Static codes can't tell you which placement drives scans; dynamic codes can.
Keyword A/B testing. Two QRs pointing to the same number with different keywords (JOIN vs START, INFO vs MENU). Dynamic codes log scan-to-keyword; the SMS platform logs keyword-to-opt-in. The pair shows which wording converts.
Pair the dynamic QR with CRM webhook attribution — pass the placement ID to the SMS platform's keyword handler — for full visibility from scan → text-sent → opt-in → first-touch. For permanent signage where number and keyword don't change, static codes are correct — no subscription dependency, the sign works forever.
Permanent destinations — why static codes are load-bearing for counter signage and storefront windows
A static SMS QR encodes the sms: URI directly into the QR pattern. There's no server in the loop, no subscription required for the printed code to keep working. The number and keyword are the QR.
This matters for destinations that need to outlive the publisher — permanent counter signage, storefront window decals, receipt-footer QRs on point-of-sale software. A QR printed on a laminated counter sign in 2026 should still text the destination keyword in 2030, regardless of which SMS provider the business switches to or whether the QR analytics dashboard is still paid for. The sms:+<number>?body=<keyword> payload outlives every subscription.
The corollary: any time the number or keyword needs to change — short-lived campaigns, A/B tests, seasonal promotions — dynamic codes are the right call. The redirect costs $5/mo on the Lite plan and earns its keep the first time you swap a destination without reprinting 500 storefronts of signage.
Our permanent QR code generator guide covers the verification workflow — how to confirm a downloaded static SMS QR keeps working after the generator's account is cancelled. Worth running through once before any 1,000+ sticker print run.