Common Issues
Payment intent stuck in requires_payment_method
The card was not tokenized, or confirm was never called.
Check:
- The widget’s
onTokenizecallback fired and thepm_xxxwas sent to your server - The confirm endpoint was called with the
payment_methodfield set - No errors were returned from the confirm call
Webhook not received
- Check the endpoint URL — verify the URL in Settings → Webhooks is correct and reachable from the internet (not
localhost) - Check account status — a suspended or deactivated account stops webhook delivery
- Check
livemode— sandbox events only go to sandbox-mode endpoints; live events go to live-mode endpoints - Check the delivery log — the webhook log in the dashboard shows all delivery attempts and HTTP response codes
refund_amount_exceeds_available error
The sum of all refund amounts for this payment intent would exceed the original payment amount. Check existing refunds before issuing another:
curl https://staging-api.elasticpay.co/api/v1/payment_intents/pi_0abc123/refunds \ -H "Authorization: Bearer sk_sandbox_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Sum the amount fields of all succeeded refunds. The remaining refundable amount is original_amount - total_refunded.
Customer on hold unexpectedly
Consecutive payment failures triggered the account’s hold threshold. To investigate:
- Open the customer detail page and check the Activity Log for recent status changes
- Review the most recent failed payment intents for failure codes
- Use Open Recovery Setup Intent to send the customer a link to update their payment method
API key rejected (401)
Causes:
- Key has been revoked — check Settings → API Keys for revocation date
- Key has expired — check the
expires_atfield - Mode mismatch — sandbox key used against a live endpoint, or vice versa
- Key copied with leading/trailing whitespace — verify the key value exactly
Plan not scheduling
- Plan is in
draftstate — click Activate to begin scheduling - Customer is not
active— a customer onholdorcancelleddoes not receive new scheduled payments - Plan is
inactiveorclosed— reactivate or create a new plan - Start date is in the future — the scheduler creates intents up to 366 days ahead from today