Save directly without charging
Collect details of a present card and save them for online use.
Use SetupIntents to collect card or mobile wallet details without charging the card. A SetupIntent can’t save a card_ PaymentMethod directly, but in most cases you can create a reusable generated_ PaymentMethod that represents the same card. From your customer’s perspective, they’re the same payment method.
Warning
All charges made using the generated_ PaymentMethod are card-not-present (CNP) transactions, and features available to card-present transactions (such as liability shifts and pricing)don’t apply to these charges.
You can use SetupIntents to collect card details on Visa, Mastercard, American Express, Discover, and co-branded Interac, eftpos, and girocard cards. However, co-branded Interac cards must be inserted to a reader. This means that they are not supported by Tap to Pay.
SetupIntents don’t support single-branded Interac, eftpos, and girocard cards.
Saving cards with Stripe Terminal using SetupIntents requires you to:
- Create or retrieve a Customer object.
- Create a SetupIntent object to track the process.
- After you collect the customer’s consent, collect the payment method and submit the details to Stripe.
Note
We’ve changed the customer consent model of this feature to require the allow_ parameter instead of the legacy customer_ parameter. If your integration uses customer_, you must update your integration to use allow_. This update became mandatory on March 31, 2025 for non-React Native users, and is mandatory for React Native users on September 30, 2025. For guidance, see the changelog entry.
Note
In version 5. of the SDK, the collect and confirm integration steps are now combined into a single processSetupIntent step.
Create or retrieve a customer
To charge a card saved with Stripe, you must attach it to a Customer.
When you include a customer in your SetupIntent before confirming, Stripe automatically attaches the generated card payment method to the Customer object you provide.
Include the following code on your server to create a new Customer.
Create a SetupIntent
Note
Provide a Customer ID while creating a SetupIntent to attach the card payment method to the Customer upon successful setup. If you don’t provide a Customer ID, you must attach the payment method in a separate call.
A SetupIntent is an object that represents your intent to set up a customer’s payment method for future payments. The SetupIntent tracks the steps of this setup process. For Terminal, this includes collecting and recording cardholder consent.
You can create a SetupIntent providing the customer, onBehalfOf (Connect only), and usage parameters.
If the information required to start a payment isn’t readily available in your app, you can create the SetupIntent on your server. Use the client secret to call retrieveSetupIntent, and, then use the retrieved SetupIntent to call processSetupIntent.
Collect a payment method for saving
After you create a SetupIntent, you need to collect a payment method using the SDK and collect customer consent. Pass allowRedisplay as always or limited, indicating the degree to which a payment method can be shown in a customer checkout flow.
Note
Collect customer consent verbally or with a checkbox in your application. You must comply with all applicable laws, rules, and regulations in your region.
To process a setup intent, make sure that you’re connected to a reader. The connected reader waits for a card after your app calls processSetupIntent.
This method collects encrypted payment method data using the connected card reader, and associates the encrypted data with the SetupIntent.
Caution
Collecting a payment method happens locally and requires no authorization or updates to the SetupIntent object until the next step.
Cancel collection
Programmatic cancellation
You can cancel collecting a payment method by using the Cancelable object returned by the SDK.
Customer-initiated cancellation
CustomerCancellation is enabled by default, so smart reader users see a cancel button. Tapping the cancel button cancels the active transaction. Use setCustomerCancellation to toggle this behavior for a transaction.
Submit the payment method details to Stripe
Your previous call to processSetupIntent handles the confirm for you, so no further action is necessary.
A successful setup returns a succeeded value for the SetupIntent’s status property, along with a SetupAttempt.payment_method_details.card_present.generated_card, which is a reusable card payment method you can use for online payments.
Note
The SetupIntent.payment_method is a card_ PaymentMethod that represents the tokenization of the physically present card and isn’t chargeable online. Future payments use the generated card instead. From the customer’s perspective, they’re the same payment method.
The generated_ payment method automatically attaches to the customer you provided during SetupIntent creation. You can retrieve the generated_ payment method by expanding the SetupIntent’s latest_ property. Always check for a generated_ value, because for payment methods that don’t allow generated cards, the value is empty.
Alternatively, you can retrieve the attached payment method by fetching the list of payment methods that gets attached to the customer.
If you didn’t provide a customer during SetupIntent creation, you can attach the generated_ to a Customer object in a separate call.
If the setup isn’t successful, inspect the returned error to determine the cause. For example, failing to collect and notify Stripe of customer consent results in an error.
Mobile wallets considerations
Saved mobile wallets is only for off_session payments such as future subscription or other payments you initiate on behalf of your customer. When you save a digital wallet payment method, the generated_ has allow_, to indicate its specific usage considerations.
When you attempt to charge a mobile wallet, make sure to pass off_ during PaymentIntent confirmation. If the customer is present in your checkout flow, you will need to instead use the Apple Pay and Google Pay integrations to re-prompt for payment method presentment.
Compliance
You’re responsible for your compliance with all applicable laws, regulations, and network rules when saving a customer’s payment details. For example, the European Data Protection Board has issued guidance regarding saving payment details. These requirements generally apply if you want to save your customer’s payment method for future use. This applies in situations such as presenting a customer’s payment method to them in the checkout flow for a future purchase, or charging them when they’re not actively using your website or app, placing a MOTO order, or in your store.
Add terms to your checkout flow that state how you plan to save payment method details and allow customers to opt in. If you plan to charge the customer while they’re not actively checking out, make sure (at a minimum) that your terms also cover the following:
- The customer’s agreement to your initiating a payment or a series of payments on their behalf for specified transactions.
- The anticipated timing and frequency of payments (for instance, whether charges are for scheduled installment or subscription payments, or for unscheduled top-ups).
- How the payment amount is determined.
- Your cancellation policy, if you’re setting up the payment method for a subscription service.
Make sure you keep a record of your customer’s written agreement to these terms.
When you save a payment method, you can only use it for the specific purpose that you included in your terms. If you want to charge customers when they’re not actively checking out and also save the customer’s payment method to present to them as a saved payment method for future purchases, you must explicitly collect consent from the customer. One way to do so is with a “Save my payment method for future use” checkbox.