This guide covers the issues OwnPay administrators and integrators encounter most often in production. Each entry follows a consistent structure: symptom → root cause → diagnosis → resolution. CheckDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/own-pay/OwnPay-Documentation/llms.txt
Use this file to discover all available pages before exploring further.
storage/logs/php-errors.log and the slow-query log at /var/lib/mysql/slow-queries.log before opening a support ticket — the answer is usually in the logs.
Need the full diagnostic reference with SQL queries for every scenario? The detailed troubleshooting source covers installation errors, authentication failures, ledger mismatches, webhook forensics, and admin panel performance.
Authentication Issues
'Invalid API Key' or 401 Unauthorized
'Invalid API Key' or 401 Unauthorized
Login Shows 'Account Temporarily Locked'
Login Shows 'Account Temporarily Locked'
Symptom: Login returns “Account temporarily locked due to repeated failed attempts.”Root Cause: OwnPay’s
Authenticator checks op_login_attempts on every request. After MAX_LOGIN_ATTEMPTS failures (default: 5) within LOCKOUT_DURATION seconds (default: 300), the account is locked.Resolution:- Wait — the lockout clears automatically after 5 minutes (default).
-
Admin CLI unlock — a super-admin can clear the lockout records from the database:
-
To harden against brute-force, increase the defaults in
.env:
Payment and Transaction Issues
Payment Stuck in 'pending' State
Payment Stuck in 'pending' State
Symptom: A transaction has Diagnosis — check lock files:Resolution:
status = 'pending' far longer than the configured checkout timer (default: 10 minutes).Root Cause: One of three causes:- The gateway webhook/callback was never delivered to OwnPay.
- The mobile SMS from the companion device was not received or matched.
- The
SmsVerificationJobcron is not running.
-
Add the cron entry if it’s missing:
- For SMS-based payments, check that the regex template matches the provider’s SMS format in Admin → Mobile & SMS → SMS Templates.
- For gateway-webhook-based payments, see the Webhook Not Received entry below.
- If you’ve confirmed payment with the gateway dashboard, a super-admin can manually override the transaction status from Admin → Transactions → [Transaction] → Edit.
Webhook Not Received by My Application
Webhook Not Received by My Application
Symptom: OwnPay shows webhook events are being sent, but your application never receives them.Root Causes:Check delivery logs in Admin → Developer Hub → Webhooks → Delivery Log for the specific HTTP status code and error message returned by your endpoint.Resolution:
- A firewall or security group is blocking inbound HTTP(S) on your application server
- The webhook URL is a private or loopback IP (OwnPay blocks these as an SSRF protection)
- Your application’s endpoint returns a non-2xx status code
- The webhook secret is wrong, causing your application to reject the delivery
- Ensure your endpoint is publicly reachable over HTTPS from the internet.
- Verify port 443 is open in your cloud security group / firewall rules.
- Confirm your endpoint returns HTTP 200 within 5 seconds.
- Check your webhook signature verification code — use the raw request body, not a decoded-and-re-encoded version.
- Private/loopback URLs (
127.x.x.x,10.x.x.x,192.168.x.x) are blocked by OwnPay’s SSRF protection and will never be delivered to. Use a tunnel like ngrok for local development.
Gateway Not Showing in Checkout
Gateway Not Showing in Checkout
Symptom: A configured payment gateway is absent from the checkout page for a brand.Root Causes:
- The gateway plugin is not active
- The gateway is not enabled for the specific brand
- The payment currency is not supported by the gateway
- A custom domain is misconfigured
- Admin → Gateways → Payment Gateways — is the gateway toggled active?
- Is the gateway enabled specifically for this brand? Per-brand gateway activation is separate from global installation.
- Does the gateway’s
supportedCurrencies()list include the intent’s currency? Return[]in the adapter for “any currency”. - Verify the domain type in System → Domains is set to
checkout(notapi).
DomainMiddleware returns 503 for checkout routes. Go to System → Domains and click Verify DNS to trigger a re-check.API and Integration Issues
CORS Errors When Calling the API
CORS Errors When Calling the API
Symptom: Browser console shows a CORS policy error when calling
/api/v1/*.Root Cause: This is by design. OwnPay’s Merchant API is a server-side API — it is not intended to be called directly from a browser because doing so would expose your write-scoped API key to end users.Resolution:- API calls must originate from your backend server, never from JavaScript running in a browser.
- Your backend creates the payment intent, receives the
checkout_url, and redirects the user’s browser to that URL. - If you need a real-time status indicator on the frontend, use the public
GET /checkout/{token}/statusAJAX endpoint — it requires only the checkout token, not an API key.
Mobile and SMS Issues
SMS Not Matching to a Pending Transaction
SMS Not Matching to a Pending Transaction
Symptom: A payment SMS was received by the companion device, but
op_sms_parsed.match_status stays pending and the transaction is not confirmed.Root Causes:- The SMS regex template doesn’t match the provider’s message format
- Two pending transactions have the same amount, making the match ambiguous (OwnPay refuses ambiguous matches)
- The companion device’s pairing status is
offlineorrevoked - The cron job is not running
- Open Admin → Mobile & SMS → SMS Templates and verify the regex pattern matches the exact SMS format your provider sends. Use the built-in Regex Tester to test against a sample message.
- If there are two pending transactions of the same amount, manually verify one of them with the gateway dashboard before completing it.
- Confirm the companion device heartbeat is active in Admin → Mobile & SMS → Devices.
- Ensure
* * * * * php /var/www/ownpay/public/index.php cron/runis in the crontab.
Infrastructure Issues
503 Degraded or Service Unavailable Status
503 Degraded or Service Unavailable Status
Cron and Background Processing
Cron Job Not Running or Payment Events Not Processing
Cron Job Not Running or Payment Events Not Processing
Symptom: Webhooks are not retried, expired intents are not cleaned up, exchange rates are stale, or SMS verification never fires.Root Cause: The OwnPay cron runner (Resolution:Add the cron entry if it’s missing:You can also manually trigger all pending cron jobs from the admin panel under Settings → Cron Jobs → Run Now, or via CLI:
php public/index.php cron/run) must be called every minute from the system cron. Without it, all nine scheduled jobs — including WebhookRetryJob, SmsVerificationJob, QueueWorkerJob, and CurrencyUpdateJob — never execute.Diagnosis: