Create secure, hosted checkout experiences that handle the complete payment flow for both one-time purchases and subscriptions with full customization control.
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.
import DodoPayments from 'dodopayments';// Initialize the Dodo Payments clientconst 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 routeapp.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' }); }});
import osfrom dodopayments import DodoPayments# Initialize the Dodo Payments clientclient = DodoPayments( bearer_token=os.environ.get("DODO_PAYMENTS_API_KEY"), # This is the default and can be omitted environment="test_mode", # defaults to "live_mode")def create_checkout_session(): """ Create a checkout session for a single product with customer data pre-filled. Returns the session object containing checkout_url for customer redirection. """ try: session = client.checkout_sessions.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 checkout 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 print(f"Checkout URL: {session.checkout_url}") print(f"Session ID: {session.session_id}") return session except Exception as error: print(f"Failed to create checkout session: {error}") raise error# Example usage in a Flask routefrom flask import Flask, jsonify, requestapp = Flask(__name__)@app.route('/create-checkout', methods=['POST'])def create_checkout(): try: session = create_checkout_session() return jsonify({"checkout_url": session.checkout_url}) except Exception as error: return jsonify({"error": "Failed to create checkout session"}), 500
// Direct API call using fetch - useful for any JavaScript environmentasync function createCheckoutSession() { try { const response = await fetch('https://test.dodopayments.com/checkouts', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.DODO_PAYMENTS_API_KEY}` }, body: JSON.stringify({ // 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 checkout 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' } }) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const session = await response.json(); // 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: Redirect user to checkoutcreateCheckoutSession().then(session => { window.location.href = session.checkout_url;});
Direct your customer to the checkout URL to complete their purchase.
// Redirect immediatelywindow.location.href = session.checkout_url;// Or open in new windowwindow.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.
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.
Amount the customer pays if pay_what_you_want is enabled. If disabled, this field will be ignored.Formato: Rappresentato nella minima denominazione della valuta (ad esempio, centesimi per il USD). Per esempio, per addebitare $1.00, passa 100.
Sovrascrittura per sessione di pagamento per i crediti già associati a questo prodotto. Usalo per concedere un numero diverso di crediti per questa singola sessione — ad esempio, un pacchetto promozionale che concede 1.000 crediti API invece dei 500 predefiniti del prodotto — senza creare un prodotto separato.
Ogni credit_entitlement_id deve essere già collegato al prodotto. Questo campo sovrascrive solo il credits_amount concesso quando questa sessione è completata; le impostazioni di assegnazione del credito a livello di prodotto (scadenza, trasferimento, ecc.) si applicano ancora.
Numero di crediti da concedere per questa sessione di pagamento, sovrascrivendo il credits_amount a livello di prodotto. Deve essere maggiore di zero.
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.
L’identificatore univoco di un cliente esistente. Usa questo per collegare la sessione di pagamento a un cliente esistente invece di crearne uno nuovo.
Numero di telefono del cliente in formato internazionale. Necessario per alcuni metodi di pagamento e per la prevenzione delle frodi.Formato: Includi il prefisso internazionale, ad esempio, "+1234567890" per i numeri statunitensi
Completa l’indirizzo stradale includendo il numero civico, il nome della strada e il numero dell’appartamento/unità se applicabile.Esempio: "123 Main St, Apt 4B" o "456 Oak Avenue"
Codice ISO del paese a due lettere (ISO 3166-1 alpha-2). Questo campo è sempre richiesto quando viene fornito l’indirizzo di fatturazione.Esempi: "US" (Stati Uniti), "CA" (Canada), "GB" (Regno Unito), "DE" (Germania)
Country Code Reference
Visualizza l’elenco completo dei paesi supportati e dei loro codici ISO
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.
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.
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:
Parametro
Tipo
Condizione
payment_id
string
Sempre presente per pagamenti una tantum
subscription_id
string
Sempre presente per i pagamenti con abbonamento
status
string
Sempre presente
license_key
string
Presente se il prodotto ha chiavi di licenza abilitate. Separati da virgola se ce ne sono molteplici
email
string
Presente se il cliente ha un’email registrata
Esempi di URL di reindirizzamento:
# One-time payment with license keyhttps://yoursite.com/return?payment_id=pay_xxx&status=succeeded&license_key=LK-001&email=customer%40example.com# Subscription payment with multiple license keyshttps://yoursite.com/return?subscription_id=sub_xxx&status=active&license_key=LK-001,LK-002&email=customer%40example.com# Payment without license keyshttps://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.
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.
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.
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.
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.
Forza l’interfaccia di checkout a essere visualizzata in una lingua specifica. Per impostazione predefinita, il checkout rileva automaticamente la lingua del browser del cliente.Codici lingua supportati:ar (Arabo), ca (Catalano), de (Tedesco), en (Inglese), es (Spagnolo), fr (Francese), he (Ebraico), id (Indonesiano), it (Italiano), ja (Giapponese), ko (Coreano), ms (Malese), nl (Olandese), pl (Polacco), pt (Portoghese), ro (Rumeno), ru (Russo), sv (Svedese), th (Tailandese), tr (Turco), zh (Cinese)Esempio: "es" per Spagnolo, "ja" per Giapponese
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.
Salta la pagina di successo del pagamento predefinita e reindirizza immediatamente i clienti al tuo return_url dopo il completamento del pagamento.
Usa questo quando hai una pagina di successo personalizzata che offre una migliore esperienza utente, o per app mobili e flussi di checkout incorporati.
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.
Identificatore univoco per questo campo. Utilizzato come chiave nei payload dei webhook e nelle risposte API.Esempio: "company_name", "referral_source", "team_size"
Elenco delle opzioni per il tipo di campo dropdown. Richiesto quando field_type è dropdown, ignorato per gli altri tipi.Esempio: ["Google", "Twitter", "Friend referral", "Other"]
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
Prezzo del prodotto per l’addebito iniziale al cliente. Se non specificato, verrà utilizzato il prezzo memorizzato del prodotto.Formato: Rappresentato nella minima denominazione della valuta (ad esempio, centesimi per il USD). Per esempio, per addebitare $1.00, passa 100.
Descrizione opzionale del prodotto per la fatturazione e le voci di linea. Se non specificato, verrà utilizzata la descrizione memorizzata del prodotto.
Se le commissioni di conversione valuta adattive devono essere incluse nel prezzo del prodotto (vero) o aggiunte sopra (falso). Ignorato se il prezzo adattivo non è abilitato.
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.
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 linkconsole.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.
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.
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.
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
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.
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.