When campaigns show Sending forever or the queue table grows without delivery, the problem is almost always workers not running, a misconfigured queue driver, or a failed job blocking retries. This runbook walks through diagnosis in order.
Quick checks (2 minutes)
- Cron alive? — Is
* * * * * php artisan schedule:runconfigured? See cron setup. - Workers running? — On VPS:
sudo supervisorctl status. Shared hosting: cron forqueue:work --stop-when-empty. - Sending server active? — Admin → Sending → Sending Servers — status green, credentials valid.
- Failed jobs —
php artisan queue:failedor Admin → Monitor (if exposed).
Step 1 — Confirm queue connection
In .env:
QUEUE_CONNECTION=database
# or redis on VPS
After any change:
php artisan config:clear
php artisan queue:restart
Redis required? See Redis for queue processing.
Step 2 — Process one job manually
cd /path/to/senddera
php artisan queue:work --once -v
Watch output. Common errors:
- SMTP connection refused → SMTP troubleshooting
- Maximum execution time → raise
max_execution_timein PHP-FPM/cli - Memory exhausted → raise
memory_limitto 512M for workers
Step 3 — Inspect the jobs table
For database driver, table jobs holds pending work. Large reserved_at timestamps stuck in the past can indicate zombie workers. After stopping all workers:
php artisan queue:restart
# Only if you understand the impact — releases reserved jobs:
php artisan queue:flush # use with care; check docs for your version
Prefer retrying failed jobs: php artisan queue:retry all
Step 4 — Supervisor configuration
Workers must run as the same user that owns storage/. Logs: storage/logs/worker.log and laravel.log. Example config in cron & workers guide.
Step 5 — Campaign-specific issues
- Throttling — sending server rate limit pauses queue; check server dashboard
- Empty segment — campaign completes with zero sends (not a queue bug)
- Paused list / banned subscribers — reduces visible sends
Step 6 — Read logs
Full walkthrough: Reading application logs. Search for ProcessCampaign, SendMessage, or SMTP exceptions.
When to scale
Sustained backlog at high volume: add workers (numprocs in Supervisor), switch to Redis, tune MySQL — Scaling for 100K+ emails/day.