Skip to main content
Checkout page
Dodo Payments checkout is a conversion-optimized, globally compliant checkout designed for digital products and SaaS businesses. It supports multiple currencies, languages, taxes, discounts, add-ons, and business-friendly compliance workflows.

Adaptive Currency

Adaptive Currency allows customers to pay in their preferred local currency, improving trust and conversion rates.

How It Works

  1. Enable: Enable Adaptive Currency from your Business Settings
  2. Select: Customers can switch currencies directly on checkout
  3. Convert: Prices are dynamically converted using real-time FX rates
  4. Display: Final payable amount is shown transparently before payment
Currency selector on checkout

Adaptive Currency

Learn more about supported currencies, conversion fees, and refund handling.

Multi-Language Checkout

Dodo Payments supports multiple languages on the checkout page, allowing customers to complete payments in a language they’re comfortable with.
Language selector on checkout

Key Highlights

  • Language selector available directly on checkout
  • UI text, labels, and system messages are localized
  • Improves accessibility and international conversion

Supported Languages

The checkout page supports 21 languages:
LanguageCode
Arabicar
Catalanca
Chinesezh
Dutchnl
Englishen
Frenchfr
Germande
Hebrewhe
Indonesianid
Italianit
Japaneseja
Koreanko
Malayms
Polishpl
Portuguesept
Romanianro
Russianru
Spanishes
Swedishsv
Thaith
Turkishtr
You can force a specific language on the checkout by setting the force_language parameter when creating a checkout session. See the Checkout Sessions API for details.

Automatic Tax Calculation

Taxes are automatically calculated based on the customer’s billing location, ensuring compliance with GST, VAT, and sales tax requirements without manual setup.

How Tax Calculation Works

1

Location Detection

Tax rules are applied based on the customer’s country (and region where applicable).
2

Dynamic Updates

Tax amount updates automatically when:
  • Country changes
  • Address is updated
3

Transparent Display

Final tax breakdown is shown clearly before payment.
Tax calculation is fully automated. No manual configuration required for standard digital goods and SaaS products.

Business Tax ID Support

For registered businesses, the checkout allows customers to enter their Business Tax ID (e.g., VAT/GST number).

What Happens When a Tax ID Is Entered

  • Tax eligibility is validated in real-time
  • Applicable tax exemptions or reverse-charge rules are applied
  • Tax amount updates instantly on checkout
Business Tax ID entry on checkout
This is especially useful for B2B SaaS and digital services where business customers may be eligible for tax exemptions.

Discount Codes

Customers can apply discount or promo codes you’ve created in the dashboard directly on the checkout page.

Checkout Experience

  1. Customer enters the discount code
  2. Discount is validated instantly
  3. Updated price and savings are shown clearly
Discount code entry on checkout

API Integration

Pre-apply a discount code or enable the discount input field:
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  discount_code: 'WELCOME20', // Pre-apply a code
  feature_flags: {
    allow_discount_code: true // Show discount input field
  },
  return_url: 'https://yoursite.com/return'
});

Discount Codes

Learn how to create and manage discount codes.

Validate Discount by Code

Look up and validate discounts using code names.

Smart Address Collection

The checkout supports flexible address entry for faster completion.

Options Available

OptionDescription
Google Address AutofillQuick selection with autocomplete
Manual EntryFull control for complete addresses
Country SelectionDrives tax and compliance logic
Address collection balances speed, accuracy, and global coverage to maximize conversion while ensuring compliance.

Custom Fields

Collect additional information from customers during checkout by defining custom form fields. This is useful for gathering data like company name, team size, referral source, or any other business-specific information.

Available Field Types

TypeDescription
textSingle-line text input
numberNumeric input
emailEmail address with validation
urlURL with validation
dateDate picker
dropdownSelect from predefined options
booleanYes/No toggle

Example

const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  custom_fields: [
    {
      key: 'company_name',
      label: 'Company Name',
      field_type: 'text',
      required: true
    },
    {
      key: 'team_size',
      label: 'Team Size',
      field_type: 'dropdown',
      required: true,
      options: ['1-10', '11-50', '51-200', '200+']
    }
  ],
  return_url: 'https://yoursite.com/return'
});
Customer responses are automatically included in webhook payloads (payment.succeeded, subscription.created) and API responses via the custom_field_responses array. You can define up to 5 custom fields per checkout session.

Custom Fields Guide

Learn more about custom field configuration and accessing responses.

Privacy Policy & Terms Acceptance

To ensure legal and compliance transparency:
  • Privacy Policy and Buyer Terms links are clearly displayed on checkout
  • Customers explicitly acknowledge these before completing payment
This helps meet global consumer protection and data privacy requirements including GDPR compliance.

Collection Checkout

Product Collections enable a unified checkout experience where customers can view and select from multiple related products (e.g., Starter, Pro, Enterprise plans) in a single checkout.

How It Works

  1. All products displayed: Customers see every active product in the collection
  2. First product pre-selected: The first product in the collection is automatically selected
  3. Compare options: Customers can compare pricing and features before choosing
  4. Single selection: After selecting a product, checkout proceeds with standard payment flow

Creating a Collection Checkout

const session = await client.checkoutSessions.create({
  product_collection_id: 'pdc_abc123',
  product_cart: [], // Required: pass an empty array for collection checkout
  return_url: 'https://yoursite.com/return'
});
When using product_collection_id, pass an empty product_cart array. Discount codes cannot be pre-applied at session creation.

Product Collections

Learn how to create and manage product collections for unified checkout experiences.

Checkout Session Configuration

Control checkout behavior using the Checkout Sessions API:
const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  customer: {
    email: '[email protected]',
    name: 'Jane Doe'
  },
  billing_currency: 'EUR', // Set specific currency
  discount_code: 'PROMO10',
  feature_flags: {
    allow_discount_code: true
  },
  return_url: 'https://yoursite.com/return',
  metadata: {
    order_ref: 'ORD-12345'
  }
});

Checkout Theme Customization

Customize the checkout page appearance to match your brand with the theme_config parameter when creating a checkout session via the API. Configure colors, fonts, border radius, and button text for both light and dark modes.
This section covers the server-side API theme configuration using theme_config. If you’re using the Checkout SDK (overlay or inline checkout), see the theme customization sections in Overlay Checkout or Inline Checkout which use camelCase properties (e.g., bgPrimary instead of bg_primary).

Theme Configuration Options

PropertyDescription
lightColor configuration for light mode
darkColor configuration for dark mode
font_primary_urlURL for the primary font
font_secondary_urlURL for the secondary font
font_sizeFont size: xs, sm, md, lg, xl, 2xl
font_weightFont weight: normal, medium, bold, extraBold
radiusBorder radius for UI elements (e.g., 4px, 0.5rem, 8px)
pay_button_textCustom text for the pay button (e.g., “Complete Purchase”, “Subscribe Now”)

Color Configuration (Light/Dark Mode)

Each mode (light and dark) supports the following color properties:
PropertyDescription
bg_primaryBackground primary color
bg_secondaryBackground secondary color
text_primaryText primary color
text_secondaryText secondary color
text_placeholderText placeholder color
text_errorText error color
text_successText success color
border_primaryBorder primary color
border_secondaryBorder secondary color
button_primaryPrimary button background color
button_primary_hoverPrimary button hover color
button_secondarySecondary button background color
button_secondary_hoverSecondary button hover color
button_text_primaryPrimary button text color
button_text_secondarySecondary button text color
input_focus_borderInput focus border color
All color fields accept standard CSS color formats:
  • Hex: #fff, #ffffff, #ffffffff
  • RGB/RGBA: rgb(255, 255, 255), rgba(255, 255, 255, 0.5)
  • HSL/HSLA: hsl(120, 100%, 50%), hsla(120, 100%, 50%, 0.5)
  • Named colors: red, blue, transparent

Example

const session = await client.checkoutSessions.create({
  product_cart: [
    { product_id: 'prod_abc', quantity: 1 }
  ],
  theme_config: {
    // Custom fonts
    font_primary_url: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap',
    font_size: 'md',
    font_weight: 'medium',
    radius: '8px',
    pay_button_text: 'Complete Purchase',
    
    // Light mode colors
    light: {
      bg_primary: '#ffffff',
      bg_secondary: '#f5f5f5',
      text_primary: '#1a1a1a',
      text_secondary: '#666666',
      button_primary: '#0066ff',
      button_primary_hover: '#0052cc',
      button_text_primary: '#ffffff',
      border_primary: '#e0e0e0'
    },
    
    // Dark mode colors
    dark: {
      bg_primary: '#1a1a1a',
      bg_secondary: '#2d2d2d',
      text_primary: '#ffffff',
      text_secondary: '#a0a0a0',
      button_primary: '#3385ff',
      button_primary_hover: '#4d99ff',
      button_text_primary: '#ffffff',
      border_primary: '#404040'
    }
  },
  return_url: 'https://yoursite.com/return'
});
You don’t need to specify all color properties. Any unspecified properties will use the default theme values.