The build-or-buy conversation in messaging usually compares a vendor's feature list with an engineering estimate, and reaches the wrong answer because both sides are estimating the wrong thing. Features are easy to copy and engineering estimates ignore operations. The useful question is different for each layer of the stack: what does it take to run this well, who is accountable when it fails, and can you leave if you need to? This piece walks through the layers, gives a worked example, and lists what to ask before signing.
The question is never "build or buy" — it is "which layer"#
Where the line usually sits, bottom to top
- Carrier interconnect
Buy. Agreements, licences and operator standing you cannot acquire by writing code.
- Registration and compliance
Buy the filing, own the data. The records are yours; the relationships are the provider's.
- Transport abstraction
Thin, and yours. A send function you control is the seam that keeps everything above portable.
- Orchestration
Build or rent — but own the rules and the data. This is your business logic wearing a messaging costume.
- Consent and evidence
Own, always. It outlives every vendor in the stack and answers to a regulator, not to a provider.
What you almost certainly should not build#
Carrier relationships. Direct interconnect requires licences, commercial agreements and, in several markets, local presence. Building at this layer means becoming a telecoms company.
Sending reputation. Accumulated over years and attached to routes and sender identities. You cannot buy it and you cannot rush it.
Registration at scale. Filing sender IDs and campaigns is feasible for one market, painful for five and unmanageable for thirty — see 10DLC registration and Gulf sender IDs for why.
If any of these is the binding constraint, buy. There is no clever architecture around them.
Filing sender registrations yourself
What you should own, whoever runs it#
The consent ledger. You are legally accountable for it and may have to produce evidence from it years later, after changing vendors. Consent that exists only in a vendor's console is accountability you have partly outsourced. If a platform stores it, insist on a complete, scheduled export.
Message history. What you sent, to whom, under which consent and template. You need it for disputes, audits and measurement.
The channel abstraction. A thin interface over one or more providers costs little and preserves the ability to move. Without it, migration means rewriting every call site.
Yours, whoever runs the platform
- The consent ledger
You answer for it, possibly years after changing vendors — insist on a complete, scheduled export
- Message history
What was sent, to whom, under which consent and template
- The channel abstraction
A thin interface that keeps migration from meaning a rewrite of every call site
Orchestration: build or rent, honestly#
Orchestration — what to send, to whom, when, and what to do about silence — is your business process. Two reasonable paths:
| Build it | Rent it from a journey or CX platform | |
|---|---|---|
| Fits your process | Exactly | Where the platform's model matches yours |
| Time to first value | Slower | Faster |
| Who changes it | Engineers | Business users, within the platform's limits |
| Running cost | Your team's time | Licence fees |
| Exit cost | Low | Depends on export of rules, data and history |
Renting is often right for smaller teams and standard journeys; building pays when your process is unusual or messaging is core to the product. Either way, the rules and the data should be exportable.
The 3am test#
Not "can we build this?" — the answer is almost always yes — but what happens at 3am when it breaks?
Buying converts a technical failure into a commercial relationship: a status page, a support contract and someone else's on-call rota. Building means the on-call rota is yours. For an organisation whose core competence is elsewhere, that transfer is usually worth more than the licence cost.
The seam that keeps you free#
One send, through a stack that is half yours
- 01Your application
Decides that something should be communicated. Knows the intent, knows the customer.
- 02Your consent check
Reads your ledger. A veto with a reason, and the reason gets logged whichever way it goes.
- 03Your router
Picks the channel from intent, region and consent. Returns the choice and why.
- 04Your send function
One interface. Vendor-shaped adapters live behind it, never in front of it.
- 05Their transport
The commodity. Swappable precisely because everything above it is not.
Two ways to get the seam wrong:
- Too late. Built after three vendors, when their status names, error codes and idea of "a message" are already throughout your application code.
- Too much. An abstraction with more configuration than the providers it wraps is a platform you built by accident and now maintain. The right one is boring, thin and slightly leaky — leaky enough that channel-specific features stay reachable.
A worked example#
A mid-size insurer sends policy documents, renewal reminders, claim updates and one-time codes in three countries.
- Bought: SMS and WhatsApp transport from two providers (one primary, one secondary for codes), including sender registration in each country.
- Rented: a journey tool for renewal campaigns, chosen partly because it exports journeys and event history.
- Owned: the consent ledger, the message log, and a send function with two adapters. Claim updates are triggered by the claims system directly through the send function, not through the journey tool.
- Result: when the secondary provider's route in one country degraded, codes were moved to the primary by changing one routing rule. No application code changed.
The insurer's stack, by who runs what
SMS and WhatsApp transport from two providers, including sender registration in each country.
A journey tool for renewal campaigns — chosen partly because it exports journeys and event history.
The consent ledger, the message log, and a send function with two adapters.
A degraded route moved by changing one routing rule. No application code changed.
What to ask a provider#
- Can I export consent records, templates, message history and journey definitions at any time, in a documented format?
- Who owns the sender IDs, numbers and registrations — can they move with me?
- Do your webhooks carry my own message IDs, so my log stays the source of truth?
- What is your incident process, and what do you commit to in writing when your service is the cause?
Where to go next#
Next in this track: evaluating a CPaaS contract. For connecting several systems without forcing them into one, read federating without merging.