This guide walks you through installing XSender on a cPanel shared host, end to end, with no terminal access required. Most customers buying XSender on CodeCanyon land here, so we have kept every step explicit and called out the parts that most often cause "doesn't load" or "white page" support tickets.
Prefer a VPS? Performance is materially better on a VPS. See Getting Started → Installation for the VPS path (SSH + composer optional). This article is for customers stuck on shared hosting.
bcmath, ctype, curl, fileinfo, gd (or imagick), intl, json, mbstring, openssl, pdo, pdo_mysql, tokenizer, xml, zip.xsender-installer-vX.Y.zip downloaded from your CodeCanyon → Downloads page (use "All files & documentation", not "Installable Laravel only").app.yourcompany.com).upload_max_filesize ≥ 64M, post_max_size ≥ 64M, memory_limit ≥ 256M, max_execution_time ≥ 300.youracct_xsender) — note the full name including the youracct_ prefix cPanel adds.youracct_xs) with a strong password.public_html contains a default cPanel landing page, delete cgi-bin's siblings (index.html, default .htaccess) — do not delete cgi-bin itself.xsender-installer-vX.Y.zip.public_html should contain:
public_html/
├── assets/
├── src/
├── xsender-whatsapp-service/ ← optional, only if you will run WhatsApp Node
├── .htaccess
├── config.json
└── index.php
Do NOT set your domain's document root to
public_html/src/public/. XSender ships a pre-builtindex.phpat the project root that handles the Laravel structure for you. Setting the doc root insidesrc/publicwill break asset URLs and the installer.
cPanel File Manager → select these folders → Permissions → 755:
src/storage and everything insidesrc/bootstrap/cacheassets/If files are owned by the wrong user (rare on cPanel), open Terminal (if enabled) and run chown -R $(whoami):$(whoami) public_html. Otherwise open a support ticket with your host.
https://yourdomain/ (or https://app.yourcompany.com/).localhost on cPanel. Click Test Connection — if it fails, double-check the youracct_ prefix on both fields..env. When done, sign in at https://yourdomain/admin/login.Without a cron, scheduled campaigns and automation workflows will not fire. cPanel → Advanced → Cron Jobs:
cd /home/youracct/public_html && /usr/local/bin/php src/artisan schedule:run >> /dev/null 2>&1
Replace youracct with your cPanel username and /usr/local/bin/php with the path printed by cPanel's "PHP version" page (sometimes /opt/cpanel/ea-php82/root/usr/bin/php).cd /home/youracct/public_html && /usr/local/bin/php src/artisan queue:work --stop-when-empty >> src/storage/logs/queue.log 2>&1
/admin/login and confirm everything loads under https://.When a new version ships:
Admin Panel → System Update, click Check for Update. If your installation can write to its own folder, XSender will pull, extract, and run migrations automatically.exec), download the update ZIP from CodeCanyon and re-upload via File Manager, extracting over the existing files. The config.json migration list in the new ZIP will be picked up on the next request.https://yourdomain/repair.php?token=xsender-repair — this ships with every release, clears the bootstrap cache + OPcache, then self-deletes.| Symptom | Cause | Fix |
|---|---|---|
| Blank page / 500 at the installer | PHP extension missing, or wrong PHP version | cPanel → Select PHP Version → enable extensions; raise memory_limit. |
| "This site can't be reached" | Domain doc-root set inside src/public | Reset doc-root back to public_html/ (or your addon-domain root). |
| 404 on every page after install | Missing .htaccess or AllowOverride disabled | Re-upload the bundled .htaccess. If still 404, raise a ticket with your host to allow .htaccess overrides. |
| "SQLSTATE[HY000] [2002] Connection refused" | Wrong DB host | Use localhost, not 127.0.0.1, on shared cPanel. |
| "Permission denied" writing to storage | Wrong folder permissions | Step 4 — chmod 755 on src/storage and src/bootstrap/cache. |
| Campaigns scheduled but never sending | Cron not running | Step 6 — confirm the per-minute cron exists; check src/storage/logs/laravel.log. |
| "Class Barryvdh\Debugbar\ServiceProvider not found" | Stale bootstrap/cache after an update | Visit /repair.php?token=xsender-repair to clear it. |
| "Object of class App\Enums could not be converted to string" | OPcache holding stale bytecode | /repair.php?token=xsender-repair calls opcache_reset(). |
queue:work --stop-when-empty in Step 6 sidesteps this but processes fewer messages per minute than a Supervisor-managed worker on a VPS.(For documentation maintainer.) Upload screenshots for these steps and replace the <img> tags:
public_html contents after extract