RyzeDeskRyzeDesk

Stripe

4105 articles

Migrate to Confirmation Tokens


Migrate to Confirmation Tokens

Finalise payments on the server by using a ConfirmationToken instead of a PaymentMethod.

Use this guide to learn how to finalise payments on the server by using a ConfirmationToken instead of a PaymentMethod to send data collected from your client to your server.

A ConfirmationToken holds a superset of the data found on a PaymentMethod, such as shipping information, and enables new features as we build them.

Create the Confirmation Token client-side

Instead of calling stripe.createPaymentMethod, call stripe.createConfirmationToken to create a ConfirmationToken object. Pass this ConfirmationToken to the server to confirm the PaymentIntent.

The stripe.createConfirmationToken method accepts the same parameters as stripe.createPaymentMethod (through params.payment_method_data), plus additional shipping and return_url parameters.

Before

After

checkout.js

// Create the PaymentMethod using the details collected by the Payment Element.
const {error, paymentMethod} = await stripe.createPaymentMethod({
 elements,
 params: {
 billing_details: {
 name: 'Jenny Rosen',
 }
 }
});


if (error) {
 // This point is only reached if there's an immediate error when creating the PaymentMethod.
 // Show the error to your customer (for example, payment details incomplete)
 handleError(error);
 return;
}

// Create and confirm the PaymentIntent
const res = await fetch("/create-confirm-intent", {
 method: "POST",
 headers: {"Content-Type": "application/json"},
 body: JSON.stringify({
 paymentMethodId: paymentMethod.id,
 }),
});

checkout.js

Create and submit the payment to Stripe server-side

You pass the ConfirmationToken to the server to confirm the PaymentIntent, rather than passing a PaymentMethod as you did before. The properties stored on the ConfirmationToken are applied to the Intent when its ID is provided to the confirmation_token parameter at confirmation time.

Note

If you already provide shipping and return_url on the ConfirmationToken, you don’t need to provide those fields again when confirming the PaymentIntent.

Before

After

server.js

server.js

app.post('/create-confirm-intent', async (req, res) => {
 try {
 const intent = await stripe.paymentIntents.create({
 confirm: true,
 amount: 1099,
 currency: 'usd',
 // In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default.
 automatic_payment_methods: {enabled: true},
 use_stripe_sdk: true,
 // the ConfirmationToken ID sent by your client that already has the shipping, mandate_data, and return_url data
 confirmation_token: req.body.confirmationTokenId,
 });
 res.json({
 client_secret: intent.client_secret,
 status: intent.status
 });
 } catch (err) {
 res.json({
 error: err
 })
 }
});

Any parameters provided directly to the PaymentIntent or SetupIntent at confirmation time, such as shipping override corresponding properties on the ConfirmationToken.

Optional Setting conditional parameters setup_future_usage or capture_method based on payment method

See also

  • Design an integration
Last verified 2026-09-27

Is this helpful?