SMS

Why do carriers block public link shorteners in SMS?

Public link shorteners are the reflex when a message is too long, and they are one of the more reliable ways to have SMS filtered. The reason is not the shortening. It is the sharing.

What is wrong with a public shortener?

The domain is not yours, and neither is its reputation.

A public shortener puts thousands of unrelated senders behind one hostname. Filters assess the domain, so the reputation you inherit is the aggregate of everyone using it, including whoever ran a phishing campaign through it this morning. You have no control over that and no way to repair it.

The second problem is structural rather than reputational. A shortened link deliberately conceals its destination: that is the feature. From a filter's position, an unfamiliar sender with a link that hides where it goes is indistinguishable from a phishing message, because it is the same shape. Carriers are not making a judgement about your intent; they are pattern-matching on something that genuinely correlates with abuse.

Bird's own character limits guide flags the practice for the same reason. Embedded links have their own section in the CTIA messaging principles, which is the document to read for what the industry asks of senders here; that page describes it and links it rather than quoting, since CTIA publishes only a PDF.

What should I use instead?

A link domain of your own, which fixes both problems at once.

A branded link domain is a hostname you control that rewrites the links in your messages. The reputation attached to it is yours alone: nobody else can damage it, and consistent good behaviour accrues to you. And the recipient can see who is asking them to click, which is the thing a shortener removes.

Bird supports this through a tracking hostname on your own domain, which is the same mechanism behind click measurement. What is click-through rate covers the measurement side, and the tracking-domain setup is in the docs.

Two smaller practices help alongside it. Keep the visible link recognisable rather than opaque, and do not send links from an unregistered sender to a destination that expects registration, since the two suspicious signals compound.

Is it not worth it for the character saving?

Rarely, once you count what a filtered message costs.

The saving is real but small, and it only matters at a boundary. A body at 155 characters where the link saves ten is worth something, because it stays inside one segment. A body at 300 characters is two segments either way and the shortener bought nothing. What is an SMS segment covers where those boundaries fall.

Set that against the downside: a filtered message is not delivered at all, so it costs the send, the outcome, and some reputation. One extra segment is a much cheaper problem than a blocked campaign.

How would I know this is what happened?

You often would not, directly, which is the frustrating part.

Filtering rarely arrives with an explanation. The message is accepted, and then a failure event turns up with an error code that says the provider bucketed it as a carrier rejection, or as unknown. Why are my SMS messages being filtered by carriers covers what those codes actually mean and which ones are never emitted.

Because the signal is that thin, links are worth treating as a thing to get right in advance rather than a variable to test after a campaign underperforms. Moving from a public shortener to a branded domain is a one-time change with no downside, which is a good trade against an ambiguous failure you cannot easily diagnose.

Build on the same network.

A test API key is yours immediately. Production unlocks when you add a payment method and verify a sender.

Start with one channel.
Add the others when you're ready.

A test API key is yours immediately. Production unlocks when you add a payment method and verify a sender.

Using Claude Code, Cursor, or Codex? Copy a setup prompt and your agent installs the Bird CLI and skills for you. Pick yours:

Cursor