Common issues.
Solutions to common problems.
This guide covers common problems and their solutions.
Start here
Check the affected page and note the error message. If you can sign in as an administrator, open the Health Center for configuration warnings.
A problem can depend on application code, account data, settings, or hosting. You do not need to identify the cause before contacting support.
Error 500 (server error)
A 500 error means something went wrong on the server. To diagnose:
- Check the log file:
storage/logs/laravel.log - Look for the most recent error entry
- The error message often indicates the cause
Common causes
Missing PHP Extension:
Especially ext-intl (Internationalization). Ensure all required extensions are enabled.
File Permissions:
The storage/ and bootstrap/cache/ directories must be writable by the web server.
Ask your host to check ownership and permissions for the PHP process. The correct user and permission settings depend on the server. See Server requirements.
Environment File Missing:
Ensure .env exists and contains valid configuration.
Directory listing instead of app
If you see a folder structure instead of the application:
Missing .htaccess
Some operating systems hide files starting with a dot. On macOS, press Cmd + Shift + . to show hidden files. Ensure .htaccess was uploaded.
mod_rewrite disabled
Apache's mod_rewrite module must be enabled. Contact your hosting provider if unsure.
Image upload problems
If images fail to upload:
- Check that
proc_openandproc_closePHP functions are enabled - Verify the
public/filesdirectory is writable - Check upload size limits in
php.ini
Email configuration issues
Email is required for OTP login, new user verification, and password resets. If email delivery isn't working, OTP sign-in won't work and many users (especially members) won't be able to access the platform.
During installation
The installation wizard includes a test email feature to verify your configuration before completing setup. If you encounter errors:
"Cannot connect to the mail server"
Cause: Server address or port is incorrect.
Solution:
- Verify the SMTP host against your provider's settings. See Email configuration for production setup.
- Try common ports:
- 587 for TLS (most common)
- 465 for SSL
- Check if your hosting provider blocks outbound email ports
- Verify your server has internet access
"Invalid username or password"
Cause: Credentials are incorrect.
Solution:
- For Gmail: You must use an App Password, not your regular Gmail password
- Enable 2-Step Verification in Google Account settings
- Go to Security → App passwords
- Generate a new app password for "Mail"
- Use the 16-character code in the password field
- For other providers: Verify username and password are correct
- Check for typos or extra spaces when copying credentials
"The mail server refused the connection"
Cause: Server is blocking the connection or port is wrong.
Solution:
- Try switching between port 587 (TLS) and 465 (SSL)
- Check your server's firewall settings
- Verify SMTP access is enabled for your email account
- Contact your hosting provider about outbound email restrictions
"Connection timed out"
Cause: Network issue or server is unreachable.
Solution:
- Check your internet connection
- Verify the SMTP server is online and responding
- Wait a few minutes and try again
- Check if your hosting provider blocks outbound connections on email ports
"Security error"
Cause: SSL/TLS encryption mismatch.
Solution:
- Try switching encryption settings:
- Port 587 usually requires TLS
- Port 465 usually requires SSL
- Use the encryption and port pair specified by your email provider. Do not disable encryption to work around a connection error.
"The server rejected the email"
Cause: Sender address not authorized.
Solution:
- Use an email address from a verified domain
- For Mailgun/SES: Verify the sender domain in your account dashboard
- For SMTP: Ensure the "from" address matches your authenticated account
- Check your email provider's sender authentication requirements
"Mail relay not permitted"
Cause: Server doesn't allow sending from this address.
Solution:
- Verify the "from" address is authorized by your email provider
- Ensure SMTP authentication is set up
- Check that your username matches the "from" address
- Contact your email provider about relay permissions
Test email sent but not received
If the test shows success but you don't receive the email:
- Check spam/junk folder: Test emails often get filtered
- Wait 2-3 minutes: Email delivery can be delayed
- Verify the email address: Check for typos in the test email field
- Try a different email: Test with another email provider
- Check email provider settings: Some providers block automated emails
After installation
If emails aren't working after installation completes:
Check Configuration:
Verify your email settings in .env:
MAIL_MAILER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your-username
MAIL_PASSWORD=your-password
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME=Your App Name
For Gmail testing and production provider setup, use the email configuration guide.
Check Logs:
Review storage/logs/laravel.log for specific error messages. The log will show detailed information about why emails are failing.
Emails going to spam
If system emails consistently land in spam folders:
Possible causes:
- Using a free email address (Gmail, Yahoo, etc.) as the sender
- Missing SPF, DKIM, or DMARC DNS records
- Low sender reputation
Solutions:
- Use an email address from your own domain (
[email protected]) - Configure SPF records to authorize your email server
- Set up DKIM signing for email authentication
- Add a DMARC policy to your domain
- Consider using a transactional email service (Mailgun, SES, Postmark, Resend)
- Consult your email hosting provider's documentation
Development options
For local development, use these options instead of production email:
Mailpit:
- Catches all emails locally without sending them
- View emails at
http://localhost:8025 - Requires Mailpit running locally
- Set
MAIL_MAILER=mailpitin.env
Log File:
- Writes full email content to
storage/logs/laravel.log - No setup required
- Set
MAIL_MAILER=login.env
⚠️ Warning: Never use development drivers in production. Mailpit and Log drivers don't send real emails.
Database errors
Connection refused
Verify database credentials in .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password
Table not found
Database migrations may not have run. Sign in as admin and check for migration prompts.
"Specified key was too long" during installation
If you see an error like Specified key was too long; max key length is 1000 bytes during installation, your database server is using a non-standard storage engine (usually Aria or MyISAM) instead of InnoDB.
This happens on some shared hosting providers (especially on CloudLinux / cPanel) that override the default MariaDB or MySQL storage engine. Reward Loyalty requires InnoDB for proper database functionality.
Fix:
Open config/database.php and change 'engine' => null to 'engine' => 'InnoDB' for your database connection:
'mysql' => [
// ... other settings ...
'engine' => 'InnoDB',
],
'mariadb' => [
// ... other settings ...
'engine' => 'InnoDB',
],
Then:
- Confirm this is a new installation with no business or member data.
- Ask your host to provide an empty database that uses InnoDB.
- Restart the installation with that database.
Existing installation: Do not delete its tables or installation marker. Back up the installation and contact support for the specific error.
💡 Note: InnoDB is the standard engine for MySQL 5.7+ and MariaDB 10.3+ and is enabled on nearly all hosting providers. This setting ensures your database uses it instead of a less capable alternative.
Refreshing after updates
If the application behaves unexpectedly after an update:
php artisan optimize:clear
Run this from the application directory with the PHP version your installation uses. It clears Laravel application caches; it does not remove member balances or transactions.
Plesk: Updates failing or incomplete
If you're using Plesk and the in-app updater seems to fail with no message or updates don't apply as expected, the issue is often a PHP version mismatch between web and CLI.
Symptoms
The application log (storage/logs/laravel.log) shows PHP discovery messages like these (the update runner itself writes its steps to storage/logs/updater.log):
UPDATE: FPM binary detected, searching for CLI equivalent
UPDATE: Testing FPM-derived path {"path":"/opt/plesk/php/8.4/sbin/php8.4","works":false}
UPDATE: FPM CLI equivalent not found, falling through to PATH search
UPDATE: Found suitable PHP binary {"path":"/opt/plesk/php/8.5/bin/php"}
The problem
Plesk has PHP 8.4 FPM enabled for your website (handling web requests), but PHP 8.4 CLI is not installed. The updater falls back to a different PHP version (e.g., 8.5), causing:
- Version mismatch: The update process runs with a different PHP version than your web app
- Silent failures: Background processes may fail or behave unexpectedly
- Cache issues: OPcache for PHP 8.4 FPM isn't cleared by PHP 8.5 CLI commands
Solution
In Plesk, ensure both PHP-FPM and PHP CLI use the same version:
- Sign in to Plesk and navigate to your domain
- Go to PHP Settings or PHP Version
- Check that PHP CLI is enabled for the same version as your website
- If PHP 8.4 CLI is not available, contact your hosting provider to install it
Alternatively, you can verify CLI availability via SSH:
# Check which PHP CLI versions are available
ls -la /opt/plesk/php/*/bin/php
# Test if your expected version works
/opt/plesk/php/8.4/bin/php --version
After fixing
Once CLI and FPM versions match, run the updater again.
PHP extension missing (CLI vs FPM mismatch)
If the dashboard updater fails with "extension not available" but the hosting panel shows the web extension is enabled, you're likely hitting a CLI vs FPM configuration mismatch.
💡 Quick fix: If you can't resolve this, use the Manual File Replacement process instead. It bypasses CLI entirely.
Common example: ZipArchive
Your update logs (storage/logs/updater.log) show:
Step 1/7: Extracting package...
ERROR: ZipArchive extension not available
The hosting panel can still show the extension enabled for web requests.
The problem
Most hosting environments manage two separate PHP configurations with independent extension settings:
| Configuration | Used By | Where to Check |
|---|---|---|
| PHP-FPM | Web requests to your website | Hosting panel |
| PHP CLI | Background scripts, updates, artisan commands | SSH terminal |
Many hosting setups have extensions enabled for FPM but not CLI. This affects any feature that runs via command line, including:
- In-app updates (uses CLI to avoid web request timeouts)
- Scheduled tasks / cron jobs
- Artisan commands
- Queue workers
Solution by hosting panel
Plesk
- Go to Tools & Settings → PHP Settings
- Select your PHP version (e.g., PHP 8.4)
- Switch to the CLI tab (not CGI/FPM)
- Enable the required extension (e.g.,
zip,intl,gd) - Click OK to save
cPanel
- Go to MultiPHP INI Editor
- Select your domain
- Enable the required extension
- Note: Some extensions require EasyApache configuration. Contact your host
DirectAdmin / other panels
Contact your hosting provider to enable extensions for PHP CLI. Most panels have separate CLI and FPM configurations that need to match.
VPS / manual setup
Edit the CLI php.ini:
# Find CLI php.ini location
php --ini
# Compare CLI vs FPM extensions
php -m # CLI extensions
# Check web PHP extensions in the hosting panel; do not expose phpinfo publicly.
# Common locations:
# CLI: /etc/php/8.4/cli/php.ini
# FPM: /etc/php/8.4/fpm/php.ini
💡 Tip: The CLI and FPM php.ini files are often in different directories. Enabling an extension in one doesn't enable it in the other.
Workaround (bypass CLI entirely)
If you cannot modify CLI PHP settings, use the Manual File Replacement process. You download the latest version, upload the files via FTP or your hosting file manager, and restore your data. No CLI or exec() required.
Slow performance
If the application runs slowly, especially on Plesk or shared hosting, the issue is often related to PHP's OPcache or memory limits.
Quick fix (SSH required)
Run the Laravel optimization command with increased memory:
php -d memory_limit=512M artisan optimize
This pre-compiles and caches configuration, routes, and views. This can help when missing application caches cause the slowdown. If it does not help, check the Health Center and ask your host to review resource usage.
💡 Note: You may need to re-run this command after updates or when you change
.envsettings.
Optional: PHP settings (Plesk / cPanel)
Ask your host to size PHP workers and OPcache for the available memory and measured load. A worker count copied from another server can exhaust memory. Use the hosting panel for changes, then check response times and error logs.
PWA not installing
Progressive Web App (PWA) features require HTTPS in production. Reward Loyalty uses the browser's built-in "Add to Home Screen" functionality. There is no custom install prompt.
Symptoms
- "Add to Home Screen" option doesn't appear in your browser menu
- Browser doesn't recognize the site as installable
Solution
- Verify HTTPS: Your URL must start with
https:// - Check for mixed content: All resources (images, scripts) must load over HTTPS
- Test manually: In Chrome, open DevTools → Application → Manifest to see validation errors
💡 Note: PWA works on
http://localhostfor local development.
How to install
Use your browser's built-in installation option:
- Chrome (Android/Desktop): Menu → "Install app" or "Add to Home Screen"
- Safari (iOS): Share button → "Add to Home Screen"
Available controls depend on the device and browser. Use the online website if installation is unavailable.
See PWA Configuration for detailed setup instructions.
Offline access not working
Members report they can't see their loyalty cards offline.
Causes
- Card was never viewed while online (nothing to cache)
- Browser cleared cached data
- Unsupported browser
Solution
- View cards online first: QR codes are cached on first view
- Install the PWA: Installing to home screen improves offline reliability
- Check browser: PWA works on Chrome, Safari, Firefox, and Edge. Internet Explorer is not supported.
Testing offline mode
- Visit a loyalty card while connected
- Enable airplane mode
- Reopen the loyalty platform
- Verify the QR code displays with an "offline" banner
Store integration issues
Diagnose orders not earning points, connection failures, and webhook errors from the integration's own dashboard. The Overview tab shows connection and webhook status at a glance. The Activity tab lists recent webhook deliveries and the reason an event was ignored.
- WooCommerce: See the troubleshooting table
- Shopify: See the setup guide
Still stuck?
If these solutions don't help:
- Note the exact error message
- Check
storage/logs/laravel.logfor details - Visit the Support page for help options