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](/docs/guides/sms/character-limits) flags the practice for the same reason. Embedded links have their own section in the [CTIA messaging principles](/explained/compliance/what-are-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](/explained/engagement/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](/explained/sms/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](/explained/sms/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.