# Cron setup

One entry drives everything (dispatch, reconciliation, site notifications, housekeeping). cPanel → **Cron Jobs** → *Once Per Minute* (`* * * * *`):
```bash
/usr/local/bin/php /home/CPUSER/voiceorder-app/artisan schedule:run >> /dev/null 2>&1
```
Replace `CPUSER` and the PHP path (use the 8.2+ binary shown in cPanel, e.g. `/opt/cpanel/ea-php82/root/usr/bin/php`).

* The schedule runs `voiceorder:process-queue` every minute: it takes a cache lock (database store), reclaims rows stuck >10 min, claims rows atomically and processes at most 25 per run (`config/voiceorder.php → queue`).
* Hourly `voiceorder:housekeeping` purges nonces/idempotency keys/old pairing codes and closes calls that never received a final callback after 24 h (state `unknown`).
* If your host's minimum interval is 5 min, calls simply start up to 5 min later; nothing breaks.
* There is **no public URL** that triggers processing. Do not expose one.
* Health: `php artisan voiceorder:process-queue` prints `Processed N row(s).`; Admin → Calls shows `queued` calls that are overdue; the hourly housekeeping warns about calls holding a reservation >24 h.
