All posts
Architecture··6 min read

Behavioral pool routing — how spam can't economically live on Clean infrastructure

The standard email industry response to spam is moderation: a human reviews complaints, bans the offending account, and moves on. The problem is that email spam is economically motivated, and account bans are cheap to circumvent. Sign up again with a different card. Mails.ai takes a different approach. Instead of trying to out-moderate bad actors, we make spam economically pointless: behavioral routing puts cold-pattern sends on segregated infrastructure and throttles them to volumes no bulk campaign can live on.

The pools

Every send on Mails.ai lands on a behavioral IP pool, chosen by a classifier that runs before the send leaves our system. Clean and Mixed are live at launch; a dedicated Outbound pool is on the Phase 2 roadmap:

  • Clean. Shared IPs reserved for transactional-pattern senders. Password resets, reply notifications, document-parser outputs, 2FA bridges. These agents have predictable volume, known recipients with prior contact, low complaint rates, and no cold-script content patterns. Inbox placement on Clean is excellent because every sender on these IPs looks the same to receiving mail servers: legitimate, low-volume, engaged.
  • Mixed.Shared IPs for senders with mixed or unclear behavioral signals — new agents building reputation, warm-prospecting campaigns with consent signals but cold-style content, agents transitioning between use cases. Mixed is not a penalty; it is a staging area. Agents graduate to Clean as their behavioral reputation firms up.
  • Outbound (roadmap).Dedicated IPs for explicit cold B2B prospecting, planned for Phase 2, with a ~14-day IP warmup. Reputation on a dedicated pool is entirely yours — there is no shared-pool reputation contamination in either direction.

Why behavioral routing breaks spam economics

On a single-pool platform, a transactional sender and a bulk cold sender share the same IP space. When the bulk sender accumulates complaints, the receiving mail server downgrades its opinion of the entire IP range. The transactional sender’s inbox placement suffers for someone else’s behavior. The only defenses are retrospective: wait for the complaint to trigger a ban, then clean up.

Behavioral pool routing makes contamination structurally impossible. A spammer who gets routed to Mixed never touches Clean IPs. Their complaint rate affects only Mixed pool reputation. Transactional agents on Clean are isolated at the IP level, not just the account level.

The economic piece is what makes it self-reinforcing. A sender who wants to abuse Clean infrastructure has to fool a behavioral classifier that sees five signal families at once:

  • Volume curve. Burst patterns versus steady trickle.
  • Recipient sourcing. Prior contact versus cold list.
  • Engagement curves. Reply rate, open rate, complaint rate, bounce rate over time.
  • Content patterns.Cold-script tropes (“I noticed you”, “quick question”), merge-tag density, link density.
  • Per-agent baseline. Each agent develops a behavioral signature over its first ~200 sends. Deviation from baseline triggers re-routing, so an agent that behaves transactionally for three months and then suddenly starts cold-blasting gets caught even if its current-window signals look plausible.

Gaming all five simultaneously, while maintaining volume and getting recipients to engage, is expensive. Most spam does not bother because the economics do not work — it gets throttled to 50 sends/day on Mixed while reputation builds, which is nowhere near the volume a bulk campaign needs.

What the classifier returns

Every send response includes routing transparency so you can see exactly where your send landed and why:

{
  "id": "msg_01H8...",
  "status": "delivered",
  "pool": "clean",
  "classifier_score": 0.08,
  "top_signals": [
    { "signal": "recipient_prior_contact", "weight": 0.32, "value": true },
    { "signal": "volume_curve_steady", "weight": 0.28, "value": true },
    { "signal": "content_no_cold_tropes", "weight": 0.22, "value": true },
    { "signal": "engagement_reply_rate_high", "weight": 0.18, "value": 0.41 }
  ]
}

A classifier_score near 0 means transactional-pattern (Clean). Near 1 means cold-prospecting-pattern (Mixed or Outbound). The top_signalsarray names the four highest-weighted features — so if you get routed to Mixed unexpectedly, you see which signal tipped the decision.

Automatic complaint handling

A per-sender complaint cron runs every 15 minutes. Any agent crossing 0.3% complaint rate auto-pauses before AWS’s 0.5% threshold trips. This matters for two reasons:

  • Your agent does not affect others. Complaint-rate breaches are caught and suspended at the per-agent level, not per-pool. Other agents sharing your pool do not inherit your problem.
  • Your account does not affect your SES account. We pause the agent before the complaint rate reaches the threshold that would trigger an AWS review. Your delivery infrastructure stays clean.

How this compares to manual segregation

Postmark, SendGrid, and other transactional platforms enforce use-case separation through account bans and AUP enforcement — they review complaints, ban violators, and rely on account-level separation for customers who need it. The manual approach works when your team has the bandwidth to enforce it reactively.

Behavioral routing enforces the same separation proactively at the classifier layer. You do not have to tell us your use case. We read it from your sends. An agent sending 2FA codes routes to Clean automatically. An agent sending cold outreach routes to Mixed automatically. You do not manage IP pools; the platform does.

Dedicated IPs for Outbound senders (roadmap)

If you are running explicit cold B2B prospecting at scale, the dedicated Outbound pool on the Phase 2 roadmap is built for you: dedicated IPs whose reputation is entirely yours. Not a sales call. Not a contract. Self-serve, like everything else.

Dedicated IPs mean your deliverability depends entirely on your own send quality, not shared pool behavior. IP warmup will run automatically over ~14 days, with warmup progress and current reputation visible in the dashboard.

Read the classifier glossary entry for the full signal taxonomy, or the pricing pagefor the plan table. Pool placement shapes deliverability, not price — a send costs the same on every pool.

FAQ

The questions readers ask after this post.

Can I manually choose which pool my agent uses?

Not directly — pool placement is behavioral, not a setting. The classifier reads your send patterns and routes accordingly. If your transactional agent consistently looks transactional, it stays on Clean without you doing anything. If you want dedicated IPs for explicit cold sending, a dedicated Outbound pool is on the Phase 2 roadmap.

What triggers a move from Clean to Mixed?

The five signal families the classifier reads: volume curve (sudden burst patterns), recipient sourcing (new addresses with no prior contact), engagement curves (high bounce or complaint rate), content patterns (merge-tag density, cold-script tropes), and per-agent baseline deviation. Any one signal can shift routing; multiple signals together accelerate it. You see the contributing factors in every send response via classifier_score and top_signals.

Does pool placement affect my deliverability?

Yes, but differently than you might expect. Clean shared IPs are the most curated — only transactional-pattern senders land there, so inbox placement is excellent. Mixed shared IPs have broader behavioral variance, so placement depends more on your own agent's reputation. The dedicated Outbound pool on the Phase 2 roadmap adds a ~14-day warmup, with placement depending entirely on your own sending quality. The Clean pool protects you from other senders' behavior; a dedicated pool will isolate you completely.

What does the auto-throttle at 50/day actually mean for my agent?

Cold-pattern senders get capped at 50 sends per day until behavioral reputation builds. The cap is per agent, not per account. Your support agent on the same account is not affected. Once reputation clears — typically after two to three weeks of clean engagement signals — the cap lifts automatically. You see the throttle status in your agent dashboard and can appeal for manual review if the classifier routed you incorrectly.

Closed beta

Built for agents.
Self-serve at every volume.

Public API opens Q3 2026. Drop ~6 lines into your agent and ship.

npmpnpmbunpip
$ npm install @mailsai/sdk
Packages publish with cohort 1 · Q3 2026