Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp

Set up future PayTo payments

Learn how to set up future PayTo payments.

PayTo allows customers in Australia to authenticate PayTo mandates for one-off and recurring payments in their banking apps. Customers pay with PayTo by receiving notification of a pending mandate request, authorizing the terms of the mandate, then returning to your app.

Setting up a PayTo mandate for future payments allows you to get customer authorization now for collecting future payments. Customers can view, manage, pause, and cancel their PayTo mandates in their banking apps.

Caution

Stripe doesn’t support modification or pausing of PayTo mandates by customers. If a customer attempts to pause or modify a mandate, we cancel the mandate and send you a mandate.updated webhook. After receiving the webhook, you can reach out to your customer to find out why they adjusted their mandate, as well as set up a new mandate.

Set up a payment

Note

This guide builds on the foundational Set up future payments Checkout integration.

To enable Payto as a payment method, create a new Checkout Session:

  1. Set the mode to setup.
  2. Specify the terms of the mandate you want your customer to agree to using payment method options.
  3. Add payto to the list of payment_method_types.
Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d customer=
"{{CUSTOMER_ID}}"
\ -d mode=setup \ -d "payment_method_options[payto][mandate_options][amount_type]"=maximum \ -d "payment_method_options[payto][mandate_options][payment_schedule]"=annual \ -d "payment_method_options[payto][mandate_options][amount]"=150000 \ -d "payment_method_options[payto][mandate_options][payments_per_period]"=13 \ -d "payment_method_options[payto][mandate_options][start_date]"=2026-12-25 \ -d "payment_method_options[payto][mandate_options][end_date]"=2036-12-25 \ -d "payment_method_options[payto][mandate_options][purpose]"=mortgage \ -d "payment_method_types[]"=card \ -d "payment_method_types[]"=payto \ --data-urlencode success_url="https://example.com/success"

Stripe supports various types of mandates, with controls for the amount, duration, cadence, and purpose of the mandate. Specify mandate terms that match your requirements as closely as possible—customers see these precise terms at authorization time, so accuracy can improve your conversion rate.

Stripe infers the default purpose based on your merchant category code (MCC). Override this field using any of the valid values if the default value doesn’t accurately represent the purpose of the mandate. You can inspect the default value on the Mandate object when you don’t specify the purpose.

Charge the PayTo PaymentMethod later

Before you can charge your customer, find the mandate ID, customer ID, and payment method ID by retrieving the SetupIntent using its ID from the Checkout Session.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/setup_intents/
{{SETUP_INTENT_ID}}
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"

View the necessary IDs in the response below.

{ // ... "customer": "cus_PW6rQWRGAaBD7z", // <---- Here is the customer "mandate": "mandate_1Ok6ZrA8DuEjWaGw2nrO9xeS", // <---- Here is the mandate "metadata": {}, "next_action": null, "on_behalf_of": null, "payment_method": "pm_1Ok4l9A8DuEjWaGwhB4SGrWh", // <---- Here is the payment method "payment_method_configuration_details": null, "payment_method_options": { "payto": { "mandate_options": { "amount": 150000, "amount_type": "maximum", "start_date": "2026-12-25", "end_date": "2036-12-25", "payment_schedule": "annual", "payments_per_period": 13, "purpose": "mortgage", } } }, "payment_method_types": [ "payto" ], "single_use_mandate": null, "status": "succeeded", "usage": "off_session" // ... }

Create a PaymentIntent with the PaymentMethod, Mandate, and Customer IDs.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "payment_method_types[]"=payto \ -d amount=1099 \ -d currency=aud \ -d customer=
"{{CUSTOMER_ID}}"
\ -d payment_method=
"{{PAYMENT_METHOD_ID}}"
\ -d mandate=
"{{MANDATE_ID}}"
\ -d confirm=true

Fulfill your orders

After accepting a payment, learn how to fulfill orders.

Test your integration

Test your PayTo integration with your test API keys by using the various test PayIDs and bank account details below. Each set of details results in a different scenario your integration might commonly face in live mode.

PayIDDescription
{any_prefix}+succeed@{any_domain}The PaymentIntent status transitions from requires_action to processing after 10 seconds, then transitions to succeeded after an additional 5 seconds. The mandate enters an active state.
{any_prefix}+decline@{any_domain}The PaymentIntent status transitions from requires_action to requires_payment_method after 10 seconds. Stripe returns the payment_method_provider_decline error code and an invalid_authorization decline code. The mandate enters an inactive state.
{any_prefix}+expire@{any_domain}The PaymentIntent status transitions from requires_action to requires_payment_method after 10 seconds. Stripe returns the payment_method_provider_decline error code and a generic_decline decline code. The mandate enters an inactive state.
{any_prefix}+insufficient_funds@{any_domain}The PaymentIntent status transitions from requires_action to processing after 10 seconds, then transitions to requires_payment_method after an additional 5 seconds. Stripe returns the payment_method_provider_decline error code and an insufficient_funds decline code. The mandate enters an inactive state.
{any_prefix}+revoke@{any_domain}The PaymentIntent status transitions from requires_action to processing after 10 seconds then to succeeded after a further 5 seconds. The mandate begins in an active state and transitions to inactive after 1 minute.
{any_prefix}+agreement_type_not_supported@{any_domain}The PaymentIntent status transitions from requires_action to requires_payment_method after 10 seconds. Stripe returns the payment_method_provider_decline error code. The mandate enters an inactive state.
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc