Senddera relies on Laravel’s scheduler and queue system for campaigns, automations, bounce processing, and housekeeping. On a VPS you typically use cron + Supervisor; on shared hosting, cron alone is usually the only option. This guide covers both.
What must run in the background
| Task | Mechanism |
|---|---|
| Scheduled campaigns, automations, recurring jobs | php artisan schedule:run every minute |
| Email queue (sends, imports) | php artisan queue:work (Supervisor) or periodic queue:work --stop-when-empty |
Some installs: queue:restart after deploy | Manual or deploy script |
If cron is missing, symptoms include campaigns stuck in “Sending”, automations never triggering, and emails stuck in queue.
1. Laravel scheduler (every server)
Add one crontab entry as the user that owns the app (not root):
crontab -e
Insert:
* * * * * cd /var/www/senddera && php artisan schedule:run >> /dev/null 2>&1
Adjust /var/www/senddera to your install path. On cPanel, use the full path to PHP from which php.
Verify after a minute:
grep schedule /var/www/senddera/storage/logs/laravel.log
2. Queue workers (VPS — recommended)
For production volume, run persistent workers with Supervisor. Install on Ubuntu:
sudo apt-get install -y supervisor
Create /etc/supervisor/conf.d/senddera-worker.conf:
[program:senddera-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/senddera/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/senddera/storage/logs/worker.log
stopwaitsecs=3600
Then:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl status
See also Queue workers and cron and Redis for queues.
3. Shared hosting without Supervisor
Add a second cron job every minute (same user):
* * * * * cd /home/USER/senddera && php artisan queue:work --stop-when-empty --max-time=55 >> /dev/null 2>&1
--max-time=55 prevents overlap with the next minute’s run. This is slower than Supervisor but works on cPanel.
4. Queue driver in .env
QUEUE_CONNECTION=database
# or, on VPS with Redis:
QUEUE_CONNECTION=redis
After changing .env:
php artisan config:clear
php artisan queue:restart
5. After code upgrades
Whenever you deploy new PHP code, restart workers so they load fresh code:
php artisan queue:restart
sudo supervisorctl restart senddera-worker:*
Full upgrade flow: Upgrade Senddera.
Troubleshooting cron
- Wrong PHP binary — cron may use PHP 7.x while the site uses 8.3; use full path
/usr/bin/php8.3 - Wrong user — crontab must be the app owner so
storage/is writable - Permissions —
storage/logsmust be writable - Timezone — server TZ vs app
APP_TIMEZONEaffects “send at 9am” campaigns