Manual file replacement.
Update by uploading files via FTP or SFTP. The fallback method for shared hosting and environments without exec().
Manual file replacement is the universal fallback for updating Reward Loyalty. You download the latest version, upload the files to your server via FTP or SFTP, and run migrations yourself. No exec() function needed.
This is the right method when:
- Your hosting provider disables the
exec()PHP function (common on shared hosting) - You don't have SSH or CLI access
- You prefer full manual control over every file that changes
💡 If your server supports
exec(), consider Install from Package instead. It automates backup, extraction, and migration while still letting you control which version to install.
You can run a manual update for any release your license entitles you to download. Your license includes updates for the major version available at the time of purchase, but not an automatic right to a future major version unless we announce otherwise or provide it in writing.
Before you start
Back up everything. Download your entire installation before making changes. These items matter most:
- Your
.envfile (environment configuration) - Everything in
public/files/(user uploads and media) database/database.sqliteif using SQLite (MySQL/MariaDB users skip this, the database is external)
Update steps
Option A: Staging environment (recommended)
This approach keeps your production site running while you prepare the update. If you don't have a staging environment yet, see Staging Installation for setup guidance.
1. Upload the new version to a temporary subdomain (like staging.yourdomain.com).
2. Copy your data from your current production installation to the staging installation:
Your .env file contains your environment configuration. The public/files/ directory contains all user uploads. If you use SQLite, copy database/database.sqlite as well.
To see hidden files like .env on macOS, press Cmd + Shift + . in Finder.
3. Run database migrations by signing in as admin at /en-us/admin/. If migrations are pending, you'll see a message: "An update is required for your database. Click here to apply the update." If you have terminal access, you can also run php artisan migrate --force instead.
4. Clear caches by deleting the .php files inside bootstrap/cache/. Use the file manager in your hosting panel or your FTP client: open the bootstrap/cache/ folder, delete the .php files in it, and keep the folder itself in place.
If you have terminal access, this one command does the same:
rm -f bootstrap/cache/*.php
With terminal access you can also run php artisan optimize:clear instead.
5. Test everything. Verify login works, member data is intact, and uploaded files display.
6. Switch to production by updating your DNS to point your main domain to the staging installation, or rename directories if both are on the same server.
Option B: In-place update
If you prefer not to use a staging subdomain:
1. Back up everything as described above.
2. Delete or move all files on the server to a backup folder.
3. Upload the new version by opening the extracted package root and uploading every top-level file and directory. Do not upload only the package's internal public directory.
4. Restore your data by copying back your .env file, your public/files/ contents, and database/database.sqlite if using SQLite.
5. Run migrations and clear cache as described above.
The new version includes an empty public/files/ directory. Depending on your upload method, this may overwrite your existing uploads. Always back up first and restore after.
Clearing caches after update
After replacing files, you should clear cached configuration to prevent 500 errors:
- Delete bootstrap cache files: Remove all
.phpfiles inbootstrap/cache/ - Clear framework cache: If you have terminal access, run
php artisan optimize:clear - Reload the page: Your admin dashboard should load with the new version
If your site shows a 500 error after updating, clearing bootstrap/cache/ resolves it in most cases.
Protecting custom files
During a manual update, you manage protected paths yourself by backing up and restoring any custom files. To protect these same files during future automated updates, add them to your .env file:
PROTECTED_TRANSLATIONS="de_DE,fr_FR"
PROTECTED_PATHS="custom/branding/"
See What Gets Preserved for the complete list of core protected paths.
Consider automated updates
Manual file replacement works on any hosting, but automated methods are faster and handle backups for you:
- Dashboard Update: One click, automatic. Requires active support +
exec(). - Install from Package: Place the zip on your server, dashboard handles the rest. Requires
exec()but no active support.
If you're on VPS hosting with exec() available, either method is faster and safer.