← All posts Integration & Automation

Wiring Email, Text and Calls Into Your Own Portal

The integration work stopped being the expensive part. What you inherit instead is a compliance and reputation surface nobody puts in the quote — 10DLC registration, sender limits, and the fact that prospecting and client communication share one reputation.

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.

Providers at the edges, records in the middle Providers at the edges, records in the middle REPLACEABLE Email provider SES · Resend · Postmark · Graph Text provider Twilio · Telnyx · Salesmsg Voice provider Twilio · RingCentral · Zoom Phone webhooks in · API calls out Your portal people · companies · projects quotas · queues · your own flows Your database every message, call and reply, kept past the provider’s retention PERMANENT Accounting · invoicing Reporting · client exports Whatever you add next What does not move when you swap a provider Your records, your history, your process. Swapping an email or SMS vendor becomes an adapter rewrite rather than a migration — which is the practical difference between being a customer of a platform and being a customer of a pipe. The reverse arrangement — records inside the vendor’s platform, read back out — is the one that is expensive to undo.

Email: what the providers actually charge

Verified against each vendor's own pricing page on October 30, 2026. These drift; re-check before committing.

ProviderEntry costAt ~10,000/monthHistory 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.

Keep the two jobs on separate identities Keep the two jobs on separate identities One portal, one record set CLIENT & TRANSACTIONAL you@yourdomain.com · the main number Invoices, project mail, replies, support Low volume, high engagement, near-zero complaint rate This must never be at risk OUTBOUND PROSPECTING mail.yourdomain.com · a separate number Campaigns, sequences, cold outreach Higher volume, unknown recipients, where complaints actually come from This is the one that can burn Same records underneath. Different sending identity on top. Separate subdomain, separate authentication, separate message stream or provider, separate outbound number. A reputation problem on the right side then cannot reach the left side, which is the entire point of the arrangement.

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.

FeeTwilioBandwidth
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 scoreT-Mobile daily cap
75–100200,000 messages/day
50–7440,000
25–4910,000
1–242,000
Unvetted standard brand2,000
Sole proprietor1,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.

Frequently asked

Should I build my own CRM instead of buying one?

It depends far less on the features than it used to and far more on whether your process fits the product's assumptions. The argument for building has strengthened for one specific reason: integration glue was always the most mechanical code in a project, and that is precisely what AI coding tools made cheap. So being locked into whichever connections a vendor offers, and whichever way they chose to interpret your records, is a worse trade than it was. The argument against has not changed at all — you still own it, and the compliance and reputation work below is yours either way.

What does 10DLC registration actually cost?

It is a stack, and it varies by provider more than most people expect. As of October 30, 2026: Twilio charges $4.50 one-time for a brand, $41.50 for standard vetting, $15 per campaign to vet, and $10 a month for most standard campaigns. Bandwidth charges $9 for the brand, $83 for third-party vetting and $20 a month for a standard campaign, with an initial three-month commitment you pay even if you cancel. The registry's pass-through is the same; the markup is not. Per-message carrier fees are separate, roughly $0.003 to $0.005 per segment.

Can I send prospecting email from my Microsoft 365 account?

Microsoft's own documentation says not to. 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 docs state plainly that customers needing to send legitimate bulk commercial email should use third-party providers that specialize in it, and that Exchange Online "isn't suited to accommodate bulk-mailing scenarios." The real risk is not the limit. It is that your prospecting and the mail your clients depend on would share one reputation.

How do I keep prospecting from damaging my normal email deliverability?

Separate them at the domain level before you send anything. Use a subdomain for outbound prospecting that is distinct from the domain carrying client and transactional mail, authenticate both, and keep them on separate sending infrastructure or separate message streams. Google requires bulk senders to keep the spam rate reported in Postmaster Tools below 0.30% and advises keeping it below 0.10%. Those are thresholds you can cross with a single bad campaign, and if the two jobs share a domain, crossing it takes your invoices and project mail down with it.

Why is my business number showing as "Spam Likely" and will branded caller ID fix it?

Branded caller ID and spam labeling run on two separate carrier systems, so paying for a branded display name does not clear a poor reputation score, and passing STIR/SHAKEN attestation does not prevent the label either. The analytics engines behind the labels are companies like Hiya, First Orion and TNS. The free step is registering your numbers with the Free Caller Registry, which tells those engines the numbers belong to a real business. The structural fix is the same as with email: use a separate number for high-volume outbound so the number your clients recognize stays clean.

What should live in my own database rather than the provider's?

The history, because the providers do not keep it. Resend retains message data for 30 days on every plan. Postmark retains 45 days by default, extendable to 365 on higher tiers. If the provider's dashboard is where you go to see what was said to someone, you have built a system that forgets. Consume the webhooks, write every send, delivery, open, reply and call event into your own tables keyed to your own records, and the provider becomes a replaceable pipe rather than the archive.