Multiple Sending Servers in AcelleMail — Add, Mix, Route

Spread your volume across multiple SMTP + API senders to absorb downtime, isolate reputation per campaign type, and grow past any single vendor's cap. This guide walks the UI to add a second server, set up routing, and verify in the admin pool view.

Why more than one sending server

A single sending server is a single point of failure: one vendor outage halts your campaigns, one reputation hit poisons everything you send. Most production setups run 2-4 servers from different vendors. Concrete reasons:

Goal What multi-server gives you
Survive a vendor outage Active failover — second server picks up when first goes down
Isolate marketing from transactional Marketing on one IP/server, password resets on another. A blocked marketing IP can't break login emails.
Grow past a per-vendor cap SES throttles new accounts to 200/day. Stack 3 vendors → 600/day on day one.
Build reputation in parallel Warm a new vendor's IPs while existing one carries the load.

Add a second server (customer-side)

Open the Sending servers screen

In AcelleMail's sidebar, click Sending → Sending servers. Your current setup shows in the list:

Customer sending-server list

Click "Add server" → pick the type

Top-right Add server button opens the type selector. Card-grid of every vendor AcelleMail supports — SMTP (any vendor), Amazon SES, SendGrid API, Mailgun API, Postmark, Mailchannels, plus more:

Sending-server type picker

Pick the vendor + integration type. The create form opens with vendor-specific fields. SMTP form (universal pattern — host + port + credentials):

SMTP create form

For an API-typed server like Amazon SES, the form changes to vendor-specific fields (Access Key ID + Secret + region):

Amazon SES API create form

Fill credentials + save

For SMTP: host + port + encryption + username + password. For API-typed servers: API key + region. AcelleMail encrypts and stores; credentials are never returned by the API.

Click Add server — the new server appears in your list with a Testing badge while AcelleMail probes the connection. Within a few seconds it flips to Active (or surfaces the connection error inline).

Verify in the admin pool view (multi-tenant installs)

Self-hosted operators managing a SaaS install see the full pool at Admin → Sending Servers:

Admin pool — multi-tenant sending-server list

Pool view shows: Total / Active / Inactive cards · server-type breakdown bar · per-server quota usage · which plan(s) the server is attached to. The admin side is where you set the Default server for new customers and assign servers per plan tier.

The admin-side server detail has more knobs — pool-wide bounce handler, FBL handler, warmup strategy, identity (DKIM keys), and per-customer access rules:

Admin server detail

Routing — which server sends which campaign

AcelleMail's default routing: round-robin within the pool the customer's plan grants access to. The campaign builder doesn't ask the user to pick a server; the dispatcher does it at send time based on:

  1. Plan-attached servers — only servers attached to the campaign owner's plan are candidates
  2. Daily quota remaining — if Server A has hit its daily cap, Server B handles the next batch
  3. Per-server warmup state — warming servers get prioritized for low-volume campaigns to grow gradually
  4. Round-robin within candidates — even distribution after the above filters

For deterministic routing (e.g. always send marketing through Server A, transactional through Server B), use the admin Sending Plan feature to scope a plan to a specific server. Then attach the right plan to the right customer/automation.

Common UI signals + fixes

Symptom Likely cause UI fix
New server stuck on Testing Wrong port / credentials Click into the server → fix credentials → save → AcelleMail re-tests
Campaign sends from "wrong" server Round-robin distributed it to another server in the pool If you need deterministic routing, scope via Plan → Sending Servers attach
One server hits quota daily, others idle Per-server quota mismatch Open each server's Sending limit → align caps; OR set higher quota on the underutilized server
Customer sees only 1 server but you added 2 New server not attached to their Plan Admin → Plans → [plan] → Sending Servers → attach the new server
Both servers show Active but campaigns still fail Plan doesn't grant access OR all servers daily-capped Tracking log shows the failure reason per-message; check for OutOfCredits or NoSendingServer
Advanced: programmatic server provisioning + automated failover via API

For SaaS operators managing many tenants, manual server config doesn't scale. AcelleMail's admin REST API supports server-CRUD:

# Create a new SMTP server programmatically
curl -X POST "https://acellemail.com/api/v1/admin/sending-servers" \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "smtp",
    "name": "Cluster B SMTP",
    "host": "smtp-b.example.com",
    "port": 587,
    "encryption": "tls",
    "smtp_username": "...",
    "smtp_password": "...",
    "default_from": "noreply@example.com",
    "sending_limit": 5000,
    "sending_limit_period": "hour"
  }'

Automated failover — for true active/passive failover, poll AcelleMail's queue depth + per-server health every minute via the /api/v1/admin/sending-servers/{uid}/health endpoint. When primary degrades (rejected-connection-rate > 1% over 5min), the script:

  1. Disables the primary server (PATCH status: disabled)
  2. Boosts the secondary's daily quota (PATCH sending_limit: <doubled>)
  3. Sends an alert via your incident channel
  4. Re-enables primary after manual all-clear + verifying connection

Per-customer attached-servers via API:

curl -X POST "https://acellemail.com/api/v1/admin/plans/{plan_uid}/sending-servers" \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -d '{"server_uids": ["uid-1", "uid-2"]}'

This grants the plan's customers access to those servers. Useful when you want a high-tier plan to get premium sending IPs while basic-tier shares a default pool.

Server health monitoring — wire AcelleMail's delivery_failed webhook to your incident channel. When a server hits N consecutive failures in M minutes, you get a Slack/PagerDuty page before customer complaints arrive.

Related articles

21 bình luận

8 bình luận

  1. sofia.costa.pt
    bookmarked. Going to share with the team — we've been winging warmup and it shows in the numbers.
    1. admin
      Thanks. Pass it along if it helps your team. tbh
    2. admin (đã chỉnh sửa)
      thanks. pass it along if it helps your team.
    3. admin (đã chỉnh sửa)
      Thanks for the kind words. We try to keep these source-grounded so they age well.
  2. phuong.mai.hn
    We hit a Spamhaus listing once. Self-service delisting was actually fast (< 24h) but the reputation recovery took weeks. Not the listing itself that hurt — the user complaints that caused it
  3. tranminh.devop…
    For very low-volume senders (< 5k/month), does warmup even matter? Or just send and let the provider's shared pool absorb the trickle?
    1. admin
      good question. the campaign:rerun audit writes to laravel.log only when the audit decides to force-resume — pure noop runs are silent. we'll add an info-level heartbeat in a future acelle release to make it easier to monitor.
    2. admin (đã chỉnh sửa)
      Yes — strict alignment requires the From: domain to match exactly. Subdomain-level (`bounce.example.com` vs `example.com`) passes relaxed but fails strict. Most operators run relaxed; the rare strict-DMARC setups need explicit subdomain DKIM configuration
  4. ravi.kumar.del…
    we warmed up a dedicated IP last fall. The 2-week ramp this article describes is on the aggressive side — Gmail in particular punishes anything faster than ~3-4 weeks. We did 4 weeks and had a clean ramp
    1. admin (đã chỉnh sửa)
      Thanks for sharing. The pattern you describe is exactly the use case we built that feature for — glad it landed for you.
  5. jmorrison.itop…
    Confirming the Postmaster Tools data lag — sometimes 48 hours, sometimes longer. Don't make decisions on a sinle day's data.
    1. admin
      Useful field report. The 'kill -9 was the only fix' edge case is rare but real — we'll note it as a fallback
  6. danrey.dev
    The Postmaster Tools section is gold. Most senders don't even know it exists.
  7. nadia.r.cl
    If you're warming a new IP after a known issue, consider seeding with transactional mail first (password resets, order confirmations). Higher engagement rate per send than marketing — helps the reputation ramp.
    1. admin
      Yep, same pattern works for us. Thanks for sharing.
    2. admin (đã chỉnh sửa)
      worth adding to the article. pr welcome if you want to author the addition
  8. rafa.silva.br
    Does engagement-based segmentation help during warmup? E.g. only sending to the most-engaged 20% during week 1?
    1. admin
      Short answer: yes — set the MySQL session variable from your worker's .env on boot and you'll get the longer timeout per connection. We'll add an explicit recipe in the next refresh
    2. admin (đã chỉnh sửa)
      Depends on your version. 5.x supports it natively; 4.x needs a config flag set in `.env`. We'll note this caveat in the article on the next pass.
    3. admin (đã chỉnh sửa)
      we tested this with up to 1M subscribers on a $40/mo VPS. Past that you start needing query optimization. Below that, the defaults are fine
    4. admin (đã chỉnh sửa)
      Suppression list import via CSV captures all opt-outs including preference-center ones if you exported with the right field set. The export filter defaults exclude some — check the 'include unsubscribed' checkbox on Mailchimp's export wizard.

More in Sending & Deliverability