# Email Delivery Issues — UI Diagnostic Checklist

> When messages don't arrive — late, bounced, missing entirely — the AcelleMail dashboard surfaces nine signals that tell you whether the issue is sending-side or recipient-side. Walk the checklist, fix from the UI in most cases.

- Canonical URL: https://acellesend.com/kb/articles/debugging-common-email-delivery-issues
- Author: Ryan Walsh, Audience & Analytics Editor
- Category: Troubleshooting — Common errors, debugging, delivery issues, logs, performance
- Content type: troubleshooting · Difficulty: beginner
- Tags: Acellemail
- Published: 2026-01-28 · Last updated: 2026-08-15
- Reading time: 6 min
- Publisher: AcelleMail Knowledge Base, https://acellesend.com/kb

---

## The 60-second dashboard check

Before assuming the worst, open AcelleMail and walk these four screens. 80% of delivery cases resolve from the UI without needing the operator.

### 1. Look at the campaign's tracking log

Open the campaign → **Tracking log** tab. Every send attempt is here with status + timestamp:

![Tracking log — per-message audit](https://acellesend.com/plugins/acelle/landing/images/help/kb/troubleshoot-stuck/03-tracking-log.png)

What the rows tell you:

- **All recent timestamps, all "Delivered"** → AcelleMail sent successfully. The issue is recipient-side (spam folder, blocked domain). Skip to *Sending server test* below.
- **Recent timestamps, mix of "Bounced" + "Deferred"** → receiving servers are slow or rejecting. Open the bounce log next.
- **Tracking log is empty / old** → the campaign never actually sent. See [Campaign stuck in Sending](https://acellesend.com/kb/articles/why-is-my-acellemail-campaign-stuck-in-sending-status).

### 2. Read the bounce log

Same campaign → **Bounces** tab. The DSN code column tells you why each message failed:

![Bounce log — mixed hard/soft](https://acellesend.com/plugins/acelle/landing/images/help/kb/smtp-error-codes/01-bounce-log-mixed.png)

- **Most bounces are "5.1.1 User unknown"** → stale list, addresses no longer exist. Normal at <5%. Run **Subscribers → Email verification** before next send.
- **Most bounces are "5.7.x"** (delivery not authorized) → your sending IP or domain is being blocked. Move to step 3.
- **Most bounces are "4.x.x"** (temporary) → AcelleMail retries automatically. Wait — no action needed.

See [Decoding bounce messages](https://acellesend.com/kb/articles/decoding-smtp-error-codes-and-bounce-messages) for the full DSN code reference.

### 3. Check sending server health

**Settings → Sending servers** → click the active server. The detail page shows the three authentication signals:

![Sending server config — auth chips](https://acellesend.com/plugins/acelle/landing/images/help/kb/spam-folder/02-sending-server-config.png)

What to verify:

- **SPF, DKIM, DMARC chips all green** — receiving servers can confirm you're authorized to send.
- **Daily quota not exhausted** — if you sent your daily limit, the rest queues to tomorrow.
- **Bounce + complaint rates < 5%** — sustained higher rates throttle your IP.

If any chip is red, click *Verify domain* → AcelleMail walks you through the DNS records to add at your DNS host.

### 4. Run the live diagnostic test

Same sending server detail → **Test** button. Sends a single message to an address you specify:

![Sending server test diagnostic](https://acellesend.com/plugins/acelle/landing/images/help/kb/spam-folder/03-sending-server-test.png)

Send to your own personal email. Three outcomes:

- **Arrives in Inbox** → sending setup is OK. The original issue is content-side (spam-trigger words) or recipient-side (their filter). See [Why emails go to spam](https://acellesend.com/kb/articles/why-are-my-acellemail-emails-going-to-spam-folder).
- **Arrives in Spam** → authentication or reputation issue. Open the message → *Show original* (Gmail) → check `Authentication-Results` header.
- **Doesn't arrive at all** → IP outright blocked. Check the sending IP at mxtoolbox.com → blocklist lookup.

## Common UI fix paths

| Signal in dashboard | Likely cause | What to do |
|---|---|---|
| Tracking log empty hours after launch | Queue worker idle | Operator: restart workers (see Advanced) |
| Most bounces "5.1.1" (User unknown) | Stale list | Run email verification, prune addresses |
| Most bounces "5.7.x" (Delivery not authorized) | IP/domain blocked | Check sending server *Verify domain*; if SPF/DKIM/DMARC all green, IP blocklist issue |
| SPF or DKIM chip red on sending server | DNS records missing | Click *Verify domain* → follow wizard → update DNS at registrar |
| Test diagnostic doesn't arrive | IP on blocklist | mxtoolbox.com lookup → delisting request per blocklist's process |
| Sending server quota hit | Daily limit exceeded | Wait for reset OR provision additional sending server in pool |
| All to ONE domain failing (e.g. @example.com only) | That receiver is blocking you specifically | Investigate FBL complaints from that domain; pause sends to it until reputation recovers |

## When to escalate to the operator

The dashboard exposes everything most users need. Escalate to the server operator when:

- Tracking log is empty AND the campaign should have started >30 minutes ago (queue worker dead)
- Test diagnostic doesn't arrive AND the IP is verified clean on blocklists (deeper SMTP / DNS / firewall issue)
- Daily quota is large enough but campaigns still stop mid-send (PHP-FPM worker exhaustion, database lock)

<details>
<summary><strong>Advanced: server-side checks for the operator</strong></summary>

When dashboard checks point at the worker or server-side delivery, the operator's checklist:

**Worker health:**

```bash
ps aux | grep "queue:work" | grep -v grep
# Expect at least one process for each --queue= pool the supervisor config defines.

php artisan queue:size
# Expected: dropping toward zero as the worker processes the backlog.

php artisan queue:failed | wc -l
# >0 means jobs gave up after their tries. Investigate with:
php artisan queue:failed
```

**Sending server connection test from the CLI:**

```bash
php artisan tinker --execute='
  \$server = \App\Model\SendingServer::where("status","active")->first();
  echo "Driver: " . \$server->type . "\n";
  echo "Host: " . \$server->host . "\n";
  echo "Test result: " . json_encode(\$server->test()) . "\n";
'
```

**SMTP smoke** (raw connectivity from the AcelleMail host to the SMTP gateway):

```bash
# Replace with your sending server's host + port.
nc -zv email-smtp.us-east-1.amazonaws.com 587
# Expected: Connection succeeded. Failure = firewall blocking outbound SMTP.
```

**TLS handshake verification:**

```bash
openssl s_client -connect smtp.sendgrid.net:587 -starttls smtp -crlf < /dev/null \
  2>/dev/null | grep -E "(subject|issuer|verify)"
# Expected: valid cert chain. Self-signed or expired = TLS rejection.
```

**DNS record check** (run from the AcelleMail host to verify the records that receivers actually see):

```bash
dig TXT yourdomain.com +short | grep spf
dig TXT default._domainkey.yourdomain.com +short
dig TXT _dmarc.yourdomain.com +short
```

If any of those return empty, the published records aren't propagated. Wait 24h after publishing; if still empty, the DNS host hasn't accepted the record.

**Log triage:**

```bash
tail -200 /home/acelle/domains/acellemail.com/storage/logs/laravel.log | grep -iE "(send|smtp|fail|reject)"
tail -200 /var/log/mail.log    # if MTA = local Postfix
```

**Sending server queue lag** — for high-volume installs, the per-server queue depth tells you which sending server is the bottleneck:

```bash
php artisan tinker --execute='
  foreach (\App\Model\SendingServer::where("status","active")->get() as \$s) {
    echo \$s->name . ": " . \$s->getCurrentDailySendingQuotaUsage() . " / " . \$s->daily_quota . " today\n";
  }
'
```

A server at 100% quota is the cause of queue spillover into the next day.

</details>

## Related articles

- [Decoding bounce messages](https://acellesend.com/kb/articles/decoding-smtp-error-codes-and-bounce-messages)
- [Why are my emails going to spam folder](https://acellesend.com/kb/articles/why-are-my-acellemail-emails-going-to-spam-folder)
- [Campaign stuck in Sending status](https://acellesend.com/kb/articles/why-is-my-acellemail-campaign-stuck-in-sending-status)
- [Setting up queue workers and cron jobs](https://acellesend.com/kb/articles/setting-up-queue-workers-and-cron-jobs)

---

## Related articles

- [Decoding Bounce Messages — Read the Tracking Log Like a Pro](https://acellesend.com/kb/articles/decoding-smtp-error-codes-and-bounce-messages): Hard bounces, soft bounces, deferred — what AcelleMail's bounce log is actually telling you, and which bounces you can ignore vs. which need action. Read the UI first, dive into the SMTP codes only when needed.
- [My Automation Isn't Triggering — How to Diagnose from the UI](https://acellesend.com/kb/articles/why-is-my-acellemail-automation-not-triggering): A welcome series or drip that won't fire on new subscribers. The Automations dashboard shows you whether the workflow is active, what trigger it's listening for, and which subscribers are eligible — three checks resolve most cases.
- [My Campaign Is Stuck in "Sending" — What to Check](https://acellesend.com/kb/articles/why-is-my-acellemail-campaign-stuck-in-sending-status): A campaign that still shows "Sending" hours after you hit send. Walk through the three UI signals that tell you what's actually happening — then the two-click fix that resolves it for most teams.
- [My Emails Are Landing in Spam — UI-First Diagnostic](https://acellesend.com/kb/articles/why-are-my-acellemail-emails-going-to-spam-folder): Spam-folder placement happens for measurable reasons. Walk the Insights page, the Sending Server config, and the Test diagnostic — three UI checks isolate the cause before anyone has to look at headers.
- [BIMI with VMC — Cost, Process, and Whether It's Worth It](https://acellesend.com/kb/articles/bimi-with-vmc-cost-walkthrough): VMC (Verified Mark Certificate) costs $1,500/yr per domain and takes 4-8 weeks to obtain. This guide walks the cost math, the trademark requirements, the alternative paths, and a decision framework for whether VMC is right for your sending program.
