To create an SMS link, point an ordinary hyperlink at sms: followed by a phone number in international format, like sms:+12125550199. Add ?&body= followed by URL-encoded text to prefill the message. Tapping it on iPhone or Android opens the messaging app with your number in the "To" field and your text waiting to send. That is the whole trick behind sms links. The rest of this post covers the details that break them: encoding, iPhone vs Android quirks, desktop behavior, and the separate problem of links inside texts getting filtered by carriers.

A click-to-text link costs nothing to build and needs no special tool. You can write one by hand in a minute. Where it goes wrong is the number it points to and what happens after someone taps it. If that number can't receive texts, or nobody watches the replies, the link is a dead end that looks like it works.

The basic sms: link format

Every SMS link is a URI with the sms: scheme. In HTML it looks like this:

<a href="sms:+12125550199">Text us</a>

Some rules that save you a debugging session:

  • Use E.164 format. That means a plus sign, the country code, then the number with no spaces, dashes or parentheses: +12125550199, not (212) 555-0199. Some phones tolerate the messy version, but not all of them do.
  • The number has to be text-enabled. A landline or a voice-only line will accept the link, and the visitor's phone will happily compose a message to it. The text then goes nowhere. If you are pointing a link at a business number, check it can receive SMS before you publish.
  • No // after the colon. sms://+1212... works on some devices and fails on others. Plain sms: is the safe form.

Adding a prefilled message

To put text in the message body, add a query string:

<a href="sms:+12125550199?&body=Hi%2C%20I%27d%20like%20a%20quote">Text us for a quote</a>

The body must be URL-encoded:

CharacterEncode as
Space%20
Comma%2C
Apostrophe%27
Ampersand%26
Question mark%3F
Line break%0A

Don't use + for spaces. Some Android messaging apps will show a literal plus sign. Use %20 every time.

iPhone vs Android: why the ?&body= form exists

The cross-platform headache comes from iOS and Android historically disagreeing on the separator before body:

  • Older iOS versions expected sms:+12125550199&body=...
  • Android and the URI standard expect sms:+12125550199?body=...
  • Current iOS accepts ?body= as well

The ?&body= form is a widely used compromise. The ? starts the query string, and the empty parameter before & is ignored. In practice it opens correctly on current iPhones and on the default Android messaging apps.

That said, phone makers ship their own messaging apps, and app updates change behavior. Before you put a link on a page that gets real traffic, test it on at least one iPhone and one Android phone. Confirm three things: the number appears, the body appears, and punctuation isn't mangled.

Multiple recipients: avoid it

You can try sms:+12125550199,+15559876543, and some devices will open a group thread. Others will drop the second number or fail silently. If you need a link to reach a team, point it at one shared business number. Then route the replies inside your inbox rather than relying on the phone to fan them out.

What happens on desktop

On a Mac with Messages set up, an sms: link may open Messages. On Windows it may prompt to open a phone-linking app, or do nothing at all. On a work laptop with no messaging app it usually does nothing. Always show the number as visible text next to the button, so a desktop visitor can type it into their phone:

<a href="sms:+12125550199?&body=Hi">Text us</a> or text (212) 555-0199

Where SMS links actually earn their place

A click-to-text link removes the step where someone copies your number, opens their messaging app and wonders what to type. These are the places it tends to pay off:

  1. Mobile website header or sticky button. "Text us" next to "Call us." Plenty of people would rather text than call during work hours.
  2. Contact and quote pages. Prefill something specific, such as I'd like a quote for followed by a space, so the first message already tells you what they want.
  3. Email signatures and transactional emails. Mobile mail apps generally pass sms: links through to the phone. Some desktop clients don't, so the visible-number fallback matters here too.
  4. Social bios and link-in-bio pages. Most platforms accept sms: links. A few strip non-http links, so test yours.
  5. QR codes on print. QR codes for texts commonly use a slightly different format, SMSTO:+12125550199:Your message, which most phone cameras recognize. Generate the QR with an SMS option rather than pasting an sms: URL, then scan it with both phone types before printing 5,000 flyers.

Prefilled keywords and consent

A common pattern is prefilling a keyword like JOIN so the tap becomes an opt-in. It works mechanically, but two cautions apply.

First, put the consent language next to the button: what they'll receive, roughly how often, that message and data rates may apply, and that they can reply STOP. The tap alone doesn't explain any of that.

Second, a keyword reply is not a consent record by itself. On Ready, a keyword reply creates no per-contact consent record. Our attestation capture logs who sent a bulk or API send, to how many and when, not each recipient's opt-in. Store the opt-in time, wording and page URL on your side. If a complaint ever lands, that record is what you'll need.

When someone taps the link: where the reply lands

The link is the cheap part. The real work is answering the inbound text fast. If the number behind your link is on Ready, inbound texts land in the Inbox, and in GoHighLevel for connected accounts. You reply from the same thread, and if the contact later sends STOP, the opt-out propagates so they aren't messaged again across campaigns.

On cost: replies you receive are billed like sent texts, at $0.0075/segment plus a $0.0045 carrier fee per segment. A busy "Text us" button generates inbound volume you pay for. It's worth knowing that before you put one on every page. Pricing is on the pricing page.

Links inside texts: why they get filtered

This is a different problem from the sms: link, but people searching for one usually run into the other. When you send a text that contains a URL, carriers inspect it, and links are one of the most common reasons messages get filtered.

The usual culprits:

  • Public URL shorteners. Generic shortened links are heavily used in spam, and carrier filters treat them with suspicion. Use your own domain, or a branded short domain you control.
  • A link in the very first message to a new contact. A cold-looking first text with a URL is a classic spam pattern. We cover the fix in the two-message warmup carriers reward.
  • Links that don't match your registration. Your 10DLC campaign registration includes sample messages. If you send links but your samples never showed one, or the link points to a domain unrelated to your brand, expect trouble. If registration itself got bounced, see the sample-message rewrite that passes.
  • Approved but still filtered. Registration doesn't exempt content from filtering. Content-level blocking after approval explains what carriers still look at.

Links cost characters, and characters cost segments

A URL eats into the 160-character GSM-7 limit fast. Once a message goes past 160 characters, it splits into 153-character segments, and each segment is billed. An emoji drops the limit to 70 characters (67 per segment when split).

Worked example (assumptions stated): a 135-character reminder plus a 40-character link is 175 characters. That is 2 GSM-7 segments. Sent to 5,000 opted-in contacts on Standard:

  • 5,000 × 2 = 10,000 segments
  • 10,000 × $0.0075 = $75
  • plus 10,000 × $0.0045 carrier fee

Trim the copy to fit the link inside 160 characters and you pay for 5,000 segments instead of 10,000. Add one emoji to the 175-character version and it becomes 3 unicode segments, or 15,000 segments total. This excludes the optional compliance surcharge: scrubbing and landline validation are $0.003 extra per segment each when switched on, and both are off by default.

If you send through the API, a link goes in the body like any other text:

POST https://api.tryready.com/v1/messages
X-API-Key: <key>
Idempotency-Key: 3f6c1e2a-9b4d-4c1e-8a2f-1d2e3f4a5b6c
Content-Type: application/json

{"to": "+12125550199", "body": "Your order #1042 has shipped. Track it: https://yourbrand.com/t/1042", "consent_attested": true}

The full field reference is in the messages API docs.

A quick checklist before you publish

  • Number in E.164, no // after sms:
  • Number confirmed text-enabled and monitored
  • Body URL-encoded with %20, not +
  • ?&body= separator, tested on one iPhone and one Android
  • Visible number next to the button for desktop visitors
  • Consent language next to any keyword prefill, and opt-in stored on your side
  • For links inside outbound texts: your own domain, not the first message, and matching your registration samples

FAQ

Do SMS links work on both iPhone and Android? Yes. sms:+12125550199?&body=Hello opens the messaging app on current iPhones and on the default Android apps. Third-party messaging apps vary, so test on real devices before publishing.

Can I prefill a message in an SMS link? Yes. Add ?&body= followed by URL-encoded text. Encode spaces as %20 and punctuation like commas and apostrophes too, or some apps will show garbled text.

Does an SMS link cost anything? Building and hosting the link is free. The visitor pays whatever their carrier plan charges. Your side pays for receiving and replying to the text on whatever platform runs the number; on Ready, inbound and outbound texts are both $0.0075/segment plus a $0.0045 carrier fee.

Why does my link inside a text message get blocked? Common reasons are public URL shorteners, putting a link in the first message to a new contact, and links or domains that don't match your registered campaign samples. Use your own domain and keep content consistent with your 10DLC registration.

Does Ready have a built-in SMS link generator? No, and you don't need one: the format is simple enough to write by hand using the examples above. What Ready handles is everything after the tap, including the inbox where replies land, STOP handling and registration for the number behind the link.


The practical takeaway: the sms: link is the easy ten percent. The number behind it, how fast you answer, and how carefully you put links in your own outbound texts decide whether it actually brings in conversations. If you want a registered, text-enabled number with a shared inbox behind your "Text us" button, you can set up an account. Your first 20 one-to-one texts are free, so use them before you register.