Skip to main content
Inline checkout embeds a secure payment form directly into your page layout. Unlike overlay checkout, which opens as a modal, inline checkout becomes part of your page. You control the layout and can display your own order summary alongside the checkout form.
Inline checkout form embedded in a product page with order summary

How It Works

Inline checkout renders a secure Dodo Payments frame into a container on your page. The frame handles collecting customer information and payment details. Your page displays items, totals, and other information. The SDK lets your page and the checkout frame communicate with each other. When checkout completes, Dodo Payments creates the payment, or the subscription for a subscription product, and sends a webhook so you can provision access.
The inline checkout frame securely handles all sensitive payment information, ensuring PCI compliance without additional certification on your end.

What Makes a Good Inline Checkout

Customers need to know who they’re buying from, what they’re buying, and how much they’re paying. Your implementation must include:
Inline checkout example with required elements labeled

Example inline checkout layout showing required elements

  1. Recurring information: If recurring, show how often it recurs and the total to pay on renewal. If a trial, show the trial duration.
  2. Item descriptions: A description of what’s being purchased.
  3. Transaction totals: Subtotal, total tax, and grand total, including currency.
  4. Dodo Payments footer: The complete inline checkout frame, including the footer with Dodo Payments information, terms of sale, and privacy policy.
  5. Refund policy: A link to your refund policy, if it differs from the Dodo Payments standard refund policy.
Always display the complete inline checkout frame, including the footer. Removing or hiding legal information violates compliance requirements.

Customer Journey

The checkout flow depends on your checkout session configuration. Depending on how you configure the session, customers may see all information on a single page or across multiple steps.
1

Customer opens checkout

You open inline checkout by passing a checkout URL. Use SDK events, such as checkout.breakdown, to show and update on-page information.Initial checkout page with items list and payment form
2

Customer enters their details

Inline checkout first asks customers to enter their email address, select their country, and (where required) enter their ZIP or postal code. This step gathers all necessary information to determine taxes and available payment options.You can prefill customer details and present saved addresses to streamline the experience.
3

Customer selects payment method

After entering their details, customers are presented with available payment methods and the payment form. Options may include credit or debit card, PayPal, Apple Pay, Google Pay, and other local payment methods based on their location.Display saved payment methods if available to speed up checkout.Available payment methods and card details form
4

Checkout completed

Dodo Payments routes every payment to the best acquirer for that sale to get the best possible chance of success. Customers enter a success workflow that you can build.Success screen with confirmation checkmark
5

Dodo Payments creates the payment or subscription

Dodo Payments creates the payment, or the subscription for a subscription product, and sends a webhook so you can provision access. The payment method the customer used is held on file for renewals or subscription changes.Subscription created with webhook notification

Quick Start

Install the SDK, initialize it for inline mode, and open checkout in a container element:
Ensure you have a container element with the corresponding id on your page: <div id="dodo-inline-checkout"></div>.

Step-by-Step Integration

1

Install the SDK

Install via npm, yarn, or pnpm:
2

Initialize the SDK for Inline Display

Initialize the SDK and specify displayType: 'inline'. Listen for the checkout.breakdown event to update your UI with real-time tax and total calculations:
3

Create a Container Element

Add an element to your HTML where the checkout frame will be injected:
4

Open the Checkout

Call DodoPayments.Checkout.open() with the checkoutUrl and the elementId of your container:
5

Test Your Integration

  1. Start your development server:
  1. Test the checkout flow:
    • Enter your email and address details in the inline frame
    • Verify that your custom order summary updates in real-time
    • Test the payment flow using test credentials
    • Confirm redirects work correctly
You should see checkout.breakdown events logged in your browser console if you added a console log in the onEvent callback.
6

Go Live

When ready for production:
  1. Change the mode to 'live':
  1. Update your checkout URLs to use live checkout sessions from your backend
  2. Test the complete flow in production

Complete React Example

This example demonstrates how to implement a custom order summary alongside the inline checkout, keeping them in sync using the checkout.breakdown event:

API Reference

Initialize

Call Initialize once to set up the SDK:

Open Checkout

Open the checkout frame in a container:

Close Checkout

Programmatically remove the checkout frame and clean up event listeners:

Check Status

Check if the checkout frame is currently injected:

Events

The SDK provides real-time events through the onEvent callback. For inline checkout, checkout.breakdown is particularly useful for syncing your UI:

Checkout Breakdown Data

The checkout.breakdown event provides pricing and tax information:
The event fires when the checkout frame loads, and again whenever the price is recalculated, for example when the customer selects a country or enters a postal code that changes the tax. Field Details: Integration Tips:
  1. Currency Formatting: Prices are integers in the smallest currency unit, for example cents for USD. For two-decimal currencies, divide by 100 before formatting with Intl.NumberFormat. Zero-decimal currencies such as JPY have no smaller unit, so don’t divide them.
  2. Handling Initial States: When the checkout first loads, tax and discount may be 0 or null until the user provides their billing information or applies a code. Handle these states gracefully (e.g., showing a dash — or hiding the row).
  3. The “Final Total” vs “Total”: While total gives you the standard price calculation, finalTotal is the source of truth for the transaction. If finalTotal is present, it reflects exactly what will be charged to the customer’s card.
  4. Real-time Feedback: Use the tax field to show users that taxes are being calculated in real-time. This provides a “live” feel to your checkout page and reduces friction during the address entry step.

