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
OverviewAccept a paymentUpgrade your integration
Online payments
OverviewFind your use case
Use Payment Links
Build a payments page
Build a custom integration with Elements
Build an in-app integration
Use Managed Payments
Recurring payments
In-person payments
Terminal overview
Availability
Readers
No code
Custom integration
Payment methods
Add payment methods
    Overview
    Payment method integration options
    Manage default payment methods in the Dashboard
    Payment method types
    Cards
    Pay with Stripe balance
    Stablecoin payments
    Bank debits
    Bank redirects
    Bank transfers
    Meal vouchers
    Credit transfers (Sources)
    Buy now, pay later
      Affirm
      Afterpay / Clearpay
        Accept a payment
        Site messaging
      Alma
      Billie
      Klarna
      Kriya
      Mondu
      Scalapay
      SeQura
      Sunbit
      Zip
    Real-time payments
    Vouchers
    Wallets
    Special regional requirements
    Custom payment methods
Manage payment methods
Faster checkout with Link
Payment operations
Analytics
Balances and settlement time
Compliance and security
Currencies
Declines
Disputes
Radar
Payouts
ReceiptsRefunds and cancellations
Advanced integrations
Custom payment flows
Flexible acquiring
Off-Session Payments
Multiprocessor orchestration
Beyond payments
Incorporate your company
Crypto
Agentic commerce
Financial Connections
Climate
Verify identities
United States
English (United States)
  1. Home/
  2. Payments/
  3. Add payment methods/
  4. Buy now, pay later/
  5. Afterpay / Clearpay

Accept an Afterpay or Clearpay payment

Learn how to accept Afterpay (also known as Clearpay in the UK), a payment method in the US, CA, UK, AU, and NZ.

Afterpay is a single use, immediate notification payment method that requires customers to authenticate their payment. Customers are redirected to the Afterpay site, where they agree to the terms of an installment plan. When the customer accepts the terms, Afterpay guarantees that the funds are available to the customer and transfers the funds to your Stripe account. The customer repays Afterpay directly over time.

Note

Before you start the integration, make sure your account is eligible for Afterpay by navigating to your Payment methods settings.

Determine compatibility

Customer Geography: Australia, Canada, New Zealand, UK, US

Supported currencies: aud, cad, nzd, gbp, usd

Presentment currencies: aud, cad, nzd, gbp, usd

Payment mode: Yes

Setup mode: No

Subscription mode: No

A Checkout Session must satisfy all of the following conditions to support Afterpay payments:

  • You can only use one-time line items (recurring subscription plans aren’t supported).
  • You must express Prices in your domestic currency.

Accept a payment

Note

This guide builds on the foundational accept a payment Checkout integration.

Enable Afterpay as a payment method

When creating a new Checkout Session, you need to:

  1. Enable Afterpay / Clearpay in your Dashboard. Stripe automatically displays Afterpay to eligible customers using dynamic payment methods. If you currently specify payment_method_types, see the migration guide.
  2. Make sure all your line_items use your domestic currency and the total amount doesn’t exceed Afterpay’s transaction amount limits.
  3. Optionally, specify which countries Checkout allows for shipping locations through shipping_address_collection[allowed_countries].
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 "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d "shipping_address_collection[allowed_countries][0]=AU" \ -d "shipping_address_collection[allowed_countries][1]=CA" \ -d "shipping_address_collection[allowed_countries][2]=GB" \ -d "shipping_address_collection[allowed_countries][3]=NZ" \ -d "shipping_address_collection[allowed_countries][4]=US" \ --data-urlencode "success_url=https://example.com/success"

If you don’t want to collect shipping addresses with Checkout, you can also provide the shipping address using payment_intent_data[shipping]. Doing so helps with loan acceptance rates.

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 "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d "payment_intent_data[shipping][name]=Jenny Rosen" \ -d "payment_intent_data[shipping][address][line1]=1234 Main Street" \ -d "payment_intent_data[shipping][address][city]=San Francisco" \ -d "payment_intent_data[shipping][address][state]=CA" \ -d "payment_intent_data[shipping][address][country]=US" \ -d "payment_intent_data[shipping][address][postal_code]=94111" \ --data-urlencode "success_url=https://example.com/success"

Fulfill your orders

Use a method such as webhooks to handle order fulfillment, instead of relying on your customer to return to the payment status page.

The following events are sent when the payment status changes:

Event NameDescriptionNext steps
checkout.session.completedThe customer successfully authorized the payment by submitting the Checkout form.Wait for the payment to succeed or fail.
payment_intent.succeededThe customer’s payment succeeded. The PaymentIntent transitions to succeeded.Fulfill the goods or services that the customer purchased.
payment_intent.payment_failedThe customer’s payment was declined, or failed for some other reason. The PaymentIntent returns to the requires_payment_method status.Email the customer to request that they place a new order.

Learn more about fulfilling orders.

Test your integration

When testing your Checkout integration, select Afterpay as the payment method and click the Pay button.

Test your Afterpay integration with your test API keys by viewing the redirect page. You can test a successful payment by authenticating the payment on the redirect page. The PaymentIntent will transition from requires_action to succeeded.

To test authentication failure, use your test API keys and view the redirect page. On the redirect page, click Fail test payment. The PaymentIntent will transition from requires_action to requires_payment_method.

For manual capture PaymentIntents in testmode, the uncaptured PaymentIntent will auto-expire 10 minutes after successful authorization.

Failed payments

Afterpay takes into account multiple factors when deciding to accept or decline a transaction (for example, the length of time the customer has been using Afterpay, the outstanding amount the customer has to repay, or the value of the current order).

You should always present additional payment options such as card in your checkout flow, as Afterpay payments have a higher rate of decline than many payment methods. In these cases, the PaymentMethod is detached and the PaymentIntent object’s status automatically transitions to requires_payment_method.

For an Afterpay PaymentIntent with a status of requires_action, customers need to complete the payment within 3 hours after you redirect them to the Afterpay site (this doesn’t apply to declined payments). If they take no action within 3 hours, the PaymentMethod detaches and the object status for the PaymentIntent automatically transitions to requires_payment_method.

In these cases, inform your customer to try again with a different payment option presented in your checkout flow.

Error codes

These are the common error codes and corresponding recommended actions:

Error codeRecommended action
payment_intent_payment_attempt_failedA generic failure indicating the Afterpay checkout failed. This can also be a decline which doesn’t appear as a decline error code.
payment_method_provider_declineAfterpay declined the customer’s payment. As a next step, the customer needs to contact Afterpay for more information.
payment_intent_payment_attempt_expiredThe customer never completed the payment on Afterpay’s checkout page, and the payment session has expired. Stripe automatically expires PaymentIntents that aren’t successfully authorized 3 hours after initial checkout creation.
payment_method_not_availableAfterpay experienced a service related error and is unable to complete the request. Retry at a later time.
amount_too_smallEnter an amount within Afterpay’s default transactions limits for the country.
amount_too_largeEnter an amount within Afterpay’s default transactions limits for the country.

See also

  • More about Afterpay
  • Checkout fulfillment
  • Customizing Checkout
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Chat with Stripe developers on Discord.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc