Installation issues
Installer won’t open or shows blank page
Cause: PHP 8.3 is not active or required extensions are missing. Fix:- Verify PHP version:
php -v(must be 8.3+) - Check extensions:
php -m | grep -E 'pdo_mysql|openssl|bcmath|mbstring|curl|zip' - On shared hosting, go to Software > Select PHP Version and set PHP 8.3
Database connection failed
Cause: Incorrect credentials or MySQL is not running. Fix:storage/ directory not writable
Cause: Incorrect file permissions. Fix:“Already Installed” message
Cause: The installer created a lock file after first installation. This is normal. Fix: If you need to reinstall, deletestorage/.installed and clear the database.
Login issues
”Invalid credentials” error
Cause: Wrong email/password, or account is suspended. Fix:- Check account status in database:
SELECT status FROM op_merchant_users WHERE email = '[email protected]' - If suspended, reactivate in People > Staff
- Reset password via admin panel or database
”Account temporarily locked”
Cause: Too many failed login attempts (default: 5 attempts, 5-minute lockout). Fix:- Wait 5 minutes for lockout to expire
- Or admin can clear lockout:
DELETE FROM op_login_attempts WHERE email = '[email protected]' AND success = 0
Two-factor authentication not working
Cause: Time sync issue between server and authenticator app. Fix:- Check server time:
date -u - Sync NTP:
sudo timedatectl set-ntp true - If locked out, admin can disable 2FA:
Payment issues
Transaction stuck in “pending”
Cause: SMS not received, webhook not delivered, or cron not running. Fix:- Check if cron is running:
ls -la storage/cron/ - Check SMS records:
SELECT * FROM op_sms_parsed WHERE match_status = 'pending' - Manually trigger cron:
php public/index.php cron/run
Payment shows “failed” but customer was charged
Cause: Gateway processed the payment but OwnPay didn’t receive the callback. Fix:- Check gateway dashboard for the transaction
- If confirmed paid, update manually:
- Run reconciliation:
php public/index.php admin/reconcile --trx=YOUR_TRX_ID
Gateway not appearing on checkout
Cause: Gateway not enabled or not configured for the brand. Fix:- Check plugin status:
SELECT status, is_active FROM op_plugins WHERE slug = 'gateway-slug' - Check gateway config:
SELECT enabled FROM op_gateway_configs WHERE merchant_id = YOUR_ID AND gateway_slug = 'gateway-slug' - Enable in Gateways > Payment Gateways
Webhook issues
Webhooks not being delivered
Cause: URL is private/loopback, endpoint unreachable, or SSRF blocked. Fix:- Verify URL is public HTTPS:
curl -v https://your-endpoint.com/webhooks/ownpay - Check delivery logs:
SELECT * FROM op_webhook_events WHERE status = 'failed' - Use ngrok for local testing:
ngrok http 8080
Webhook signature verification failing
Cause: Using wrong secret, wrong hash algorithm, or re-encoding the body. Fix:- Use the raw request body, never re-encode JSON
- Verify using HMAC-SHA256:
hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret) - Compare with
hash_equals()for timing-safe comparison
Performance issues
Admin panel is slow
Cause: File cache, disabled OPcache, or slow database queries. Fix:- Enable Redis:
CACHE_DRIVER=redisin.env - Enable OPcache:
opcache.enable=1inphp.ini - Check slow queries:
tail -20 /var/lib/mysql/slow-queries.log
High memory usage
Cause: Too many PHP-FPM workers or memory leak. Fix:- Reduce
pm.max_childrenin PHP-FPM config - Check for memory leaks:
valgrind --leak-check=full php public/index.php ... - Restart PHP-FPM:
systemctl restart php8.3-fpm
Getting help
If your issue isn’t covered here:- Check the FAQ for common questions
- Search GitHub Issues for known problems
- Join the Discord community for real-time help
- Open a GitHub Issue with:
- OwnPay version (
php public/index.php --version) - PHP version (
php -v) - Error message and stack trace
- Steps to reproduce
- OwnPay version (