CDN Implementation

For quick integration without a build step, load the SDK from CDN:

Update Payment Method

Inline checkout supports payment method updates for subscriptions. When a customer needs to update their payment method for an active subscription or to reactivate an on-hold subscription, you can render the update flow directly within your page layout.

How It Works

  1. Call the Update Payment Method API to get a payment_link:
  1. Pass the returned payment_link as the checkoutUrl to open inline checkout:
The inline frame renders only the payment method collection form. Customers can enter new card details or select a saved payment method without leaving your page.

For On-Hold Subscriptions

When updating the payment method for a subscription in on_hold status, Dodo Payments automatically creates a charge for any remaining dues. Monitor the payment.succeeded and subscription.active webhooks to confirm reactivation.
You can also use an existing saved payment method instead of collecting new details by passing type: 'existing' with a payment_method_id to the Update Payment Method API.

Error Handling

Always implement error handling in your onEvent callback:
Always handle the checkout.error event to provide a good user experience when errors occur.

Best Practices

  1. Responsive Design: Ensure your container element has enough width and height. The iframe will typically expand to fill its container.
  2. Synchronization: Use the checkout.breakdown event to keep your custom order summary or pricing tables in sync with what the user sees in the checkout frame.
  3. Skeleton States: Show a loading indicator in your container until the checkout.opened event fires.
  4. Cleanup: Call DodoPayments.Checkout.close() when your component unmounts to clean up the iframe and event listeners.
For dark mode implementations, use #0d0d0d as the background color for optimal visual integration with the inline checkout frame.

Payment Status Validation

Do not rely solely on inline checkout events to determine payment success or failure. Always implement server-side validation using webhooks and/or polling.

Why Server-Side Validation is Essential

While inline checkout events provide real-time feedback, they should not be your only source of truth for payment status. Network issues, browser crashes, or users closing the page can cause events to be missed. To ensure reliable payment validation:
  1. Listen to webhook events - Dodo Payments sends webhooks for payment status changes
  2. Implement a polling mechanism - Your frontend should poll your server for status updates
  3. Combine both approaches - Use webhooks as the primary source and polling as a fallback

Implementation Steps

1. Listen for checkout events - When the user clicks pay, start preparing to verify the status:
2. Poll your server - Create an endpoint that checks your database for the payment status (updated by webhooks):
3. Handle webhooks server-side - Update your database when Dodo sends payment.succeeded or payment.failed webhooks. See our Webhooks documentation for details.

Troubleshooting

  • Verify that elementId matches the id of a div that actually exists in the DOM
  • Ensure displayType: 'inline' was passed to Initialize
  • Check that the checkoutUrl is valid
  • Ensure you are listening for the checkout.breakdown event
  • Taxes are only calculated after the user enters a valid country and postal code in the checkout frame

Digital Wallets

For detailed information about setting up Apple Pay, Google Pay, and other digital wallets, see the Digital Wallets page.

Quick Setup for Apple Pay

Domain verification is only required for inline (embedded) checkout. It is not required for hosted checkout.
Apple Pay is not available for overlay checkout.
Apple Pay is verified per-domain from the dashboard.
1

Open Wallet domains

Go to Settings → Payment Methods and, on the Apple Pay row, click Manage domains.
Manage domains button on the Apple Pay row in Payment Methods settings

Open Wallet domains from the Apple Pay row

2

Download the domain association file

From the Wallet domains panel, download the association file.
Wallet domains panel with the Download file button

Download the Apple Pay domain association file

3

Register your domain

Click Register domain and enter the domain where you embed inline checkout (e.g. shop.example.com), then Continue.
Register a domain form with a domain entered

Register the domain where you embed inline checkout

4

Host the file on your domain

Host it at:
It must be served over HTTPS, reachable without redirects, and served with Content-Type: application/octet-stream or text/plain.
5

Verify the domain

Click Verify domain. Dodo Payments confirms the file is live and submits your domain to Apple.
Verify your domain screen with the association file host path and Verify domain button

Verify the hosted association file

6

Confirm it's active

When the status shows Active, Apple Pay is enabled for that domain. Use the Enabled toggle to turn it on or off per domain.
Wallet domains list showing domains with an Active Apple Pay status and Enabled toggles

Verified domains show an Active status

7

Test the integration

  1. Open checkout on an Apple device
  2. Verify Apple Pay button appears
  3. Complete a test transaction

Browser Support

The Dodo Payments Checkout SDK supports:
  • Chrome (latest)
  • Firefox (latest)
  • Safari (latest)
  • Edge (latest)
  • IE11+

Inline vs Overlay Checkout

Choose the right checkout type for your use case:
Use inline checkout when you want maximum control over the checkout experience and consistent branding. Use overlay checkout for faster integration with minimal changes to your existing pages.

Overlay Checkout

Use the overlay checkout for quick modal-based integration.

Checkout Sessions API

Create checkout sessions to power your checkout experiences.

Webhooks

Handle payment events server-side with webhooks.

Integration Guide

Complete guide to integrating Dodo Payments.
For more help, visit our Discord community or contact our developer support team.
Last modified on September 26, 2026