Appearance
The cron job
The single most important step of the whole installation. Five minutes. Skip it and the system will look perfectly fine while doing nothing in the background — no errors, no warnings, no clue.
Why this one step matters so much
Everything that is supposed to happen on its own is driven by one scheduled command. Not some of it — all of it:
- Sending SMS, email and app notifications
- Fee invoices and payment reminders
- Exam results released at their scheduled time
- Birthday messages to students and staff
- Automatic database backups
- Daily summary emails
- Pulling records from biometric attendance machines
- Routine cleanup and health checks
Without the cron job, none of this runs. The panel still works, staff can still mark attendance and collect fees — but nothing ever leaves the building, and nothing reports an error. Messages sit in a queue waiting for a worker that never arrives.
This is the number one cause of "we installed it but SMS is not working".
Do not type this command — copy it from your own panel
Your installation works out the correct command for your server — the right PHP path, the right folder — and shows it to you ready to copy. Use that, and there is nothing to get wrong.
Sidebar → Server & Health → Server Health → Maintenance tab → Scheduled Tasks (Cron)
You should now see a box containing a command that begins with * * * * *. Copy it.
Then open your hosting panel's cron page, set it to run every minute, and paste the command in.
Why copy instead of type?
PHP lives in a different place on almost every host — /usr/bin/php on one, /opt/alt/php83/usr/bin/php on another. Your panel has already detected yours. A hand-typed path is the single most common reason a cron job silently does nothing.
If your host has no cron jobs, or only "fetch a URL"
Some shared hosting plans cannot run commands, and offer only a scheduled URL fetch. The same screen shows a second box for exactly this: a web address that does the same work when it is opened.
Copy that address from your panel and give it to your host's scheduler, set to run every minute.
Treat that address like a password
It is the one thing standing between the internet and your scheduler. Do not post it in a support forum, a screenshot, or anywhere public.
What the command actually says
Only useful if you are checking someone else's work — otherwise skip to the next section.
* * * * * /usr/bin/php /home/USERNAME/public_html/artisan schedule:run >> /dev/null 2>&1| Part | Meaning |
|---|---|
* * * * * | Every minute, of every hour, of every day |
/usr/bin/php | Where PHP lives on this server |
/home/.../artisan | The folder holding artisan — the folder you uploaded, not public |
schedule:run | "Do whatever is due right now" |
>> /dev/null 2>&1 | Stops the server emailing you every single minute |
Adding it on your hosting
What you are aiming for: a scheduled task that runs every minute, forever.
In hPanel, open Advanced → Cron Jobs, choose a custom interval of every minute, and paste the command. In cPanel the same screen is Advanced → Cron Jobs, where the interval boxes should all be set to *.
Panel wording changes between versions. Whatever the screen looks like, you need these five values set to every-minute — minute, hour, day, month, weekday all * — and the command above in the command box.
Checking that it worked
The same Maintenance screen has a Run Scheduler button under Quick Maintenance. Press it once: that proves the scheduler itself works, separately from whether your host is calling it.
So you can test the two halves independently:
| Test | What it proves |
|---|---|
| Run Scheduler button works | The system is fine — any problem is in the cron setup |
| Button works, but nothing happens on its own | Your host is not calling the cron job |
Then do one real test: send a test notice or trigger any message from the panel. If it arrives, the whole chain works end to end.
If it never arrives and no error appears anywhere, check the cron job first — before email settings, before the SMS provider, before anything else.
If it doesn't work
| What you see | Cause | Fix |
|---|---|---|
| Nothing sends, no errors anywhere | Cron job missing or never saved | Re-check it exists in the panel and is set to every minute |
| Cron emails you "No such file or directory" every minute | Wrong folder path | Point it at the folder containing artisan, not public |
| Cron emails you "php: command not found" | Wrong PHP command | Use the exact PHP path your panel shows — often /usr/local/bin/php or a version-specific path |
| Some things send, others never do | Cron runs less often than every minute | Change the interval to every minute; longer gaps stall the queue |
| Your inbox fills with cron output | The >> /dev/null 2>&1 part is missing | Add it to the end of the command |
Do not change QUEUE_WORKER_MODE
Your .env contains QUEUE_WORKER_MODE=scheduler. That is what lets the single cron job also process the message queue. Changing it stops messages sending unless you are running a dedicated worker process on a VPS.