Browse the manual
Common issues
Quick fixes for common Made with Pepper installation and setup issues.
On this page
Start with the error message in storage/logs/laravel.log or your hosting error log.
Blank page or 500 error
Check:
- PHP 8.4+ is active for the site
- Required PHP extensions are enabled
storage/andbootstrap/cache/are writable.envexists after setupvendor/exists in the uploaded filespublic/build/manifest.jsonexists in the uploaded files- Your web server points to
public/
The specific error is usually in storage/logs/laravel.log or your hosting error log.
Do not fix a normal buyer install by running Composer, npm, Vite, or Node.js commands. The release package should already include vendor/ and public/build/. If those folders are missing, re-upload the complete release package.
Made with Pepper does not load runtime assets from CDNs. Missing styles or scripts usually mean public/build/ was not uploaded correctly.
A directory is not writable
Make these directories writable by the web server:
storage/bootstrap/cache/
On most shared hosts, permissions of 755 or 775 work. Some hosts require changing the file owner through the control panel.
Database connection fails
For a fresh installation, confirm that the server runs MySQL 8.4, or MariaDB 10.11, 11.4 or 11.8, and verify:
- Host
- Port
- Database name
- Username
- Password
- User permissions
Some hosts use localhost; others require a hostname from the hosting panel.
The installer names the reason when the check fails, and writes it to storage/logs/laravel.log without the password. Each message and its fix is in Database check messages.
The fresh installer does not accept other MySQL versions, MariaDB 10.6 and earlier, MariaDB short-term releases, or a database that already contains unrelated tables. Create a new empty database on a supported server instead of removing tables through the installer. The installer does not upgrade an existing Made with Pepper installation. It refuses its database before any migration and changes nothing. Follow Updates for an existing installation; the package must support your installed version as a starting point. See the changelog for upgrade notes.
The server must support the InnoDB storage engine. Made with Pepper creates all tables as InnoDB tables, also when the server uses MyISAM as its default engine.
If installation fails during database setup, find the support reference from the message in storage/logs/laravel.log. The log entry shows the database error code and message. If the message says that installation stopped while it created the database tables, follow Failure recovery. Remove partial tables only from the new, empty installation target that this failed attempt created. Never remove existing business data. See Failure recovery.
Links or styles break in a subfolder
Made with Pepper does not run in a subfolder such as example.com/invoices. Links, signed quote links, cookies and assets can break there. Move the installation to a domain or subdomain, for example invoices.example.com, and point its document root at the public/ directory.
Pages show unstyled content
If a page loads without styles:
- Verify
public/build/manifest.jsonexists - Verify
public/build/assets/contains CSS and JS files - Check that your web server serves static files from
public/
Emails fail after choosing SMTP
If storage/logs/laravel.log shows UnsupportedSchemeException or a mailer scheme error, open .env and set MAIL_SCHEME=smtp for port 587 or MAIL_SCHEME=smtps for port 465. The mailer does not accept the values tls and ssl.
An email stays queued or shows an unknown result
Open the document and read its Delivery tab.
- Email queued for a long time: the cron job does not run. The page says "The scheduler has not run since {time}. Check the cron job." Check the cron entry, then look at Settings > Email for the time of the last run.
- Email failed: read the reason. Fix the recipient address or the mail settings, then click Send again.
- Email result unknown: Made with Pepper does not know if the email left the mail server. Check the sent log of your mail provider. Click Send again only if the email is not there.
- Not emailed after you sent: the mail setting writes emails to the log file. Set
MAIL_MAILERtosmtporresendin.env.
See Retries and results.
The issued original is missing or changed
The document page says "The issued original (PDF) is missing or changed. Restore it from a backup." Made with Pepper found no file, or a file that does not match its SHA-256. Recover a complete database and media snapshot in a separate installation. Until then, Download regenerated copy gives a copy marked "Regenerated copy. The issued original is not available." Made with Pepper does not email that copy.
Wrong timezone
Check Business timezone in Settings > Company first. It controls business dates and scheduled document work. The installer also writes APP_TIMEZONE for the server default.
Unexpected logout or session expiry
Made with Pepper logs you out after 30 minutes of inactivity by default, unless you check Remember me when logging in. Remembered sessions bypass the idle timeout.
If you are not using "Remember me" and the timeout is too short, increase it in .env:
SESSION_IDLE_TIMEOUT=60
Set to 0 to disable the idle timeout for all sessions.
See Security > Troubleshooting sessions for full details, including shared hosting considerations and the interaction between "Remember me", idle timeout, and session lifetime.
403 forbidden on a page
If a team member gets a 403 error on a page, their role does not allow access to that area.
| Page | Requires |
|---|---|
| Settings, users, backups, update | Owner or admin role |
| Audit log | Owner or admin role for every event; the accountant sees their own events |
| Reports, data exports | Owner, admin, or accountant role |
| Create/edit invoices, customers, items | Owner, admin, or employee role |
Check the user's role in Settings > Users. See Roles and permissions for the full matrix.
Error pages
Every error page says what happened and offers one next action. The pages work without the database and without the compiled assets, so they still show when the server has a problem. A page for a missing record uses the language of the person who opens it.
| Code | Title | What to do |
|---|---|---|
| 403 | Access denied | Your role does not allow the page. Ask an owner or admin, or click Go to homepage |
| 403 | This link is not valid | A signed link, such as a public quote link, was changed or copied incompletely. Use the complete link from the email, or ask the sender for a new one |
| 404 | Page not found | Check the address, or click Go to homepage |
| 405 | Action not allowed | The page does not accept that kind of request. Click Go to homepage and try again from there |
| 410 | No longer available | The link has expired or was withdrawn. Ask the sender for a new one |
| 413 | Upload too large | The file or form is larger than the server accepts. Choose a smaller file, or raise upload_max_filesize and post_max_size in PHP |
| 419 | Page expired | The session expired. Click Try again and sign in again if needed |
| 422 | Request not accepted | Click Go back, check the details and try again |
| 429 | Too many requests | Wait a moment, then click Try again |
| 500 | Something went wrong | Check storage/logs/laravel.log, or click Go to homepage |
| 503 | Temporarily unavailable | The installation is in maintenance, for example during a restore or an update. Click Try again later |
Recurring invoices not generating
Recurring invoices require a cron job. Check:
- A cron entry runs
php artisan schedule:runevery minute - The schedule is Active (not paused or completed)
- The schedule's next invoice date is today or in the past
- The server timezone matches
APP_TIMEZONEin.env
You can generate manually from the command line:
php artisan recurring:generate
See CLI commands for cron setup instructions.
Reminders not sending
Automatic reminders require cron, a working email configuration, and the reminders toggle. Check:
- A cron entry runs
php artisan schedule:runevery minute - Settings > Reminders has reminders enabled
- The invoice status is Issued or Partially paid (not Draft or Paid)
- Someone emailed the invoice, or recorded a delivery. An invoice that shows Not emailed gets no automatic reminders
- The customer has a contact with Receives reminders, or an email address. The invoice page says "No reminder recipient" when nobody can receive a reminder
- The invoice has not reached the reminder cap (default: 5 automatic reminders per invoice)
- Email delivery is configured correctly (SMTP or Resend API in
.env) - The customer has not disabled reminders via a per-customer override
You can queue the automatic reminders from the command line:
php artisan reminders:send
Backup or restore fails
Backup creation fails
- Check that the PHP account can write to
storage/backups/andstorage/framework/. - Check that
proc_open()andmysqldumpare available to PHP.mariadb-dumpalso works. - Check free disk space and the archive limits.
- Check that the account can read its database and both media directories.
A failed dump, timeout or failed write stops creation. Incomplete files do not appear as completed backups. Messages omit database credentials and raw client diagnostics.
Restore fails
Recovery runs from the shell in a separate installation. The browser cannot overwrite an existing database.
| Refusal | Action |
|---|---|
| Destination is not empty | Prepare another empty database and media directories. Do not remove existing business data |
| Backup cannot be verified | Check the original APP_KEY, archive passphrase and downloaded file. Older unsigned backups are unsupported |
| Version or schema is incompatible | Use the matching trusted package, or an upgrade that declares your source version and schema |
| Issued original is missing or changed | Inspect the artifact IDs from recovery:verify. Recover a complete database and media snapshot |
| Backup engine does not match | Restore a MySQL backup on MySQL and a MariaDB backup on MariaDB. Made with Pepper does not convert a dump between engines |
| Database server is not supported | Use MySQL 8.4, or MariaDB 10.11, 11.4 or 11.8 |
| Import or migration failed | Keep the target in maintenance. Inspect the failure or prepare another empty destination |
| Release file or compatibility check failed | Download the correct package again from your Made with Pepper purchase or support channel. Check the required PHP and database versions |
Recovery requires proc_open() and mysql, or mariadb. Follow the complete procedure, including key preservation and verification.
The snapshot omits newer records
Keep the source intact. Stop all writers and take a new final snapshot before a planned cutover.
For disaster recovery, reconcile missing invoices and payments before activation. After the replacement receives writes, never switch back to the stale source.
An update does not install
Updates lists every check with its result. Fix the red check, then click Check package again.
| Problem | Action |
|---|---|
| The upload fails or the file is too large | The page shows the largest file your server accepts. Upload the ZIP by FTP or the hosting file manager to storage/app/private/updates, then click Refresh list |
| The package files are not complete or are changed | Download the ZIP again from your purchase or support channel. Do not unzip it or open it in an editor |
| The installed files do not match your version | Someone changed the application code. Restore the original files, or use the replacement procedure |
| The package cannot update your version | Install the releases in order, or ask support which release supports your version |
| The database holds tables of another application | Move Made with Pepper or the other application to its own database, or use the replacement procedure |
| The Update page does not open during an update | Use the browser that started the update. Otherwise follow If the site stays in maintenance mode |
| The server cannot make a database backup | Ask your hosting provider to allow mysqldump or mariadb-dump, or use the replacement procedure |
| The update failed and was undone | The previous version runs with its data. Send the reason that the page shows to support |
| The update could not be undone | The site stays in maintenance mode. Restore the named backup with the backup recovery procedure, or contact support |
Still stuck
See Getting support and include the relevant log lines, Made with Pepper version, PHP version, database type, and exact steps to reproduce.
A permitted page is missing
Check enabled modules, the account role and any guest scope. A permission does not enable a disabled module. A guest scope can hide records without changing their existence. Ask the owner to review Product areas and access.
Need help with the product?
Contact support