Skip to content

Updating.

Three ways to update Reward Loyalty: dashboard updates, install from package, and manual file replacement.

Aug 12, 2026

💡 Always test updates in a test environment before updating production. Back up your database, verify everything works, then deploy. See Staging Installation for setup instructions.

Your license includes updates for the major version available at the time of purchase. That includes patch and minor updates within the same major release line, but does not include the next major version unless we announce otherwise or provide it in writing.

Three ways to update

Choose the method that fits your hosting environment:

Method Best For Requirements
Dashboard Update Hosts that allow long background commands Active support + exec()
Install from Package Hosts that allow long background commands exec() (no support needed)
Manual File Replacement Shared hosting, no exec() FTP/SFTP access

Dashboard update

The fastest option. The admin dashboard checks for new versions, downloads the update, and installs it.

Requirements: Active support license and the exec() PHP function (available on VPS hosting, often disabled on shared hosting).

Open License & updates and click Check for updates. When a new version is available, review the changes and click Install update. The system downloads the update, backs up critical files, applies changes, runs database migrations, and clears caches.

The License & updates screen with automatic backups ready to restore and a detected update package with its Apply update button.

Update checks run only when you click Check for updates. Each check contacts the update server, so a fresh release appears as soon as you check for it. Reward Loyalty does not poll for updates in the background.

The download, backup, file swap, and migrations run in a separate command-line process that Reward Loyalty starts for you (php artisan updater:run), while your browser follows a live progress page. Keep that page open, it sends you back when the update finishes. The web request that starts an update returns at once, so an update no longer risks a request timeout while it works. One update or restore runs at a time, so you cannot start a second one on top of a run in progress.

A server reboot, a hosting resource limit, or a killed process can leave a run stuck. An operator can clear it from the command line with php artisan updater:release. The command refuses to clear a run whose process is still alive, so it cannot cut a real update short.

What automatic updates need

This detached process is not a Laravel queue job, so you do not need queue:work, Supervisor, Redis, or cron, and the default QUEUE_CONNECTION=sync is fine. What it does need:

  • A working PHP command-line binary.
  • Permission to start a background process: exec() and nohup on Linux or macOS, popen() and start /B on Windows. Many shared hosts disable these.
  • Writable storage directories and the cache_locks database table, both present in a standard install.
  • Enough CPU, disk I/O, memory, and temporary space for the rollback download, package extraction, and file replacement. Shared plans with strict disk limits can stall during this work.

When a host blocks background processes, the update stops within about ten seconds, before it replaces any file, and reports the failure. Your installation keeps running on the current version. Use Manual File Replacement instead, or ask your host to allow background processes. Install from Package does not help here because it uses the same background process.

Reward Loyalty finds the PHP command-line binary on its own: it checks the binary serving your site, its command-line siblings, the system PATH, and the usual locations on cPanel, Plesk, CloudLinux, and LiteSpeed hosts, and verifies the version of every candidate before using one. When no PHP 8.4+ command-line binary turns up, the update stops with a message listing every path it tried. On hosts where detection cannot win, point it at the right binary yourself in .env:

UPDATER_PHP_BINARY=/opt/alt/php84/usr/bin/php

The path is verified before use, so a wrong value falls back to normal detection instead of breaking updates.

Rollback backup

Before it installs an update on a registered installation, the updater downloads the official package for the version that is still running and stores it under Available backups. This rollback package is separate from the new version. Dashboard Update downloads the new version from the update server. Install from Package uses the ZIP that you uploaded.

Downloading one rollback package avoids reading and compressing every application file. It needs a registered license and a connection to the Reward Loyalty update server. It still works after update support ends because the server returns only the version that the installation already runs.

The updater checks the rollback package's server address, SHA-256 checksum, version, and folder structure. It checks the ZIP again after it extracts the new version and before it deletes a live file. If a check fails, the update stops and leaves the current application files in place.

This backup uses less disk I/O. Extraction and file replacement still use disk I/O. Use Manual File Replacement when the host stops the update.

→ See Activating Your License to enable dashboard updates.

Install from package

You already have the zip file. Let the admin dashboard handle the rest. Place the downloaded zip in storage/app/manual-update/ on your server, and the dashboard detects it.

Requirements: The exec() PHP function. Active support is not required.

This uses the same detached updater process as dashboard updates (backup → extract → migrate → cache clear), with the same hosting requirements. The only difference: the zip comes from your server instead of the update server.

→ Full instructions: Install from Package

Manual file replacement

Upload files via FTP or SFTP. This is the fallback for shared hosting environments where the host disables exec().

Requirements: FTP/SFTP access. Works on any hosting environment.

You download the latest version, upload the files to your server, and run migrations. No automated backup or cache clearing. You handle each step.

→ Full instructions: Manual File Replacement

Activating your license

