What to check from the dashboard#
A campaign that says Sending hours after you launched it isn't always actually stuck — most of the time AcelleMail's auto-rerun has already picked it back up and is finishing the send in the background. The dashboard tells you whether to wait or whether to act.
Open Campaigns in the left sidebar. Look at the row for your campaign — there are three things to read:

- The status badge — "Sending" means the campaign is in progress.
- The "Sent" counter — does it match your list size, or is it stuck at a lower number?
- The "Last updated" timestamp — when did the worker last touch this campaign?
If "Last updated" is less than 10 minutes ago, AcelleMail is actively sending. Refresh in a few minutes — it'll catch up.
If "Last updated" is 30+ minutes ago and Sent is below the list size, the worker hasn't been processing this campaign — keep reading.
Open the campaign and look at the live counts#
Click the campaign name. The overview page shows the per-status breakdown — Delivered, Bounced, Failed, Opened, Clicked:

The two numbers that matter:
- Sent vs. list size — if Sent < list size and not moving, AcelleMail isn't picking up the campaign for processing.
- Failed count — if this is growing, the SMTP server is rejecting messages and your campaign is stuck on the same recipient batch.
Check the tracking log for what AcelleMail tried to send#
Inside the campaign, the Tracking log tab is the per-message audit. Every send attempt — successful, bounced, deferred — has a row:

Scroll to the latest entries:
- All rows show recent timestamps → AcelleMail is sending right now, the dashboard is just showing slightly stale counts. Refresh in 5 minutes.
- Latest row is hours/days old → no send activity. The worker is the bottleneck (see below).
- Latest rows show SMTP errors repeatedly → your sending server credentials, IP reputation, or DNS records need attention. Open Settings → Sending servers and click Test connection on the active server.
Common UI causes and the fix from the dashboard#
| What you see |
Likely cause |
What to do |
| Status: Sending · Sent count not moving · Tracking log empty |
The sending worker is idle. |
Ask the operator to restart workers (see Advanced below). If you're self-hosted as a solo operator, see the operator section. |
| Status: Sending · Sent count = part of list · Last updated >1 hour |
A batch failed mid-run; AcelleMail auto-rerun will pick it up next 10-minute window. |
Wait 15 minutes. Refresh. If Sent still doesn't move, jump to the operator section. |
| Status: Sending · Failed count growing fast |
SMTP rejection. |
Settings → Sending servers → Test connection. Common causes: expired API key, exceeded daily quota, IP blocked. |
| Status: Sending · all recipients in tracking log show "deferred" |
Receiving servers are throttling. |
Wait — deferred messages are retried automatically. If still deferred after 24h, the sending server's IP needs a warm-up. See Why are my emails going to spam. |
Pause and resume from the campaign UI#
If you need to stop the send (e.g. wrong list, urgent edit), the campaign overview has a Pause button while it's in Sending state. Pause → fix the issue → click Resume — AcelleMail picks up where it left off, no duplicates.
Advanced: server-side checks for the operator
If the dashboard checks above point at the worker being idle, the operator needs to verify the queue worker process is running. AcelleMail pushes campaign sends onto a Laravel queue; if the worker process dies (OOM, missing cron, supervisor not running), campaigns sit in the "sending" state indefinitely.
Quick worker check (SSH to the AcelleMail host):
# Is the queue worker process up?
ps aux | grep "queue:work" | grep -v grep
# How big is the queue backlog?
php artisan queue:size
# How many failed jobs need a retry?
php artisan queue:failed | wc -l
Restart the worker (assumes Supervisor is managing it — the recommended install pattern):
supervisorctl restart acelle-queue-worker:*
If you're running the worker manually without Supervisor:
nohup php artisan queue:work --queue=high,default,low --sleep=3 --tries=3 &
Force a campaign rerun — AcelleMail's SendCampaign console command picks up stuck campaigns in 10-minute windows. To trigger it immediately:
php artisan acelle:send-campaign --force
Cron check: AcelleMail's acelle:run command is the master scheduler. If it stopped running (cron disabled, crontab edited), campaigns never get picked up. Confirm with:
crontab -l | grep acelle:run
# Expected: * * * * * php /path/to/acelle/artisan acelle:run >/dev/null 2>&1
Inspect failed jobs:
php artisan queue:failed
# If a campaign send failed and the worker gave up after `tries` exhausted,
# retry it with:
php artisan queue:retry all
Logs to read when the dashboard counts don't match worker behavior:
storage/logs/laravel.log — Laravel exceptions during send
storage/logs/queue-worker.log (if configured) — per-job timing
- The campaign tracking log inside the dashboard remains the source of truth for per-recipient outcome; the operator logs explain WHY the worker stalled.
Related articles#