Back to Blog
emailarchitectureresendinfrastructuredeliverability

Email Infrastructure Architecture for Multiple Brands

How I run email for a dozen businesses on one provider account using a deliberate email infrastructure architecture: subdomains, routing rules, and a single subscriber source of truth.

By Mike Hodgen

Short on time? Read the simplified version

The mess I found when I audited twelve projects

A few months ago I sat down to do something I should have done a year earlier: audit every email-sending system across everything I run. My DTC fashion brand, my consultancy, and a handful of apps I build and host for clients. All of them shared one email provider account. That's not the problem. The problem was that nobody had ever decided how that account should be structured. It just accumulated.

What I found was a quiet disaster.

What drift looks like

One brand's transactional sender had silently fallen back to a test domain that only delivered to me, the account owner. So customers placing orders were getting nothing, and I had no idea. A cron job on another project was sending from an unverified subdomain. There was an orphaned domain with full DNS records configured but no matching record on the provider side, so it looked set up but couldn't send. And emails from a named human persona were landing in spam because the DKIM signature didn't match the visible sender.

Why nobody caught it

Here's the part that should scare you. None of this threw an error.

Infographic contrasting green healthy system reports (200 OK, cron success, green dashboard) against the actual broken reality of fallback test domains, unverified subdomains, orphaned domains and DKIM mismatches, captioned none of this threw an error. Silent failure: green logs hiding broken email delivery

The provider returned a 200. The cron logs said "success." The dashboards were green. The email just went nowhere useful. This is the exact shape of silent pipeline failures that nobody notices for weeks, where every system reports health and the actual outcome is broken.

Running a dozen businesses on one email provider account is cheap and completely doable. I still do it. But it only works with deliberate email infrastructure architecture, not accumulation. The difference between those two things is the entire rest of this article.

Start with one document: the canonical email architecture

The fix did not start with code. It started with a single document.

I wrote one authoritative file that defines every domain, every subdomain, and every from-address in use across all twelve projects, and exactly what each one is for. Nothing else. Just the map.

Domains, subdomains, and from-addresses

The rule that came out of writing it is simple: if a from-address isn't in the doc, it doesn't get to send. That one rule kills the entire orphaned-domain and unverified-subdomain class of bugs, because now there's a checklist to verify every sender against. The orphaned domain I found earlier? It got caught the moment I tried to reconcile reality against the doc, because it was in DNS but not in the provider.

Function-specific subdomains

The other thing the doc forced was function-specific subdomains. Your transactional email setup should not share a subdomain with your bulk marketing sends. Ever.

Diagram showing a root domain splitting into a transactional subdomain and a marketing subdomain, separated by a reputation firewall so a marketing reputation problem cannot affect transactional email. Function-specific subdomain separation for reputation isolation

Use separate email subdomains by function. Something like transactional.brand.example for password resets and order confirmations, and mail.brand.example for marketing and bulk. The reason is reputation isolation. If a marketing campaign tanks your sender reputation (too many complaints, a bad list), you do not want that bleeding into password resets and order confirmations. Those have to land, always.

Keep them on separate subdomains and a marketing reputation problem can't poison the transactional pipe. They build and degrade reputation independently.

The doc IS the architecture. The code just enforces what the doc declares. When you run multi-brand email out of one account, that document is the only thing standing between you and the mess I started with.

The routing rule that keeps personas out of the spam folder

This is the least obvious decision in the whole system, and it's the one that fixed the spam problem.

Flowchart showing machine mail routed through the Resend API and human persona mail routed through a real Gmail mailbox, with a crossed-out path showing how sending human mail via a bulk API causes DKIM misalignment and spam. Routing by message type: API pipe vs human mailbox pipe

Bulk and transactional through the API

Bulk and transactional email goes through the provider's API. In my case that's Resend. Order confirmations, shipping notices, marketing campaigns, password resets. All of it goes out machine-to-machine through the Resend architecture, authenticated with the domain's DKIM.

That's the right pipe for machine-generated mail. It scales, it's fast, and the authentication matches what the message actually is: an automated send from a system.

Named personas through a different pipe

But email from a named human persona does not go through Resend. It goes through the Gmail API instead.

By "named persona" I mean a real person replying to a customer, founder outreach, support coming from a named individual rather than support@. These messages look like they came from a human, so they have to be authenticated like one.

Here's why this matters. If you send a one-to-one personal email through a bulk transactional provider, you get DKIM misalignment. The message reads like a person wrote it, but it's authenticated like a machine sent it. Spam filters notice that mismatch immediately, and they're right to. That was exactly why my named-persona emails were landing in spam.

The fix wasn't a domain change. It was separating the pipe by message type. Machine mail through the API, human mail through the human's actual mailbox.

In the multi-brand setup, each brand's personas route through that brand's own Gmail mailbox. So when someone from a brand replies to a customer, it goes out authenticated as that mailbox, aligned, and it lands in the inbox where it belongs. Separating by message type, not just by domain, is what made personas deliverable again.

One authoritative subscriber table (and why it has to be yours)

Let me ask the question that exposes most companies. Who is actually subscribed to your list right now? Can you query that in one place and trust the answer?

The source-of-truth problem

Most CEOs I talk to can't. Their subscriber state is scattered across a marketing SaaS, their commerce platform, and at least one spreadsheet someone exports occasionally. There is no single source of truth. That's not just messy, it's a compliance and deliverability risk, because you genuinely don't know who consented to what.

The fix is one authoritative subscriber table that you own, and every single send checks against it before going out. Not the marketing tool's copy. Not the commerce platform's copy. Yours.

Why marketing SaaS lock-in fails you here

