Most of the pain in this space comes from decisions made in week one that nobody realised were decisions. Here they are, explicitly, in the order they actually bind you.
Decision 1 — Hosted or self-hosted
If customers receive the messages, hosted. This is not close. The long argument covers why, but the short version is that a self-hosted bridge has no SMS fallback, sends from a personal number, and fails on a schedule you do not control.
Decision 2 — Which number, and who owns it
This is the one people regret. Your business number becomes an identity your customers save in their contacts. Moving it later means every saved thread breaks. Before you send anything, confirm three things with your provider:
- Can you port this number out if you leave? Get the answer in writing.
- Is it dedicated to you, or shared across a pool? Shared numbers inherit other people's reputation problems.
- Can it be the same number customers already call? A single recognisable number is worth more than any feature on a comparison table.
Portability is the lock-in question
Everything else about a provider is swappable in an afternoon. The number is not. Ask about porting before you sign up, not when you are unhappy.
Decision 3 — Where the conversation lives
Inbound replies have to land somewhere a human sees them. Your three options, in increasing order of effort:
- The provider's own inbox UI. Fastest to start. Fine if one or two people handle replies and you do not need it stitched to customer records.
- Your existing helpdesk or CRM. Best long-term shape. Webhook the inbound events in, and replies live next to everything else you know about that customer.
- A custom inbox you build. Only worth it if messaging is core to your product rather than a channel your business uses.
Whichever you pick, decide the response-time expectation now and staff it. Two-way texting covers the operational side.
Decision 4 — Where consent is recorded
Consent state has to live in a system you control, not only in your provider's dashboard. If you switch providers, your opt-out list must come with you — sending to someone who opted out two years ago because the record stayed behind is both a compliance problem and an unforced insult.
// Own this table. It outlives every vendor you will use.type ConsentRecord = { phone: string; // E.164, always status: "opted_in" | "opted_out" | "unknown"; scope: "marketing" | "transactional" | "both"; capturedAt: string; // ISO 8601 source: string; // which form, which page, which staff member disclosureText: string; // the exact words they agreed to history: { at: string; event: string; channel: string }[];};What you do not need on day one
- A campaign scheduler. Send from a cron job until the volume justifies more.
- Segmentation. You do not have enough customers for segments to be the bottleneck yet.
- An AI auto-responder. Answer replies yourself until you know what people actually ask.
- Multiple numbers. One number, one thread, one identity.
Build the smallest thing that sends, receives, honours STOP and tags links. Everything after that is an optimisation you will be better equipped to make in three months. Start with the comparison table.
Next step
Generate a tagged link for whatever you send next with the UTM builder, see what this looks like in your industry, or compare the services that can send it on the providers page.