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 is reachable — it must be publicly resolvable over HTTPS (not
localhost) and return a 2xx quickly. Endpoints are configured by ElasticPay, so if you are unsure which URL is registered, ask support to confirm it - 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 status — open the payment intent, payment plan, or customer the event relates to and look at the Events panel. Each row shows the event type and the latest delivery status with an attempt count.
No deliveriesmeans no subscription matched the event
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
A customer is on hold either because they were created with a payment method still to be collected (waiting for payment method), or because consecutive payment failures triggered recovery. Collecting a valid payment method clears the hold automatically — you no longer need to flip the status manually. To investigate:
- Open the customer detail page and check the Activity Log for recent status changes
- If they’re awaiting a method, use Collect Payment Details (or resend the email link) to capture one
- For a recovery hold, review the most recent failed payment intents for failure codes and 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 Developer → 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. If the plan was created through the deferred payment-method flow, it activates automatically once the method is collected; a plan still indraftusually means the setup hasn’t succeeded yet - 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