Thank you for purchasing Unreadbox. This guide takes you from a blank server to your first WhatsApp message.
Time needed: ~20 minutes on a clean VPS.
| Component | Minimum |
|---|---|
| PHP | 8.2 (extensions: bcmath, ctype, curl, dom, fileinfo, json, mbstring, openssl, pdo_mysql, tokenizer, xml, sodium) |
| Database | MySQL 8+ (production) or SQLite (local testing) |
| Web server | Nginx or Apache with HTTPS |
| Composer | 2.x |
| Node.js | 18+ (only for building assets) |
An HTTPS certificate is required — Meta rejects plain-HTTP webhook URLs.
# 1. Upload the source to your web root, e.g. /var/www/Unreadbox
cd /var/www/Unreadbox
# 2. Install PHP dependencies
composer install --no-dev --optimize-autoloader
# 3. Build frontend assets
npm install && npm run build
# 4. Configure environment
cp .env.example .env
php artisan key:generate
Edit .env:
APP_URL=https://yourdomain.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=Unreadbox
DB_USERNAME=...
DB_PASSWORD=...
# Meta Cloud API driver: "graph" for production, "mock" for testing/demo
META_DRIVER=graph
META_GRAPH_VERSION=v21.0
# 32+ random chars, used to encrypt WhatsApp credentials (AES-256-GCM)
CREDENTIAL_ENCRYPTION_KEY=<generate with: php -r "echo bin2hex(random_bytes(32));">
# 5. Migrate + seed (seeder creates a demo tenant; remove --seed for production)
php artisan migrate --seed
# 6. Permissions & cache
chown -R www-data:www-data storage bootstrap/cache
php artisan config:cache && php artisan route:cache
# 7. Queue worker (required for webhook processing and message sending)
php artisan queue:work # run under supervisor in production
root /var/www/Unreadbox/public;
index index.php;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ { fastcgi_pass unix:/run/php/php8.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $realpath_root/index.php; }
Seeded demo login: demo@wa-crm.test / password.
To create a real user manually:
php artisan tinker
>>> $tenant = \App\Models\Tenant::create(['name' => 'My Company', 'slug' => 'my-company']);
>>> $tenant->users()->create(['name' => 'Admin', 'email' => 'you@example.com', 'password' => bcrypt('secret')]);
Your tenant-specific webhook URL is shown on the same settings page:
https://yourdomain.com/webhook/wa/{tenant-uuid}
verify_token (also shown there) into Meta's WhatsApp → Configuration page.hub.challenge automatically.messages field.Open System Check in the sidebar. It verifies:
Fix anything red, then send a WhatsApp message from your phone to the connected number. It should appear in Inbox within seconds.
Set META_DRIVER=mock to run the complete send/receive flow against an in-app simulator — useful for development, demos, and CI.
| Symptom | Likely cause / fix |
|---|---|
| Webhook handshake fails | URL not HTTPS, or wrong verify_token; check Meta's Configuration page |
| Messages not arriving | Queue worker not running; php artisan queue:work under supervisor |
| "Credentials could not be decrypted" | CREDENTIAL_ENCRYPTION_KEY changed after saving credentials — restore the original key |
| 401 on webhook POST | Signature mismatch: confirm the App Secret is set correctly in .env |
| Send fails with window error | The 24h window has expired; customer must message you first |
Post in the item comments on CodeCanyon, or use the contact form on our author profile. Please include your System Check output (it contains no credentials).