How to set up Joomla CRON for the Task Scheduler

Several Solidres features do their work in the background rather than while a page is loading: pushing availability and rates to your channels, importing iCal bookings, refreshing currency exchange rates, sending balance-due reminders. Joomla runs these through its built-in Task Scheduler, and Solidres ships the task plugins that plug into it.

There is one catch, and it is the single most common reason a background feature "does not work": Joomla's Task Scheduler does not run on its own. Something has to trigger it. This article shows you the three ways to do that, which one to pick, and how to confirm it is actually running.

PREREQUISITES:

  • Joomla 4.1 or later (the Task Scheduler was introduced in Joomla 4.1; screenshots here are Joomla 6)
  • Access to your Joomla administrator as a Super User
  • For the recommended method: shell access to your hosting, or a cron-job panel such as cPanel or Plesk

Which Solidres features use the Task Scheduler

Each Solidres feature that needs background work ships its own task plugin. The plugin is installed and enabled together with the feature, and it adds one or more task types that you can then schedule.

Task type What it does Shipped by
Solidres - Channel Manager Sync Pushes queued availability and rate changes to your channels Channel Manager plugin
Solidres - Channel Manager Watch Tracks the progress of each batch that was sent Channel Manager plugin
Solidres - Channel Manager Log Records completed sync operations in the activity log Channel Manager plugin
Solidres - Channel Manager Token Renews the Beds24 API token — only needed with the Beds24 provider Channel Manager plugin
Solidres - iCal Synchronises your iCal feeds iCal plugin
Solidres - Currency Updates currency exchange rates Currency plugin
Solidres - Invoice Sends balance-due reminder emails to customers Invoice plugin
Solidres - Hub Hub subscription management Hub plugin

You only create tasks for the features you actually use. If you do not use iCal, you do not need the iCal task.

How Joomla triggers scheduled tasks

Joomla offers three trigger methods. They differ in reliability, not in what the tasks do.

Method Needs Runs when nobody visits? Tasks per trigger Verdict
System cron (CLI) Shell or cron-panel access Yes All due tasks Recommended for production
Web Cron An external service to call a URL Yes One per call Good fallback with no shell access
Lazy Scheduler Nothing — on by default No One per trigger Development only

IMPORTANT Note the Tasks per trigger column — it surprises people. Web Cron and the Lazy Scheduler run only one due task per trigger. If you have the three Channel Manager tasks all set to one minute, a once-per-minute Web Cron call takes three minutes to work through them, and each task therefore effectively runs every three minutes. Only the command-line method with --all runs every due task in a single pass. If you sync with OTA channels, use system cron.

Option 1. System cron (recommended)

This is a real cron job on your server calling Joomla's command-line application. It runs whether or not anyone is visiting your site, it adds nothing to page-load time, and it is the only method that clears every due task at once.

Step 1. Find your PHP command-line binary

Connect over SSH and run:

which php
php -v

Make a note of the full path — commonly /usr/bin/php. Two things to watch for:

  • The CLI version can differ from the web version. php -v shows the command-line one; your site might be served by another. Joomla 6 needs PHP 8.1 or later, and Solidres 4.2 targets PHP 8.4.
  • Shared hosting often needs a version-specific binary, such as /usr/bin/php8.4, or on cPanel /opt/cpanel/ea-php84/root/usr/bin/php. If in doubt, ask your host which binary matches your site's PHP version.

Step 2. Find your site's absolute path

It is the folder that contains configuration.php — for example /home/youruser/public_html. From your site root:

pwd

Step 3. Test the command by hand first

Before scheduling anything, prove the command works. From your site root:

php cli/joomla.php scheduler:list

That lists the tasks Joomla knows about. Then run the due ones:

php cli/joomla.php scheduler:run --all

You should see a line per task and a summary. No tasks due! is a healthy answer too — it means the scheduler is reachable and nothing is currently pending.

NOTE cli/joomla.php is part of Joomla itself, so this works on any Joomla 4.1+ site. Unlike the other two methods it does not require the System - Schedule Runner plugin — but it does require the relevant Task - Solidres … plugins to be enabled, since those provide the task types.

Step 4. Add the cron job

Run crontab -e and add one line. Every minute, running all due tasks:

* * * * * /usr/bin/php /home/youruser/public_html/cli/joomla.php scheduler:run --all >/dev/null 2>&1

Replace the PHP binary and the site path with your own values. Every five minutes instead:

*/5 * * * * /usr/bin/php /home/youruser/public_html/cli/joomla.php scheduler:run --all >/dev/null 2>&1

A few notes on that line:

  • --all is not optional in practice. Without it Joomla runs a single due task per invocation.
  • >/dev/null 2>&1 discards the output so cron does not email you every minute. While you are still testing, drop it — or write to a log with >>/home/youruser/cron.log 2>&1 — so you can see what happened.
  • Run it every minute even if every task is hourly. Cron only decides how often Joomla checks; each task's own interval decides when it actually runs. A frequent check simply means tasks fire close to their due time.

Step 4 (alternative). cPanel, Plesk or DirectAdmin

No SSH? Every mainstream panel has a cron screen, and the command is identical.

  • cPanelAdvanced → Cron Jobs. Choose Once Per Minute under Common Settings (or set the fields to *), then paste the command.
  • PleskWebsites & Domains → Scheduled Tasks → Add Task, task type Run a command.
  • DirectAdminAdvanced Features → Cron Jobs.

Step 5. Turn the Lazy Scheduler off

With a real cron job in place, the Lazy Scheduler is redundant and only adds work to your visitors' page loads. Go to System → Manage → Scheduled Tasks, click Options, open the Lazy Scheduler tab and set Lazy Scheduler to Disabled. Save.

Option 2. Web Cron (no shell access)

If your host gives you no cron facility at all, Joomla can expose a secret URL that an external cron service calls on a schedule.

  1. Go to System → Plugins and make sure System - Schedule Runner is enabled.
  2. Go to System → Manage → Scheduled Tasks and click Options.
  3. Open the Web Cron tab and set Web Cron to Enabled, then Save.
  4. Joomla generates a Global Key and shows the full Webcron Link (Base). Copy that link.

The link looks like this — note it is a front-end URL, not an administrator one:

https://www.example.com/index.php?option=com_ajax&plugin=RunSchedulerWebcron&group=system&format=json&hash=YOUR_KEY

Give that URL to any external cron service (cron-job.org, EasyCron, Uptime Robot and similar all work) and have it called once a minute.

IMPORTANT Each call runs one due task. If you need several tasks to keep close to their schedule — the Channel Manager's three, for instance — either call the URL several times a minute, or target each task individually by appending its ID: &id=42. The ID is the number shown in the ID column of the Scheduled Tasks list. Even so, system cron remains the better answer for channel syncing.

WARNING Treat the Global Key like a password — anyone holding the URL can trigger your tasks. Never post it in a forum, a support ticket or a screenshot. If it leaks, set Reset Access Key to Yes and save to issue a new one, then update your cron service.

Option 3. Lazy Scheduler (development only)

Out of the box, Joomla uses the Lazy Scheduler: when a visitor loads a page and a task is due, Joomla quietly runs one in the background. It needs no setup, which is exactly why it is the default.

It is also fragile, and unsuitable for anything time-sensitive:

  • No visitors means nothing runs. A quiet night is a night with no syncing and no reminder emails.
  • One task per trigger, so a queue of due tasks drains slowly.
  • It is throttled. The Request Interval (seconds) setting — 300 by default, minimum 60 — caps how often a page load may trigger the scheduler.
  • Your visitors pay for it in page-load time.

It is fine on a development site, and fine for something genuinely relaxed like a daily exchange-rate refresh on a busy site. It is not acceptable for OTA channel syncing, where a stale rate becomes a mispriced booking.

Creating and scheduling a task

Whichever trigger you chose, the tasks themselves are created the same way.

  1. Go to System → Manage → Scheduled Tasks and click New.
  2. Pick the task type from the list — for example Solidres - Channel Manager Sync. If a Solidres task type is missing, its plugin is not installed or not enabled; check System → Plugins for Task - Solidres ….
  3. Give it a Title. The default is fine.
  4. On the Details tab set the schedule. Choose Interval, Minutes and enter 1 for the Channel Manager tasks; Interval, Hours or Interval, Days suit the slower ones. Cron Expression (Advanced) is there if you need precise timing such as "every day at 04:00".
  5. Save & Close, and make sure the task is enabled in the list.

Suggested intervals

Task type Suggested interval Why
Solidres - Channel Manager Sync Interval, Minutes = 1 Rate and availability changes should reach your channels quickly
Solidres - Channel Manager Watch Interval, Minutes = 1 Follows each batch the Sync task sent
Solidres - Channel Manager Log Interval, Minutes = 1 Keeps the activity log current
Solidres - iCal Interval, Hours = 1 iCal is a polling format; hourly is the usual compromise
Solidres - Invoice Interval, Hours = 1 Balance-due reminders are not urgent to the minute
Solidres - Currency Interval, Days = 1 Exchange-rate feeds update daily

These are starting points, not requirements. Tune them to your property.

NOTE A long-running task can hit the Task Timeout (seconds) limit under Options → Configure Tasks (300 by default). If a big import is being cut short, raise it — and check your PHP max_execution_time too.

Checking that it works

Three quick checks, in order of directness:

  • Run one by hand. In the Scheduled Tasks list, use the Run Manually button on a task. It runs immediately and reports the outcome, which separates "my cron is not firing" from "this task is failing".
  • Read the list columns. Last Run and Next Run tell you whether anything is triggering the scheduler at all. If Last Run never changes, the trigger is the problem, not the task.
  • Watch the feature itself. For channel syncing, add the Channel manager activities widget to Solidres → Dashboard — it logs every sync operation in both directions.

Troubleshooting

Symptom Cause and fix
Nothing runs, and Last Run stays empty Nothing is triggering the scheduler. Run the command by hand over SSH — if that works, the cron entry is wrong (usually the PHP binary path or the site path).
Only one task runs each time The --all flag is missing from the cron command, or you are on Web Cron / Lazy Scheduler, which run one task per trigger by design.
Could not open input file: cli/joomla.php The site path is wrong. Use the absolute path to the folder holding configuration.php.
command not found from cron, though it works over SSH Cron runs with a minimal PATH. Always use the full binary path, /usr/bin/php rather than php.
PHP version or missing-extension errors The CLI binary is a different PHP build from your site's. Ask your host for the binary matching your site's version.
The Web Cron URL returns a 403 Web Cron is disabled in Options, the hash does not match the Global Key, or you are calling the administrator URL. Re-copy the link from Options.
A Solidres task type is not offered on the New Task screen Its Task - Solidres … plugin is not enabled. Check System → Plugins.
Tasks run but the feature still looks stale The trigger is fine, so the problem is in the feature. Use Run Manually and read the reported output.

Good practice

  • One cron entry is enough. A single scheduler:run --all covers every task, Solidres and otherwise. Do not add one entry per task.
  • Log while you are setting up, then go quiet. Redirect to a file until you trust it, then discard the output.
  • Keep the Global Key secret if you use Web Cron, and reset it if it is ever exposed.
  • Re-check after a host migration or a PHP upgrade. A changed binary path or site path silently stops cron, and the first symptom is usually a channel-sync complaint days later.

If your channel manager is the reason you are here, carry on with How to configure Solidres Channel Manager — it covers the three Channel Manager tasks in the context of the full setup.

All the things you need to make your work easier. Did you like Solidres?