This is a build-versus-buy decision, and I come down hard on one side. You should pay for the primitive and build the logic yourself. Pay the provider for sending, the hard part you'd never want to build. But the subscription state, the consent record, the who-can-we-email truth, that belongs to you.

When subscription state lives locked inside a marketing tool, you can't query it cleanly, you can't export it without pain, and you definitely can't enforce it consistently across twelve brands. You're renting your own source of truth.

And the stakes here are real. Sloppy data handling around who you're allowed to contact isn't a minor mistake, it's the kind of thing that turns into serious money very fast. Owning your subscriber table is how you stay defensible.

An unsubscribe pipeline that can't lose a request

If the subscriber table is the source of truth, the unsubscribe pipeline is the path I trust the least and protect the most. A missed unsubscribe is a legal problem and a reputation problem at the same time. It cannot be allowed to fail.

HMAC-signed unsubscribe links

Every unsubscribe link is HMAC-signed. That means the link carries a cryptographic signature tied to the subscriber and the action, so it can't be forged, tampered with, or replayed against a different address.

Without signing, an unsubscribe link is just a URL with an ID in it. Anyone could increment the ID and unsubscribe people who never asked, or worse, the link could be manipulated. HMAC signing closes that off. The request either validates against the signature or it gets rejected.

Idempotent outbox and propagation

The next piece is idempotency. People double-click. Networks retry. Email clients pre-fetch links. So the unsubscribe handler has to be safe to call the same way twice, and produce the same result without double-processing or corrupting state. I run it through an idempotent outbox, which means a duplicate request is recognized and absorbed, not re-executed.

Vertical diagram of an HMAC-signed unsubscribe request flowing through an idempotent outbox into three overlapping propagation layers (inline, cron-retry, daily-reconcile) that keep the subscriber table and commerce platform in sync. Three-layer idempotent unsubscribe propagation

That idempotency is what makes the propagation safe. Because an unsubscribe can't just update my subscriber table, it has to flow back to the commerce platform too, or that platform will happily keep someone on a list I just removed them from.

I run propagation in three layers:

  • Inline. Try to propagate immediately on click. Most of the time this just works.
  • Cron-retry. A scheduled job catches anything that failed inline, network blips, API timeouts, and retries it.
  • Daily-reconcile. A daily sweep compares the subscriber table against the commerce platform and fixes any drift in either direction.

Here's the thing that ties it together: I can safely run all three layers because every step is idempotent. If inline succeeds and the cron retries anyway, nothing breaks. If reconcile re-checks something already handled, nothing breaks. Without idempotency, three overlapping layers would be a recipe for duplicate processing. With it, they're just three nets under the same tightrope.

Webhooks into one canonical handler, and a health endpoint that screams

Two more pieces turn this from a clean-up into a system that stays clean.

One handler, many event types

The provider fires webhooks for bounces, complaints, deliveries, and more. In the old accumulated setup, those would have hit scattered endpoints, one per project, each with slightly different handling logic that drifts over time.

Now every webhook hits one canonical receiver. One handler, many event types. A hard bounce is processed the same way whether it came from my fashion brand or a client app. A spam complaint triggers the same suppression logic everywhere. Consistency comes free because there's exactly one place the logic lives.

The endpoint that emails me on red

Then there's the monitoring layer, which is the part that would have caught the original mess.

I built a health endpoint that actively checks the things that silently broke before. Does every domain have a valid provider record? Is every subdomain verified? Is DKIM aligned for each sender? Are any senders quietly falling back to a default or test domain?

When something goes red, it emails me. Not a dashboard I have to remember to check. An actual message in my inbox.

The reason all that drift went unnoticed for so long was the absence of exactly this. Green logs, 200 responses, no alarms. This is why I'm such a believer in automations that email me when nothing is wrong, because the inverse, silence meaning everything is fine, is a lie your infrastructure tells you right up until a customer doesn't get their order confirmation.

The health check is what makes this architecture durable. One-time cleanups decay. A system that constantly verifies itself against the canonical doc stays clean.

What this costs versus the SaaS tangle it replaced

Here's the economics, because that's what actually moves the decision.

Comparison matrix showing a tangled expensive per-brand SaaS stack with scattered data and lock-in versus a single owned email architecture with a canonical doc, owned subscriber table and lower cost. Owned architecture vs per-brand SaaS tangle (cost and ownership)

One provider account plus a modest amount of custom logic runs email for a dozen businesses. Compared to a per-brand marketing SaaS stack, where each brand carries its own subscription, its own seat licenses, its own data silo, this runs at a fraction of the cost. And it does it without the lock-in.

I own the subscriber data. I own the routing logic. I own the audit trail of who consented, who unsubscribed, and when. None of that is trapped inside a tool I'd have to fight to export from.

I'll be honest about the tradeoff, because it's a real one. This is not a setup-wizard product you click through in an afternoon. It needs someone who can build the architecture and maintain it. The canonical doc, the routing split, the idempotent unsubscribe pipeline, the health endpoint, those don't write themselves.

But that's exactly why most companies end up with the SaaS tangle in the first place. Not because the tangle is good. Because nobody owned the architecture decision, so it accumulated instead of being designed.

If your email today is a pile of senders and lists with no source of truth, that's the problem to fix before anything else. It's the same kind of thing I built for my own brand and the client apps I run, and it's the kind of work I genuinely enjoy untangling.

Want to explore what AI could do for your business?

Book a free 30-minute strategy call. No pitch deck, no sales team, just a real conversation about your operations and where AI actually fits.

Book a Discovery Call

Get AI insights for business leaders

Practical AI strategy from someone who built the systems — not just studied them. No spam, no fluff.

Ready to automate your growth?

Book a free 30-minute strategy call with Hodgen.AI.

Book a Strategy Call