Updating.
Three ways to update Reward Loyalty: dashboard updates, install from package, and manual file replacement.
💡 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 | VPS, dedicated servers | Active support + exec() |
| Install from Package | VPS, dedicated servers | 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.

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.
If a server reboot or a killed process leaves 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()andnohupon Linux or macOS,popen()andstart /Bon Windows. Many shared hosts disable these. - Writable
storagedirectories and thecache_locksdatabase table, both present in a standard install.
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 Install from Package or Manual File Replacement instead, or ask your host to allow background processes.
→ 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. No active support license needed. If you have the zip, you can install it.
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
Only dashboard updates need a license (downloading from the update server). Install from Package and Manual File Replacement work without an active license.
- Sign in as an administrator at
/en-us/admin - Go to License & updates in the sidebar
- Enter your license key
- Enter your Production domain, the primary domain where you installed Reward Loyalty (e.g.,
mysite.com) - 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 or install from package, the system replaces all application files except for protected paths. The update overwrites any files or directories not in the protected list.
Core protected paths
The updater always protects these paths:
.env, your environment configuration.htaccess, server configurationstorage/app, application storage filesstorage/logs, log filesbootstrap/cache, cached framework filespublic/files, user uploads and mediapublic/.htaccess, public directory server configpublic/favicon.ico, your site icondatabase/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_TRANSLATIONSonly preserves files during updates. It does not make a language active.APP_ACTIVE_LOCALEScontrols 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
.envbefore 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 system backs up your installation. The License & updates screen lists these under Available backups, where each backup offers two actions:
- 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.