Dashboard Update needs active support. Install from Package works without active support or registration. A registered installation uses the low-I/O rollback download; an unregistered installation keeps the full file backup for compatibility. Manual File Replacement does not contact the update server.

  1. Sign in as an administrator at /en-us/admin
  2. Go to License & updates in the sidebar
  3. Enter your license key
  4. Enter your Production domain, the primary domain where you installed Reward Loyalty (e.g., mysite.com)
  5. Click Activate license

You receive your license key when you buy. Find it in your purchase confirmation email or in your account on the store where you bought.

The system validates the key for you, then shows your license status and support expiration date.

To move the license to another installation, click Deactivate license on the same screen. That removes the license from this installation, and you can reactivate it at any time with your license key.

Update entitlement

Your license includes updates for the major version available at the time of purchase. That includes patch and minor updates within the same major release line, but does not include the next major version unless we announce otherwise or provide it in writing.

If we keep an older major version updated, provide a free major upgrade, or extend update access beyond these terms, that does not waive our right to limit future update access to the licensed major version.

What gets preserved

When you run a dashboard update, install from package, or restore a package rollback, the system replaces application files except for protected paths. The update overwrites any file or directory outside the protected list.

Core protected paths

The updater always protects these paths:

  • .env, your environment configuration
  • .htaccess, server configuration
  • storage/app, application storage files
  • storage/logs, log files
  • bootstrap/cache, cached framework files
  • public/files, user uploads and media
  • public/.htaccess, public directory server config
  • public/favicon.ico, your site icon
  • database/database.sqlite, SQLite database (if using SQLite)

The core protected paths may change with future updates. The definitive list is always in config/reward-loyalty.php under the protected_paths array.

Protected files and new features

Protection comes with a trade-off. Your customized files survive every update, which also means a new feature cannot add its own settings to them. When a release introduces configuration keys for a protected file, your copy keeps working without them and the feature stays off until you add the keys yourself. The changelog notes this per release with the exact lines to add.

config/plans.php used to be the main example of this trade-off: it was protected, so you had to add new plan keys (prepaid passes, member segments) to it by hand after an update. Since version 5.10.0 the file is no longer protected. Updates replace it with the shipped defaults, so new plan keys now arrive on their own and need no hand edit.

That change has one consequence for installs that customized the file itself, as those earlier upgrade notes suggested. Prices, currency, limits, feature flags, or any other value you wrote into config/plans.php do not survive the update to 5.10.0 or later; the first sign is often plan prices showing in US dollars again. Re-enter those values once in the admin Plans editor or as PLAN_<TIER>_<SETTING> environment values. Both layers apply on top of the file and survive every future update. You can also grant a single feature per partner under Partners → Permissions without touching plan configuration at all.

Protecting custom files

If you've added custom translations, branding, or other files you want to preserve across updates, add them to your .env file:

PROTECTED_TRANSLATIONS="de_DE,fr_FR"
PROTECTED_PATHS="custom/branding/,my-custom-file.php"

PROTECTED_TRANSLATIONS: A comma-separated list of translation locale folders to preserve. These are relative to the lang/ directory. For example, de_DE,fr_FR protects lang/de_DE/ and lang/fr_FR/.

Note: PROTECTED_TRANSLATIONS only preserves files during updates. It does not make a language active. APP_ACTIVE_LOCALES controls which languages are visible. See Languages & Translations.

PROTECTED_PATHS: A comma-separated list of additional files and directories to preserve. Use paths relative to the application root. Add a trailing slash for directories (e.g., custom/branding/) or omit it for files (e.g., my-custom-file.php).

⚠️ Important: If you've made any customizations outside of protected paths, automated updates will overwrite them. Always add your custom paths to .env before updating.

Note: When using Manual File Replacement, you manage protected paths yourself by backing up and restoring files.

Restoring a backup

Before every dashboard or package update, the updater creates a rollback backup for the version that is still running. Registered installations download a verified release package. An unregistered Install from Package run creates a full file backup instead. The License & updates screen lists the result under Available backups.

  • Restore returns your application files to the backed-up version. It does not revert database changes from updates; if the older code has trouble with the newer schema, update to the latest version again.
  • Delete backup removes a backup for good to free disk space.

The system never removes old backups on its own. Each update adds a new one, so delete backups you no longer need from this screen once in a while.

Checking your version

Your current version displays on the admin dashboard and in the License & Updates section.

Updates and support renewal

Your purchase includes 12 months of updates and support. After that, renewal is optional: $99 a year. You can renew at any time, even after it has lapsed.

The install runs forever even if you stop renewing. A lapsed customer keeps the last version they received, and the software keeps working. Renewing gives you dashboard updates and direct support again. Use the /support page for the current support channel.

Even without an active renewal, you can download the version you already own from your purchase and use Install from Package or Manual File Replacement.