Payments Troubleshooting
Payment platform events store a compact metadata payload with a docsUrl link to this page. Use the error code from Admin → Events to jump to the matching section below.
For event taxonomy, filtering, and provider-specific playbooks, see Platform Events. To verify a connection's credentials directly (without going through checkout), see Connection Status Checks.
Error codes
PAYMENTS_NOT_CONFIGURED
Payments are disabled or no provider integration is selected.
- Open Admin → Pricing Plans → Configuration.
- Enable payments and select a payment provider integration source.
- Save and retry checkout.
ACTIVE_SUBSCRIPTION_EXISTS
The billable entity already has an active or trialing subscription.
- Cancel the existing subscription with
sdk.payments.cancelSubscription(existingSubscriptionId), or - Pass
reset: trueon checkout to cancel automatically and start a new subscription.
DYNAMIC_AMOUNT_NOT_SET
A dynamic-priced plan requires an admin-set amount before checkout.
- Open the pending subscription in Admin → Pricing Plans → Subscriptions.
- Set
dynamicAmounton the subscription. - Retry checkout with
subscriptionId.
DYNAMIC_PLAN_REQUIRES_SUBSCRIPTION
Dynamic plans cannot be checked out with planId alone.
- Create a pending subscription first (
sdk.payments.subscribeToPlanor admin flow). - Set
dynamicAmount(admin). - Call checkout with
subscriptionId. Dynamic plans require Sumit.
DYNAMIC_PLAN_UNSUPPORTED_PROVIDER
The configured payment provider does not support dynamic plans.
- Switch the tenant payment provider to Sumit in Admin → Pricing Plans → Configuration, or
- Use a static-priced plan with Paddle, PayPal, or DodoPayments.
MISSING_REDIRECT_URLS
Checkout redirect URLs are missing.
- Add
successUrlandcancelUrlin Admin → Pricing Plans → Configuration, or - Pass them in the checkout request body.
INVALID_CHECKOUT_AMOUNT
The checkout amount is zero or invalid.
- Dynamic plans: an admin must set
dynamicAmounton the pending subscription before checkout. - Static plans: ensure the plan has a non-zero monthly or yearly price.
INVALID_SUMIT_COMPANY_ID
MISSING_SUMIT_CREDENTIALS
Sumit Company ID or API key is missing or invalid.
- Open Admin → Integrations → Sumit.
- Enter the numeric Company ID from Sumit developer keys.
- Save a freshly generated API key.
- Confirm hosted checkout / redirect is enabled in the Sumit merchant account and the key has billing permissions.
See also Sumit integration and Platform Events — Sumit.
UNSUPPORTED_SUMIT_CURRENCY
The plan currency is not supported by Sumit.
- Change the plan currency to ILS, USD, or EUR.
- Retry checkout.
INTEGRATION_SOURCE_NOT_FOUND
The configured paymentSourceId no longer exists.
- Open Admin → Pricing Plans → Configuration.
- Re-select the payment provider integration source and save.
MISSING_EXTERNAL_PRICE_ID
The plan is missing provider catalog price IDs.
| Provider | Required plan fields |
|---|---|
| Paddle | externalIds.paddle.monthlyPriceId / yearlyPriceId |
| PayPal | externalIds.paypal.productId |
| DodoPayments | externalIds.dodopayments.monthlyPriceId / yearlyPriceId |
Update the plan in Admin → Pricing Plans → Plans and retry checkout.
PLAN_NOT_ACTIVE
The plan is inactive or unavailable.
- Open Admin → Pricing Plans → Plans.
- Activate the plan (
isActive: true) and retry checkout.
SUBSCRIPTION_NOT_PENDING
Checkout was called for a subscription that is not in pending status.
- Use a subscription in
pendingstatus, or - Create a new pending subscription before checkout.
INVALID_SIGNATURE
A payment webhook signature could not be verified.
- Confirm the webhook secret in Admin → Integrations → {provider} matches the provider dashboard.
- For Paddle, verify the
paddle-signatureheader is forwarded unchanged through any proxy. - Retry delivery from the provider webhook console after updating credentials.
WEBHOOK_SECRET_NOT_CONFIGURED
No webhook secret is stored for this tenant and provider.
- Copy the webhook signing secret from the provider dashboard.
- Save it on the integration source in Admin → Integrations.
TENANT_NOT_FOUND
A webhook could not be mapped to a Qelos tenant.
- Ensure checkout created the subscription with provider
custom_data/ metadata that includes the tenant ID. - For PayPal and Paddle, verify
custom_data.tenantis present on the provider subscription. - Re-process or replay the webhook after fixing subscription linkage.
Provider playbooks
For step-by-step diagnosis by event name (checkout-failed, provider-call-failed, payment-failed, etc.), use the provider sections in Platform Events:
