Vai al contenuto principale

Documentation Index

Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt

Use this file to discover all available pages before exploring further.

Quick Start Guide

Get your first checkout session running in under 5 minutes

API Reference & Live Testing

Explore the full API documentation and interactively test Checkout Session requests and responses.

Preview Checkout

Calculate pricing, taxes, and totals before creating a session.
Session Validity: Checkout sessions are valid for 24 hours by default. If you pass confirm=true in your request, the session will only be valid for 15 minutes.

Prerequisites

1

Dodo Payments Account

You’ll need an active Dodo Payments merchant account with API access.
2

API Credentials

Generate your API credentials from the Dodo Payments dashboard:
3

Products Setup

Create your products in the Dodo Payments dashboard before implementing checkout sessions.

Creating Your First Checkout Session

import DodoPayments from 'dodopayments';

// Initialize the Dodo Payments client
const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
  environment: 'test_mode', // defaults to 'live_mode'
});

async function createCheckoutSession() {
  try {
    const session = await client.checkoutSessions.create({
      // Products to sell - use IDs from your Dodo Payments dashboard
      product_cart: [
        {
          product_id: 'prod_123', // Replace with your actual product ID
          quantity: 1
        }
      ],
      
      // Pre-fill customer information to reduce friction
      customer: {
        email: 'customer@example.com',
        name: 'John Doe',
        phone_number: '+1234567890'
      },
      
      // Billing address for tax calculation and compliance
      billing_address: {
        street: '123 Main St',
        city: 'San Francisco',
        state: 'CA',
        country: 'US', // Required: ISO 3166-1 alpha-2 country code
        zipcode: '94102'
      },
      
      // Where to redirect after successful payment
      return_url: 'https://yoursite.com/checkout/success',
      
      // Custom data for your internal tracking
      metadata: {
        order_id: 'order_123',
        source: 'web_app'
      }
    });

    // Redirect your customer to this URL to complete payment
    console.log('Checkout URL:', session.checkout_url);
    console.log('Session ID:', session.session_id);
    
    return session;
    
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

// Example usage in an Express.js route
app.post('/create-checkout', async (req, res) => {
  try {
    const session = await createCheckoutSession();
    res.json({ checkout_url: session.checkout_url });
  } catch (error) {
    res.status(500).json({ error: 'Failed to create checkout session' });
  }
});

API Response

All methods above return the same response structure:
{
  "session_id": "cks_Gi6KGJ2zFJo9rq9Ukifwa",
  "checkout_url": "https://test.checkout.dodopayments.com/session/cks_Gi6KGJ2zFJo9rq9Ukifwa"
}
1

Get the checkout URL

Extract the checkout_url from the API response.
2

Redirect your customer

Direct your customer to the checkout URL to complete their purchase.
// Redirect immediately
window.location.href = session.checkout_url;

// Or open in new window
window.open(session.checkout_url, '_blank');
Alternative Integration Options: Instead of redirecting, you can embed the checkout directly in your page using Overlay Checkout (modal overlay) or Inline Checkout (fully embedded). Both options use the same checkout session URL.
3

Handle the return

After payment, customers are redirected to your return_url with query parameters including payment/subscription ID, status, customer email, and any license keys. See the return_url parameter docs for the full list.

Request Body

Required Fields

Essential fields needed for every checkout session

Optional Fields

Additional configuration to customize your checkout experience

Required Fields

product_cart
array
obbligatorio
Array of products to include in the checkout session. Each product must have a valid product_id from your Dodo Payments dashboard.
Mixed Checkout: You can combine one-time payment products and subscription products in the same checkout session. This enables powerful use cases like setup fees with subscriptions, hardware bundles with SaaS, and more.
Trova i tuoi ID prodotto: Puoi trovare gli ID prodotto nella tua dashboard Dodo Payments sotto Prodotti → Visualizza dettagli, oppure utilizzando l’API Elenco prodotti.

Campi opzionali

Configura questi campi per personalizzare l’esperienza di pagamento e aggiungere logica aziendale al tuo flusso di pagamenti.
customer
object
Informazioni sul cliente. Puoi allegare un cliente esistente utilizzando il loro ID o creare un nuovo record cliente durante il checkout.
Collega un cliente esistente alla sessione di pagamento utilizzando il loro ID.
billing_address
object
Informazioni sull’indirizzo di fatturazione per un calcolo preciso delle tasse, la prevenzione delle frodi e la conformità normativa.
Quando confirm è impostato su true, tutti i campi dell’indirizzo di fatturazione diventano obbligatori per la creazione con successo della sessione.
allowed_payment_method_types
array
Controlla quali metodi di pagamento sono disponibili per i clienti durante il checkout. Questo aiuta a ottimizzare per mercati specifici o requisiti aziendali.Opzioni Disponibili: credit, debit, upi_collect, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal, sunbit
Critico: Includere sempre credit e debit come opzioni di ripiego per prevenire errori di pagamento quando i metodi di pagamento preferiti non sono disponibili.
Esempio:
["apple_pay", "google_pay", "credit", "debit"]
billing_currency
string
Sovrascrive la selezione della valuta predefinita con una valuta di fatturazione fissa. Usa i codici valuta ISO 4217.Valute supportate: USD, EUR, GBP, CAD, AUD, INR, e altroEsempio: "USD" per Dollari Statunitensi, "EUR" per Euro
Questo campo è efficace solo quando il prezzo adattivo è abilitato. Se il prezzo adattivo è disabilitato, verrà utilizzata la valuta predefinita del prodotto.
show_saved_payment_methods
boolean
predefinito:"false"
Visualizza metodi di pagamento salvati in precedenza per i clienti che ritornano, migliorando la velocità del checkout e l’esperienza utente.
return_url
string
URL per reindirizzare i clienti dopo il completamento del pagamento. Dodo Payments aggiunge i seguenti parametri di query al tuo URL al momento del reindirizzamento:
ParametroTipoCondizione
payment_idstringSempre presente per pagamenti una tantum
subscription_idstringSempre presente per i pagamenti con abbonamento
statusstringSempre presente
license_keystringPresente se il prodotto ha chiavi di licenza abilitate. Separati da virgola se ce ne sono molteplici
emailstringPresente se il cliente ha un’email registrata
Esempi di URL di reindirizzamento:
# One-time payment with license key
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com

# Subscription payment with multiple license keys
https://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001,LK-002&email=customer%40example.com

# Payment without license keys
https://yoursite.com/return?payment_id=pay_xxx&status=succeeded&email=customer%40example.com
Usa i parametri di query license_key e email per visualizzare immediatamente le chiavi di licenza o inviare una conferma sulla tua pagina di ritorno, senza bisogno di una chiamata API extra.
cancel_url
string
URL a cui reindirizzare i clienti quando cliccano il pulsante di ritorno o annullano la sessione di pagamento. Se non fornito, il pulsante di ritorno non verrà visualizzato.
Imposta un cancel_url per offrire ai clienti un modo chiaro di tornare al tuo sito senza completare l’acquisto. Questo migliora l’esperienza di checkout e riduce le frizioni.
confirm
boolean
predefinito:"false"
Se vero, finalizza immediatamente tutti i dettagli della sessione. L’API genererà un errore se i dati richiesti mancano.
discount_codes
array
Applica uno o più codici sconto impilabili alla sessione di checkout. I codici vengono applicati nell’ordine dell’array (il primo codice riduce il prezzo base, il secondo riduce il prezzo già scontato, e così via), fino a un massimo di 20 codici per sessione.
discount_codes: ['WELCOME10', 'BLACKFRIDAY20']
Il campo singolare discount_code qui sotto è deprecato ma ancora pienamente supportato — le integrazioni esistenti continuano a funzionare senza modifiche. Non può essere combinato con discount_codes nella stessa richiesta. Passa a discount_codes quando conveniente per sfruttare l’impilamento.
discount_code
string
deprecato
Deprecato — preferisci discount_codes per nuove integrazioni. Questo campo funziona ancora per compatibilità con versioni precedenti, ma non può essere combinato con discount_codes nella stessa richiesta.
metadata
object
Coppie chiave-valore personalizzate per memorizzare informazioni aggiuntive sulla sessione.
force_3ds
boolean
Sovrascrivi il comportamento predefinito del 3DS del commerciante per questa sessione.
minimal_address
boolean
predefinito:"false"
Abilita la modalità di raccolta indirizzo minima. Quando abilitata, il checkout raccoglie solo:
  • Paese: Sempre richiesto per la determinazione delle tasse
  • CAP/Codice postale: Solo nelle regioni dove è necessario per il calcolo dell’IVA o la determinazione delle tasse di vendita
Questo riduce significativamente la frizione durante il checkout eliminando campi del modulo non necessari.
Abilita la modalità di indirizzo minimo per una conclusione del checkout più veloce. La raccolta completa dell’indirizzo rimane disponibile per le aziende che richiedono dettagli completi di fatturazione.
customization
object
Personalizza l’aspetto e il comportamento dell’interfaccia di checkout.
feature_flags
object
Configura caratteristiche e comportamenti specifici per la sessione di checkout.
custom_fields
array
Raccogli informazioni aggiuntive dai clienti durante il checkout con campi del modulo personalizzati. Puoi definire fino a 5 campi personalizzati per sessione di checkout. Le risposte dei clienti sono incluse nei payload dei webhook e disponibili tramite l’API.
Le risposte dei clienti ai campi personalizzati sono incluse in:
  • Webhooks: payment.succeeded, subscription.active e altri payload di eventi rilevanti contengono l’array custom_field_responses
  • Risposte API: Gli oggetti di pagamento e sottoscrizione includono custom_field_responses
subscription_data
object
Configurazione aggiuntiva per le sessioni di checkout contenenti prodotti in abbonamento.

Esempi di utilizzo

Ecco 10 esempi completi che mostrano diverse configurazioni della sessione di checkout per vari scenari aziendali:

1. Checkout di un singolo prodotto semplice

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_ebook_guide',
      quantity: 1
    }
  ],
  customer: {
    email: 'customer@example.com',
    name: 'John Doe'
  },
  return_url: 'https://yoursite.com/success'
});

2. Carrello multi-prodotto

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_laptop',
      quantity: 1
    },
    {
      product_id: 'prod_mouse',
      quantity: 2
    },
    {
      product_id: 'prod_warranty',
      quantity: 1
    }
  ],
  customer: {
    email: 'customer@example.com',
    name: 'John Doe',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '123 Tech Street',
    city: 'San Francisco',
    state: 'CA',
    country: 'US',
    zipcode: '94102'
  },
  return_url: 'https://electronics-store.com/order-confirmation'
});

3. Abbonamento con periodo di prova

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_plan',
      quantity: 1
    }
  ],
  subscription_data: {
    trial_period_days: 14
  },
  customer: {
    email: 'user@startup.com',
    name: 'Jane Smith'
  },
  return_url: 'https://saas-app.com/onboarding',
  metadata: {
    plan_type: 'professional',
    referral_source: 'google_ads'
  }
});

4. Checkout preconfermato

Quando confirm è impostato su true, il cliente verrà portato direttamente alla pagina di checkout, saltando eventuali passaggi di conferma.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_course',
      quantity: 1
    }
  ],
  customer: {
    email: 'student@university.edu',
    name: 'Alex Johnson',
    phone_number: '+1555123456'
  },
  billing_address: {
    street: '456 University Ave',
    city: 'Boston',
    state: 'MA',
    country: 'US',
    zipcode: '02134'
  },
  confirm: true,
  return_url: 'https://learning-platform.com/course-access',
  metadata: {
    course_category: 'programming',
    enrollment_date: '2024-01-15'
  }
});

5. Checkout con sovrascrittura valuta

La sovrascrittura billing_currency ha effetto solo quando la valuta adattiva è abilitata nelle impostazioni del tuo account. Se la valuta adattiva è disabilitata, questo parametro non avrà effetto.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_consulting_service',
      quantity: 1
    }
  ],
  customer: {
    email: 'client@company.co.uk',
    name: 'Oliver Williams'
  },
  billing_address: {
    street: '789 Business Park',
    city: 'London',
    state: 'England',
    country: 'GB',
    zipcode: 'SW1A 1AA'
  },
  billing_currency: 'GBP',
  feature_flags: {
    allow_currency_selection: true,
    allow_tax_id: true
  },
  return_url: 'https://consulting-firm.com/service-confirmation'
});

6. Metodi di pagamento salvati per i clienti di ritorno

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  customer: {
    email: 'returning.customer@example.com',
    name: 'Robert Johnson',
    phone_number: '+1555987654'
  },
  show_saved_payment_methods: true,
  feature_flags: {
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://subscription-service.com/welcome-back',
  metadata: {
    customer_tier: 'premium',
    account_age: 'returning'
  }
});

7. Checkout B2B con raccolta ID fiscale

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_enterprise_license',
      quantity: 5
    }
  ],
  customer: {
    email: 'procurement@enterprise.com',
    name: 'Sarah Davis',
    phone_number: '+1800555000'
  },
  billing_address: {
    street: '1000 Corporate Blvd',
    city: 'New York',
    state: 'NY',
    country: 'US',
    zipcode: '10001'
  },
  feature_flags: {
    allow_tax_id: true,
    allow_phone_number_collection: true,
    always_create_new_customer: false
  },
  return_url: 'https://enterprise-software.com/license-delivery',
  metadata: {
    customer_type: 'enterprise',
    contract_id: 'ENT-2024-001',
    sales_rep: 'john.sales@company.com'
  }
});

8. Checkout a tema scuro con codici sconto impilati

const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_gaming_chair',
      quantity: 1
    }
  ],
  discount_codes: ['BLACKFRIDAY2024'],
  customization: {
    theme: 'dark',
    show_order_details: true,
    show_on_demand_tag: false
  },
  feature_flags: {
    allow_discount_code: true
  },
  customer: {
    email: 'gamer@example.com',
    name: 'Mike Chen'
  },
  return_url: 'https://gaming-store.com/order-complete'
});

9. Metodi di pagamento regionali (UPI per l’India)

Per informazioni dettagliate sulla configurazione e il test UPI, vedere la pagina Metodi di pagamento India.
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_online_course_hindi',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'upi_collect',
    'credit',
    'debit'
  ],
  customer: {
    email: 'student@example.in',
    name: 'Priya Sharma',
    phone_number: '+919876543210'
  },
  billing_address: {
    street: 'MG Road',
    city: 'Bangalore',
    state: 'Karnataka',
    country: 'IN',
    zipcode: '560001'
  },
  billing_currency: 'INR',
  return_url: 'https://education-platform.in/course-access',
  metadata: {
    region: 'south_india',
    language: 'hindi'
  }
});

10. Checkout BNPL (Buy Now Pay Later)

Per informazioni dettagliate sulla configurazione e il test BNPL, vedere la pagina Buy Now Pay Later (BNPL).
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_luxury_watch',
      quantity: 1
    }
  ],
  allowed_payment_method_types: [
    'klarna',
    'afterpay_clearpay',
    'credit',
    'debit'
  ],
  customer: {
    email: 'fashion.lover@example.com',
    name: 'Emma Thompson',
    phone_number: '+1234567890'
  },
  billing_address: {
    street: '555 Fashion Ave',
    city: 'Los Angeles',
    state: 'CA',
    country: 'US',
    zipcode: '90210'
  },
  feature_flags: {
    allow_phone_number_collection: true
  },
  return_url: 'https://luxury-store.com/purchase-confirmation',
  metadata: {
    product_category: 'luxury',
    price_range: 'high_value'
  }
});

11. Utilizzo di metodi di pagamento esistenti per checkout immediato

Usa un metodo di pagamento salvato dal cliente per creare una sessione di checkout che si processa immediatamente, saltando la raccolta del metodo di pagamento:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_premium_plan',
      quantity: 1
    }
  ],
  customer: {
    customer_id: 'cus_123'  // Required when using payment_method_id
  },
  payment_method_id: 'pm_abc123',  // Use customer's saved payment method
  confirm: true,  // Required when using payment_method_id
  return_url: 'https://yourapp.com/success'
});
Quando si utilizza payment_method_id, confirm deve essere impostato su true e deve essere fornito un customer_id esistente. Il metodo di pagamento verrà convalidato per l’idoneità con la valuta del pagamento.
Il metodo di pagamento deve appartenere al cliente ed essere compatibile con la valuta del pagamento. Questo abilita acquisti in un clic per i clienti di ritorno.
Genera link di pagamento abbreviati e condivisibili con slug personalizzati:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_monthly_subscription',
      quantity: 1
    }
  ],
  short_link: true,  // Generate a shortened payment link
  return_url: 'https://yourapp.com/success',
  customer: {
    email: 'customer@example.com',
    name: 'John Doe'
  }
});

// The checkout_url will be a shortened, cleaner link
console.log(session.checkout_url);  // e.g., https://checkout.dodopayments.com/buy/abc123
I link brevi sono perfetti per SMS, e-mail o condivisione sui social media. Sono più facili da ricordare e costruiscono maggiore fiducia nei clienti rispetto a URL lunghi.

13. Salta pagina di successo del pagamento con reindirizzamento immediato

Reindirizza immediatamente i clienti dopo il completamento del pagamento, bypassando la pagina di successo predefinita:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_digital_product',
      quantity: 1
    }
  ],
  feature_flags: {
    redirect_immediately: true  // Skip success page, redirect immediately
  },
  return_url: 'https://yourapp.com/success',
  customer: {
    email: 'customer@example.com',
    name: 'Jane Smith'
  }
});
Usa redirect_immediately: true quando hai una pagina di successo personalizzata che fornisce un’esperienza utente migliore rispetto alla pagina di successo del pagamento predefinita. Questo è particolarmente utile per app mobili e flussi di checkout incorporati.
Quando redirect_immediately è abilitato, i clienti vengono reindirizzati al vostro return_url immediatamente dopo il completamento del pagamento, saltando completamente la pagina di successo predefinita.

14. Forzare una lingua

Forza il checkout a essere visualizzato in una lingua specifica, sovrascrivendo il rilevamento della lingua del browser del cliente:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_subscription',
      quantity: 1
    }
  ],
  customization: {
    force_language: 'ja'  // Force Japanese language
  },
  customer: {
    email: 'customer@example.jp',
    name: 'Tanaka Yuki'
  },
  return_url: 'https://yourapp.com/success'
});
Usa force_language quando conosci la lingua preferita del tuo cliente (ad es., dalle impostazioni del loro account) o quando stai puntando a mercati regionali specifici.
Lingue supportate: Arabo (ar), Catalano (ca), Cinese (zh), Olandese (nl), Inglese (en), Francese (fr), Tedesco (de), Ebraico (he), Indonesiano (id), Italiano (it), Giapponese (ja), Coreano (ko), Malese (ms), Polacco (pl), Portoghese (pt), Rumeno (ro), Russo (ru), Spagnolo (es), Svedese (sv), Tailandese (th), Turco (tr)

