Test Your Setup
After you complete the setup in Get Started, test your integration thoroughly before you process production transactions.
Confirm You Are in a Test Environment
Log in to the with your test credentials, and confirm that your integration points at the test Sessions API endpoint () and the test SDK asset URL, not the production versions.
Test with Test Card Numbers
Use test card numbers to simulate different payment scenarios, including successful transactions, declined transactions, and different card brands. See Test Cards for the full list of test card numbers and their expected results.
Run through these scenarios at minimum:
- A successful authorization or sale
- A declined transaction
- 3-D Secure step-up authentication, if your session enables Payer Authentication
- Each card brand and digital wallet you configured in the
Verify the Capture Context Response
Confirm that the response from the Sessions API contains the fields your integration depends on:
targetOriginsmatches the origin that hosts the SDK.- The order amount and currency in
data.orderInformation.amountDetailsmatch what you sent in the request. - The response resolves successfully in
VAS.UnifiedCheckout(sessionJWT)without throwing aUnifiedCheckoutError.
Test Error Handling
Simulate error scenarios and confirm your integration handles each one gracefully:
- Expired session: wait past the session expiration, or reuse an old capture context, and confirm that
VAS.UnifiedCheckout()rejects with aCAPTURE_CONTEXT_EXPIREDerror. - Invalid session: pass a malformed or tampered JWT and confirm that initialization rejects with
CAPTURE_CONTEXT_INVALID. - Declined payment: use a test card that returns a decline, and confirm that your
checkout.on('error')orclient.on('error')handler receives the event and that your UI communicates the decline to the customer.
See Error Handling for the full list of client-side error codes.
Test Webhook Notifications
If you configured webhook notifications for Unified Checkout transaction events, confirm that your system receives and processes them correctly for each event type you subscribed to. See Webhooks for the event payload reference and subscription setup.
Confirm Cleanup
Confirm that your integration calls checkout.destroy() and client.destroy() after the payment flow completes, including on error paths and when the customer navigates away without completing the payment. If your integration does not call destroy(), the SDK iframes remain in the page.
try { const result = await checkout.mount('#payment-buttons'); sendToServer(result);} catch (error) { handleError(error.reason, error.message);} finally { checkout.destroy(); client.destroy();}After you complete these tests, retest in the production environment with a small transaction before you move fully to production.
Next Steps
- Troubleshooting: resolve common session, mount, and origin errors.
- Reason Codes: server-side HTTP status codes and reason values.
Thanks for your feedback!
Last published: September 29, 2026