Cron and queue

Cron entry

In cPanel → Cron Jobs, add one entry (replace /home/USER with your real path):

* * * * * php /home/USER/calbok/artisan schedule:run >> /dev/null 2>&1

That single line drives everything: queue drain, reminder dispatch, payment reconciliation, recurring-appointment generation, NPS emails, and the cron beacon.

Use the exact PHP path from your installer's Done screen or hosting panel (RunCloud, cPanel MultiPHP, etc.) — do not assume /usr/bin/php is correct.

Commands you need

Most day-to-day work is in the browser. These Artisan commands are the ones buyers actually use:

Command When
(web installer) First install — open /install in the browser (no terminal).
php artisan migrate --force After uploading a new release if you are not using Admin → Diagnostics → Apply update.
php artisan schedule:run Called every minute by cron — drives the queue worker and scheduled jobs.
php artisan queue:work --stop-when-empty Optional manual drain; on shared hosting schedule:run already processes the database queue.
php artisan backup:run (if enabled) Manual backup when your host supports the backup package.
php artisan demo:reset Demo servers only (DEMO_MODE=true) — resets demo data and removes signup businesses.
php artisan calbok:operator-password {email} Recover Operator access when email login is unavailable.

Cache store and queue

Required stores

Setting Shared hosting VPS
CACHE_STORE database database or redis
QUEUE_CONNECTION database database or redis
SESSION_DRIVER database database or redis

Never set CACHE_STORE=file. The file driver uses no cross-process lock and silently undercounts rate limiters under concurrent PHP-FPM workers. The Diagnostics Rate-limiter cache store probe will FAIL and block the installer if file is set.

Never set QUEUE_CONNECTION=sync. The sync driver runs jobs inline in the HTTP request — booking confirmations, reminders, and payment webhooks will block the user's browser and cannot be retried on failure.