Overview
This guide walks you through installing ProposalTrack on cPanel-based shared hosting in about 10 minutes — no SSH or command line required.
cPanel is the most common hosting control panel, used by providers like Namecheap, Bluehost, HostGator, SiteGround, A2 Hosting, GoDaddy, and many others. The screenshots and menu names in this guide refer to cPanel's standard layout.
index.php + .htaccess
means you upload directly to public_html — no need to point your domain at a public/ subfolder.
Hosting Requirements
| Requirement | Minimum | Recommended |
|---|---|---|
| PHP version | 8.2 | 8.3 |
| MySQL / MariaDB | MySQL 5.7 / MariaDB 10.3 | MySQL 8.0 / MariaDB 10.6+ |
| Disk space | 200 MB free | 1 GB+ |
| Apache | with mod_rewrite | Apache 2.4 + mod_rewrite |
| Memory limit | 128 MB | 256 MB |
| Max upload size | 10 MB | 50 MB+ |
Required PHP Extensions
Most cPanel hosts have all of these enabled by default:
pdo_mysql,openssl,mbstring,tokenizerxml,ctype,json,bcmath,fileinfo
What to Prepare
Before starting, have these ready:
- Your cPanel login URL (usually
yourdomain.com/cpaneloryourdomain.com:2083) - cPanel username and password
- The ProposalTrack ZIP file from Codester
- An email address you'll use as the admin account
- SMTP credentials for sending email (optional, can be configured later)
Step 1 — Set PHP Version to 8.2 or Higher
- Log in to cPanel Go to your hosting login URL and sign in.
- Find "Select PHP Version" or "MultiPHP Manager"
-
Choose PHP 8.2 or 8.3
From the version dropdown, select
8.2or higher and click Set as current. -
Enable required extensions
On the same page, click the Extensions tab and ensure these are checked:
pdo_mysql·openssl·mbstringtokenizer·xml·ctypejson·bcmath·fileinfo
- Save changes Click Save.
Step 2 — Upload the ZIP File
- Open File Manager
-
Navigate to the destination folder
For your main domain: open
public_html. For a subdomain or subfolder, see the Subdomain section. -
Upload the ZIP
Click Upload in the top toolbar. Drag your
proposaltrack.zipfile into the upload area and wait for it to reach 100%. - Return to File Manager Once upload is complete, click Go Back to /home/.../public_html.
Step 3 — Extract the Files
-
Right-click the ZIP file
In File Manager, right-click
proposaltrack.zipand select Extract. -
Confirm extraction path
The path should be your current folder (e.g.
/home/username/public_html). Click Extract Files. -
Verify the structure
You should see folders like
app/,config/,public/,storage/,vendor/, plus files likeindex.php,.htaccess, and.env.example. -
(Optional) Delete the ZIP
Once extraction is confirmed, delete
proposaltrack.zipto save disk space.
proposaltrack/ sub-folder instead of putting files directly in
public_html, open it, select all files (including hidden .htaccess and
.env.example), and Move them up one level into public_html.
.htaccess and .env.
Step 4 — Create a MySQL Database
- Open MySQL Database Wizard
-
Create a database
Enter a name like
proposaltrack. cPanel will prefix it automatically (e.g.username_proposaltrack). Write down the full prefixed name. Click Next Step. -
Create a database user
Enter a username (e.g.
ptadmin) — also auto-prefixed (e.g.username_ptadmin). Click the Password Generator for a strong password and copy it somewhere safe. Click Create User. - Assign user to database On the next screen, check ALL PRIVILEGES, then click Next Step.
-
Save these three values
You'll need them in step 7:
- Database name: e.g.
username_proposaltrack - Database user: e.g.
username_ptadmin - Database password: (whatever you generated)
- Host:
localhost(works for 99% of cPanel hosts)
- Database name: e.g.
Step 5 — Set Folder Permissions
ProposalTrack needs to write to a few folders. Most cPanel hosts already use the correct permissions, but it's worth verifying.
-
Open File Manager
Navigate to your installation folder (e.g.
public_html). -
Right-click
storage→ Change Permissions Set to755and check Recurse into subdirectories. Click Change Permissions. -
Repeat for
bootstrap/cacheSet thebootstrap/cachefolder to755as well. -
If your host uses suPHP or LSAPI
755is correct. If you see permission errors later, try775or contact your host.
storage/, storage/app/,
storage/framework/, storage/logs/, bootstrap/cache/.
Step 6 — Configure the .env File
- Show hidden files In File Manager → top-right → Settings → check Show Hidden Files.
-
Locate
.env.exampleRight-click it and choose Rename. Rename to.env. -
Edit
.envRight-click.env→ Edit. If a popup asks about character encoding, click Edit again to confirm. -
Update these values
Important:APP_NAME=ProposalTrack APP_ENV=production APP_DEBUG=false APP_URL=https://yourdomain.com SESSION_DRIVER=file CACHE_STORE=file QUEUE_CONNECTION=syncSESSION_DRIVERandCACHE_STOREmust befile(notdatabase) — otherwise the installer will crash with a session error before you can configure the DB. - Save Click Save Changes in the top-right.
SESSION_DRIVER=database is set before the DB is configured, every page (including the
installer) crashes with "SQLSTATE[28000] Access denied" because Laravel tries to read sessions from a DB
that doesn't exist yet. Setting it to file avoids this chicken-and-egg problem.
Step 7 — Run the Web Installer
-
Open your domain in the browser
Visit
https://yourdomain.com/. You'll be redirected automatically to/install. - Step 1 — Requirements check The installer verifies PHP version, extensions, and folder permissions. All items should be green. If any are red, fix them (usually a PHP version or extension issue from Step 1) and reload. Click Continue.
-
Step 2 — Database
Enter the values you saved in Step 4:
- Host:
localhost - Port:
3306 - Database name:
username_proposaltrack - Username:
username_ptadmin - Password: (your generated password)
- Host:
- Step 3 — Admin account Set your admin email, name, and password. Use a strong password — at least 12 characters with mixed case, numbers, and symbols.
- Step 4 — Site settings Enter your site name (e.g. "My Proposals") and a contact email. Both can be changed later in the admin panel.
- Step 5 — Done! The installer shows a success message and locks itself. Click Go to Admin Panel.
/install returns a 404 automatically. To re-run the installer
(e.g. for a fresh setup), delete the installed row from the settings table in
phpMyAdmin.
Step 8 — Verify Your Installation
- Visit
https://yourdomain.com/— the public upload form loads - Visit
https://yourdomain.com/admin/loginand log in successfully - Admin dashboard loads without errors
- Visit Settings → Email, configure SMTP, and click Send Test Email
- Upload a test proposal from the homepage
- Open the share link in an incognito window — view is tracked in the admin panel
- Configure the cron job (see below)
- Install SSL if not already active (see below)
.env one more time and confirm: APP_DEBUG=false, APP_ENV=production,
APP_URL uses https:// (after SSL is installed).
Install on a Subdomain
Want to run ProposalTrack at proposals.yourdomain.com instead of the main domain?
-
Create the subdomain
Enter
proposalsas the prefix and select your main domain. cPanel auto-creates a folder likepublic_html/proposals. -
Upload & extract files there
In Step 2, navigate to
public_html/proposalsinstead ofpublic_html. Then continue normally from Step 3. -
Update
APP_URLIn.env, setAPP_URL=https://proposals.yourdomain.com.
Install in a Subfolder
To install at yourdomain.com/proposals (under an existing main site):
- Create the folder: in File Manager, inside
public_html, createproposals. - Upload & extract the ZIP into
public_html/proposals. - In
.env, setAPP_URL=https://yourdomain.com/proposals. - Run the installer at
https://yourdomain.com/proposals/install.
public_html has its own .htaccess with rewrite rules
(e.g. WordPress), the ProposalTrack subfolder rules may conflict. If you see 404s, contact us for help.
Install Free SSL Certificate
Most cPanel hosts include free Let's Encrypt SSL.
- Open SSL/TLS Status
- Select your domain & "Run AutoSSL" Click Run AutoSSL. Wait 1-5 minutes.
-
Force HTTPS
Open
.htaccessin your domain root and add at the top (afterRewriteEngine On):RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] -
Update
APP_URLChangeAPP_URL=http://...toAPP_URL=https://...in.env.
Setup the Cron Job (Optional)
Cleans up expired OTP records once a day. Not strictly required but recommended.
- Open Cron Jobs
-
Add a new cron job
Set the schedule to Once Per Minute (or use
* * * * *). -
Enter the command
Replace
usernamewith your cPanel username:cd /home/username/public_html && /usr/local/bin/php artisan schedule:run >> /dev/null 2>&1 - Save Click Add New Cron Job.
/usr/local/bin/php doesn't work, try /usr/bin/php or check
Select PHP Version for the exact binary path. Some hosts use ea-php82 or similar.
Use cPanel Email (SMTP)
If you've created an email account in cPanel (like noreply@yourdomain.com), use it as the SMTP server:
-
Create an email account
Use something like
noreply@yourdomain.com. - Get connection settings On the email account, click Connect Devices. Look for the "Mail Client Manual Settings".
-
Configure ProposalTrack
In the admin panel → Settings → Email:
Host mail.yourdomain.comPort 465(SSL) or587(TLS)Encryption sslortlsUsername noreply@yourdomain.com(full email)Password your email password From address noreply@yourdomain.com - Test it Click Send Test Email.
Backup Your Site
Always backup before upgrades or major changes.
- Open Backup Wizard
- Click Backup → Full Backup Choose Home Directory destination, enter your email for notification, click Generate Backup.
-
Download to your computer
When complete, download the
.tar.gzfile via File Manager. - Backup just the database Alternatively: cPanel → phpMyAdmin → select your database → Export → Quick / SQL.
storage/app/public/uploads folder (all
uploaded proposal files) + your .env file.
500 Internal Server Error
The most common error on cPanel installs. Causes, in order of likelihood:
1. PHP version is too old
Go to Select PHP Version and confirm 8.2 or higher is selected. If your host doesn't offer 8.2+, contact them or switch hosts.
2. Wrong file permissions
In File Manager, set:
- All folders:
755 - All files:
644 storage/andbootstrap/cache/: writable (755 or 775)
3. Missing .env file or APP_KEY
Make sure .env exists (renamed from .env.example) and contains a valid APP_KEY=base64:.... If APP_KEY is empty, you can paste a fresh one from .env.example.
4. Check the actual error
Set APP_DEBUG=true in .env temporarily, reload the page, and read the real error message. Set it back to false after debugging.
Also check storage/logs/laravel.log in File Manager for the full stack trace.
SQLSTATE[28000] / "Access denied for user 'root'"
This happens when SESSION_DRIVER=database or CACHE_STORE=database is set but the database isn't configured yet (or has wrong credentials).
Fix:
- Open
.envin File Manager - Change these three lines:
SESSION_DRIVER=file CACHE_STORE=file QUEUE_CONNECTION=sync - Save the file
- Reload your domain — installer will load correctly
database, which means Laravel tries to query
MySQL on every request. Before installation, MySQL credentials are empty, so it crashes. File-based
drivers work fine in production and avoid the dependency.
"Permission denied" / "failed to open stream"
Laravel can't write to storage/, bootstrap/cache/, or the log files.
Fix:
- In File Manager, right-click
storage→ Change Permissions - Set to
755, check Recurse into subdirectories, click Change Permissions - Repeat for
bootstrap/cache - If still failing, try
775instead of755 - If your host shows "owner mismatch" errors, contact support — they may need to fix the file ownership
Proposal Upload Fails
"File too large" or upload silently fails
- cPanel → Select PHP Version → Options tab
- Increase these values:
upload_max_filesize=50Mpost_max_size=50Mmemory_limit=256Mmax_execution_time=300
- Save
- In ProposalTrack admin → Settings → Uploads, set max file size to match (in MB).
"File type not allowed"
Admin → Settings → Uploads → add the extension to the allowed types list (comma-separated, no dots: pdf,doc,docx,xlsx).
Blank White Page
Almost always a PHP error with output suppressed.
- Set
APP_DEBUG=truein.env - Reload — you should see the actual error
- If still blank: check
storage/logs/laravel.log - If the log is empty: cPanel → Errors (under Metrics) — look at the latest entries
- Common causes: missing PHP extension (install via PHP Selector), low memory limit (raise to 256M), syntax error in
.env
404 Not Found on Every Page Except Homepage
Apache's mod_rewrite isn't active or the .htaccess file is missing.
Check 1 — .htaccess exists
In File Manager, enable Show Hidden Files. You should see .htaccess in your domain root and inside public/. If missing, re-extract from the ZIP.
Check 2 — mod_rewrite enabled
Almost all cPanel hosts have it on by default. If you suspect otherwise, contact your host's support and ask them to enable mod_rewrite for your account.
Check 3 — AllowOverride
If .htaccess directives are ignored, your host has AllowOverride None set. Ask support to change it to AllowOverride All.
"This PHP version is not supported"
You're running PHP < 8.2.
- cPanel → Select PHP Version
- Switch to PHP 8.2 or 8.3
- Click Set as current
- Reload the page
Still Stuck?
Open a support ticket on the Codester product page with:
- Your Codester purchase ID
- Your hosting provider name
- PHP version (from cPanel → Select PHP Version)
- The exact error message you're seeing
- The last 50 lines of
storage/logs/laravel.log - A screenshot of the error if visible in the browser
We'll get back to you within 24 hours.