15. Raccolta di campi personalizzati

Raccogli informazioni aggiuntive dai clienti durante il checkout utilizzando campi personalizzati:
const session = await client.checkoutSessions.create({
  product_cart: [
    {
      product_id: 'prod_saas_plan',
      quantity: 1
    }
  ],
  custom_fields: [
    {
      key: 'company_name',
      label: 'Company Name',
      field_type: 'text',
      required: true,
      placeholder: 'Acme Inc.'
    },
    {
      key: 'team_size',
      label: 'Team Size',
      field_type: 'dropdown',
      required: true,
      options: ['1-10', '11-50', '51-200', '201-500', '500+']
    },
    {
      key: 'referral_source',
      label: 'How did you hear about us?',
      field_type: 'dropdown',
      required: false,
      options: ['Google', 'Twitter', 'Friend referral', 'Blog post', 'Other']
    },
    {
      key: 'website',
      label: 'Company Website',
      field_type: 'url',
      required: false,
      placeholder: 'https://example.com'
    }
  ],
  customer: {
    email: 'buyer@company.com',
    name: 'Jane Doe'
  },
  return_url: 'https://yourapp.com/success'
});
Le risposte ai campi personalizzati sono automaticamente incluse nei payload dei webhook (payment.succeeded, subscription.active, ecc.) e possono essere recuperate tramite l’API. Usale per arricchire il tuo CRM, attivare flussi di onboarding o personalizzare l’esperienza del cliente.
Tipi di campo disponibili: text, number, email, url, date, dropdown, boolean

Anteprima delle sessioni di checkout

Prima di creare una sessione di checkout, puoi visualizzare in anteprima la ripartizione dei prezzi inclusi tasse, sconti e totali. Questo è utile per visualizzare prezzi accurati ai clienti prima che procedano al checkout.
const preview = await client.checkoutSessions.preview({
  product_cart: [
    { product_id: 'prod_123', quantity: 1 }
  ],
  billing_address: {
    country: 'US',
    state: 'CA',
    zipcode: '94102'
  },
  discount_codes: ['SAVE20']
});

console.log('Subtotal:', preview.subtotal);
console.log('Tax:', preview.tax);
console.log('Discount:', preview.discount);
console.log('Total:', preview.total);

Preview API Reference

Visualizza la documentazione completa dell’endpoint di anteprima.

Differenze principali

In precedenza, quando si creava un link di pagamento con Link Dinamici, era necessario fornire l’indirizzo di fatturazione completo del cliente. Con le Sessioni di Checkout, questo non è più necessario. Puoi semplicemente passare le informazioni che hai, e ci occuperemo del resto. Per esempio:
  • Se conosci solo il paese di fatturazione del cliente, basta fornire quello.
  • Il flusso di pagamento raccoglierà automaticamente i dettagli mancanti prima di spostare il cliente alla pagina di pagamento.
  • D’altra parte, se hai già tutte le informazioni richieste e vuoi passare direttamente alla pagina di pagamento, puoi passare il set completo di dati e includere confirm=true nel corpo della tua richiesta.

Processo di migrazione

La migrazione da Link Dinamici a Sessioni di Checkout è semplice:
1

Update your integration

Aggiorna la tua integrazione per utilizzare il nuovo metodo API o SDK.
2

Adjust request payload

Regola il payload della richiesta secondo il formato delle Sessioni di Checkout.
3

That's it!

Sì. Non sono necessarie ulteriori gestioni o passaggi di migrazione speciali dalla tua parte.

Riferimento API correlato

Create Checkout Session

Riferimento API completo per la creazione di sessioni di checkout con tutti i parametri e le opzioni disponibili

Preview Checkout Session

Riferimento API per visualizzare in anteprima i prezzi, le tasse e i totali prima di creare una sessione
Last modified on May 26, 2026