There is a specific reason to revisit this now, and it is not that the tools got better.
Wiring a business application to an email API, a texting platform and a phone system used to be a real project. Not a difficult one — a long one. Read the docs, build the client, handle the retries, parse the webhooks, write the tests, do it again for the next vendor. That work is the most mechanical code in any integration, which makes it exactly the work AI coding tools have taken a large bite out of.
Which changes the calculation behind a decision most businesses make once and live with for a decade: whether your communications live inside somebody's platform, or inside your own.
When integration was expensive, buying a CRM and accepting its list of connectors was obviously right. You weren't just buying features, you were buying out of a lot of labor. Now that the labor is cheaper, what you are actually accepting when you buy is narrower and more awkward: their idea of what a contact is, their idea of what an interaction is, and a fixed list of things they will let you connect to.
What has not gotten cheaper is everything below. The compliance and reputation surface underneath business communication is the part nobody puts in the quote, and it is the part that will actually hurt you.
Why the portal is the right center of gravity
Start with what a CRM is usually bad at, which is being about something other than sales.
Most products model a pipeline: leads become opportunities become deals. That is a fine model if your business is a pipeline. It is a poor one if the thing you need to see is an interaction history that spans a person, the company they work for, the project they were on two years ago, and whether that makes them a candidate for the one you are staffing now.
That shape — the same person recurring in different roles across different projects, with context carried forward — is not a pipeline. It is a graph, and a sales CRM will let you store it only by abusing fields that mean something else. A recruiting operation hits this immediately: participants, studies, quotas and past participation are all first-class things, and “who do I call next” is a question across all of them at once.
Once the records live in your own database, the communications are just events attached to them. An email is not a thing in a mail tool; it is a thing that happened to a person, on a project, at a time. That is the whole argument, and everything below is the cost of acting on it.
Email: what the providers actually charge
Verified against each vendor's own pricing page on October 30, 2026. These drift; re-check before committing.
| Provider | Entry cost | At ~10,000/month | History kept |
|---|---|---|---|
| Amazon SES à la carte |
$0.10 per 1,000 | ~$1 | Nothing by default |
| Resend | Free: 3,000/mo, 100/day Pro: $20/mo |
$0 free tier, or $20 Pro covers 50,000 |
30 days, every plan |
| Postmark | Basic $15/mo | $15 | 45 days to 365 on Pro+ |
| Microsoft Graph your existing M365 |
Included | Included | The mailbox |
Three things worth drawing out of that.
The spread at small volume is enormous and almost irrelevant. SES at ten thousand emails is about a dollar; Postmark is fifteen. The difference is a rounding error against an hour of anyone's time, so choosing on price here is choosing on the wrong axis. What you are really buying above SES is a usable event model, a dashboard someone non-technical can look at, and somebody whose job is deliverability.
The retention windows are the detail to actually design around. Resend keeps message data for 30 days on every plan including the $650 one. Postmark keeps 45 by default. That is entirely reasonable — they are sending infrastructure, not an archive — but it means if the provider's dashboard is where you look to see what was said to someone, you have built a system that forgets. Consume the webhooks and write every event into your own tables, keyed to your own records. Then the provider is a pipe.
And Microsoft Graph is not a bulk sender, by Microsoft's own instruction. This one is worth quoting directly, because people reason their way past it constantly. Exchange Online caps a mailbox at 10,000 recipients per day and 30 messages per minute, and there is now a tenant-wide external recipient limit scaled to your license count. The documentation says customers needing to send legitimate bulk commercial email "should use third-party providers that specialize in these services," and that Exchange Online "isn't suited to accommodate bulk-mailing scenarios."
Graph is excellent for what it is for: sending and reading mail as a real mailbox, so a message from your portal is genuinely from you, lands in your Sent items, and threads properly when they reply. That is a different job from outreach, and the next section is why conflating them is the expensive mistake.
One reputation, two jobs
This is the part that is not a code problem, and it is the part a build-versus-buy spreadsheet never contains.
Your domain has a sending reputation. So does your phone number. Both are scored by parties you cannot see, on behavior you can only partly control, and both degrade from outreach in exactly the way prospecting generates.
Google publishes its thresholds for bulk senders. Authenticate with SPF and DKIM; publish a DMARC record, where p=none is sufficient; support one-click unsubscribe on marketing mail; and "keep spam rates reported in Postmaster Tools below 0.30%." The guidance goes further than the requirement: "keep spam rates…below 0.10% and avoid ever reaching a spam rate of 0.30% or higher."
Three in a thousand. One poorly-targeted campaign to a list that did not ask for it will cross that, and the consequence does not land on the campaign. It lands on the domain — which is also carrying your invoices, your project mail, and the reply a client is waiting on.
The asymmetry is what makes this worth designing for in advance: damaging a sending reputation takes one bad week, and rebuilding one takes months of consistent good behavior with no shortcut available at any price.
The structural answer is to never let the two share an identity.
Concretely: outreach goes out on a subdomain, not the apex. Both are authenticated independently. Postmark is unusually explicit about supporting this — it offers separate transactional and broadcast message streams, up to 30 on its Pro plan, which is the same idea enforced by the product. Doing it with any provider is a matter of separate domains and separate credentials.
Note the one thing this does not buy: it does not make bad outreach work. It contains the damage from outreach that underperforms, which is a different and more modest claim.
Text: the 10DLC toll
Business texting in the United States runs through A2P 10DLC, and you cannot opt out — unregistered traffic gets filtered or blocked outright. The registration is a stack of fees, and here is the thing most comparisons miss: the stack varies substantially by provider for the same underlying registry.
| Fee | Twilio | Bandwidth |
|---|---|---|
| Brand registration, one-time | $4.50 | $9 |
| Standard vetting, one-time | $41.50 | $83 third-party vet |
| Campaign vetting, one-time | $15 | — |
| Standard campaign, monthly | $10 | $20 |
| Low-volume campaign, monthly | $1.50 | $3 |
| Minimum commitment | — | 3 months, charged even if canceled |
Same registry underneath, roughly double the price on several lines. If you are choosing a provider, price the registration stack alongside the per-message rate rather than after it — and check for the commitment, because an initial three-month charge changes what a cheap experiment costs.
Per message, Twilio's published US long-code rate is $0.0083 per SMS segment each way, plus a carrier fee that varies by network: AT&T $0.0035 outbound, T-Mobile $0.0045, Verizon around $0.005 to $0.007. So the realistic all-in is roughly $0.012 to $0.015 per segment, not the headline rate. MMS runs $0.022 outbound before carrier fees. There is also a $0.001 charge on each message that ends in a failed status, which matters more than it sounds when a list is stale.
Throughput is governed by a trust score, and this is the part that surprises people after they have built everything. Vetting produces a score from 0 to 100 which sets your daily ceiling. The ladder reported consistently across carriers and platforms:
| Trust score | T-Mobile daily cap |
|---|---|
| 75–100 | 200,000 messages/day |
| 50–74 | 40,000 |
| 25–49 | 10,000 |
| 1–24 | 2,000 |
| Unvetted standard brand | 2,000 |
| Sole proprietor | 1,000 |
Two consequences. The cap is per brand and shared across every campaign and number you own, so buying more numbers does not buy more throughput — a common and expensive misunderstanding. And registering as a sole proprietor, which is the path that looks sensible for a one-person business, lands you in the bottom tier permanently.
On messages-per-second rates the sources genuinely disagree — published figures for the same tiers range from under 4 to over 200 — so that is worth confirming with your provider for your tier rather than taking from anybody's table, including this one.
Voice, and the "Spam Likely" problem
Voice pricing is comparatively boring, which is a relief. Twilio's US rates: $0.014 per minute outbound, $0.0085 inbound on a local number, $1.15 a month for the number. Call recording is $0.0025 a minute with storage at $0.0005 a minute per month; transcription is $0.05 a minute, which is the line that gets expensive if you transcribe everything by reflex.
The real cost on the voice side is not per-minute. It is caller reputation, and it behaves differently from email in a way that catches people out.
Branded caller ID and spam labeling are two separate carrier systems. Paying for your business name to display does not clear a poor reputation score, and passing STIR/SHAKEN attestation does not prevent the label either. The labels come from analytics companies — Hiya, First Orion, TNS — scoring call patterns: volume, duration, how often calls go unanswered, how often people decline them.
Which means a number that mostly makes short unanswered outbound calls starts to look like a telemarketer to a model that has never heard of you. The free remediation is registering your numbers with the Free Caller Registry, which tells those engines the numbers belong to a real business; carriers also have their own dispute tools. Ongoing branded calling is a paid product and not a cheap one.
The structural answer is the same as it was for email: prospecting calls go out on a different number than the one your clients have. One reputation per job.
What changed, and what did not
It is worth being precise about this, because the honest version is narrower than the exciting version.
Genuinely cheaper: writing the provider client, handling webhook signatures and retries, normalizing three vendors' event payloads into one shape, building the admin screens, and — the big one — migrating. Rewriting an adapter against a new vendor's API used to be a project that deterred switching. That deterrent is most of what vendor lock-in actually consisted of, and it has substantially weakened.
Unchanged:
- The data model. What a person, a company, a project and an interaction are in your business, and how they relate, is the decision everything else inherits. A tool that writes code quickly will implement the wrong model very fast, and that is the one mistake that is expensive to reverse.
- Deliverability and reputation. None of this is code. It is domain strategy, list hygiene, complaint rates and patience.
- Registration and compliance. 10DLC approval takes real calendar time regardless of how fast anything gets built, and consent handling is a legal obligation, not a feature.
- Operations. Webhook endpoints have to be up when the provider retries. Somebody owns that.
So the claim is not that building is now obviously right. It is that the thing you were buying your way out of got cheap, and the thing you still have to do yourself did not. Weigh it on the data model and the process, not on the integration hours.
How to decide
1. Does a pipeline describe your business? If leads becoming deals is genuinely the shape, buy a CRM; the products are good and this is what they are for. If the thing you need to see spans people, companies and projects over years, that is a graph, and products that model pipelines will fight you forever.
2. Where does the history need to live in five years? If the answer is "somewhere I will still control," then the provider cannot be the archive — see the 30- and 45-day retention windows above. That points at your own database regardless of what sits in front of it.
3. How much of your process is unusual? Unusual is not a euphemism for wrong. Quotas, eligibility rules, someone from a past project becoming a candidate for the next one — these are competitive advantages encoded as process, and the degree to which a product cannot express them is the degree to which you will keep a spreadsheet beside it.
4. Can you separate prospecting from client communication on day one? Whatever you choose, do this before you send anything. It is nearly free in advance and very expensive retroactively.
5. What is the all-in monthly cost including registration? Per-message rates are the advertised number and the smaller one at low volume. Brand and campaign fees, minimum commitments and carrier surcharges are where the money actually is.
If you want the longer argument about the build-or-buy question itself rather than the communications layer, I have written it up at the evolution of the CRM, and the harder lesson about what happens after launch at the build was the easy part. Pricing for the custom side is public at what a custom internal tool costs.