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: Representado na menor denominação da moeda (por exemplo, centavos para USD). Por exemplo, para cobrar $1.00, passe 100.
Substituições por sessão de checkout para direitos de crédito já associados a este produto. Use isso para conceder um número diferente de créditos para esta única sessão — por exemplo, um pacote promocional que concede 1.000 créditos de API em vez dos 500 padrão do produto — sem criar um produto separado.
Cada credit_entitlement_id deve já estar anexado ao produto. Este campo substitui apenas o credits_amount concedido quando esta sessão é cumprida; as configurações de direito a crédito em nível de produto (expiração, acúmulo, etc.) ainda se aplicam.
Número de créditos a serem concedidos para esta sessão de checkout, substituindo o credits_amount em nível de produto. Deve ser maior que zero.
Encontre seus IDs de Produto: Você pode encontrar os IDs de produtos no painel do Dodo Payments em Produtos → Ver Detalhes, ou usando o API Listar Produtos.
Número de telefone do cliente em formato internacional. Necessário para alguns métodos de pagamento e prevenção de fraudes.Formato: Inclua o código do país, por exemplo, "+1234567890" para números dos EUA
Endereço completo incluindo número da casa, nome da rua e número do apartamento/unidade, se aplicável.Exemplo: "123 Main St, Apt 4B" ou "456 Oak Avenue"
Código ISO de país de duas letras (ISO 3166-1 alpha-2). Este campo é sempre necessário quando endereço_de_cobrança é fornecido.Exemplos: "US" (Estados Unidos), "CA" (Canadá), "GB" (Reino Unido), "DE" (Alemanha)
Country Code Reference
Veja a lista completa de países suportados e seus códigos ISO
Controle quais métodos de pagamento estão disponíveis para clientes durante o checkout. Isso ajuda a otimizar para mercados específicos ou requisitos de negócios.Opções Disponíveis: credit, debit, upi_collect, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal, sunbit
Crítico: Sempre inclua credit e debit como opções de fallback para evitar falhas no checkout quando métodos de pagamento preferidos não estão disponíveis.
Substitua a seleção de moeda padrão com uma moeda de cobrança fixa. Usado códigos de moeda ISO 4217.Moedas Suportadas: USD, EUR, GBP, CAD, AUD, INR, e maisExemplo: "USD" para Dólares Americanos, "EUR" para Euros
Este campo só é efetivo quando o precificação adaptativa está ativado. Se a precificação adaptativa estiver desativada, a moeda padrão do produto será usada.
URL para redirecionar os clientes após a conclusão do pagamento. O aplicativo Dodo Payments anexa os seguintes parâmetros de consulta ao seu URL ao redirecionar:
Parâmetro
Tipo
Condição
payment_id
string
Sempre presente para pagamentos únicos
subscription_id
string
Sempre presente para pagamentos de assinatura
status
string
Sempre presente
license_key
string
Presente se o produto tiver chaves de licença ativadas. Separado por vírgulas se múltiplas chaves
email
string
Presente se o cliente tiver um email registrado
Exemplos de URLs de redirecionamento:
# 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
Use os parâmetros de consulta license_key e email para exibir chaves de licença ou enviar uma confirmação imediatamente em sua página de retorno, sem precisar de uma chamada de API extra.
URL para redirecionar clientes quando clicam no botão voltar ou cancelam a sessão de checkout. Se não for fornecido, o botão voltar não será exibido.
Defina um cancel_url para dar aos clientes um caminho claro para retornar ao seu site sem completar a compra. Isso melhora a experiência de checkout e reduz atritos.
Aplique um ou mais códigos de desconto empilhados à sessão de checkout. Os códigos são aplicados na ordem do array (o primeiro código reduz o preço base, o segundo reduz o preço já com desconto e assim por diante), até um máximo de 20 códigos por sessão.
discount_codes: ['WELCOME10', 'BLACKFRIDAY20']
O campo singular discount_code abaixo está obsoleto mas ainda totalmente suportado — integrações existentes continuam funcionando sem alterações. Não pode ser combinado com discount_codes na mesma solicitação. Migre para discount_codes quando conveniente para aproveitar as vantagens da empilhamento.
Obsoleto — prefira discount_codes para novas integrações. Este campo ainda funciona para compatibilidade com versões anteriores, mas não pode ser combinado com discount_codes na mesma solicitação.
Habilite o modo de coleta mínima de endereço. Quando habilitado, o checkout coleta apenas:
País: Sempre necessário para determinação de impostos
Código Postal/CEP: Apenas em regiões onde é necessário para cálculo de imposto sobre vendas, IVA ou GST
Isso reduz significativamente o atrito no checkout eliminando campos de formulário desnecessários.
Habilite o endereço mínimo para a conclusão mais rápida do checkout. A coleta completa de endereço permanece disponível para empresas que exigem detalhes completos de cobrança.
Force a interface de checkout a renderizar em um idioma específico. Por padrão, o checkout detecta automaticamente o idioma do navegador do cliente.Códigos de idiomas suportados:ar (Árabe), ca (Catalão), de (Alemão), en (Inglês), es (Espanhol), fr (Francês), he (Hebraico), id (Indonésio), it (Italiano), ja (Japonês), ko (Coreano), ms (Malaio), nl (Holandês), pl (Polonês), pt (Português), ro (Romeno), ru (Russo), sv (Sueco), th (Tailandês), tr (Turco), zh (Chinês)Exemplo: "es" para Espanhol, "ja" para Japonês
Habilite o modo de coleta mínima de endereço. Quando habilitado, o checkout coleta apenas:
País: Sempre necessário para determinação de impostos
Código Postal/CEP: Apenas em regiões onde é necessário para cálculo de imposto sobre vendas, IVA ou GST
Isso reduz significativamente o atrito no checkout eliminando campos de formulário desnecessários.
Habilite o endereço mínimo para a conclusão mais rápida do checkout. A coleta completa de endereço permanece disponível para empresas que exigem detalhes completos de cobrança.
Pule a página de sucesso de pagamento padrão e redirecione os clientes imediatamente para seu return_url após a conclusão do pagamento.
Use isso quando você tiver uma página de sucesso personalizada que ofereça uma melhor experiência do usuário, ou para aplicativos móveis e fluxos de checkout incorporados.
Recolha informações adicionais dos clientes durante o checkout com campos de formulário personalizados. Você pode definir até 5 campos personalizados por sessão de checkout. As respostas dos clientes estão incluídas nos payloads de webhook e disponíveis via API.
Identificador único para este campo. Usado como a chave nos payloads de webhook e respostas da API.Exemplo: "company_name", "referral_source", "team_size"
Lista de opções para o tipo de campo dropdown. Necessário quando field_type é dropdown, ignorado para outros tipos.Exemplo: ["Google", "Twitter", "Friend referral", "Other"]
Respostas dos clientes aos campos personalizados estão incluídas em:
Webhooks: payment.succeeded, subscription.active, e outros payloads de eventos relevantes contêm o array custom_field_responses
Respostas da API: Objetos de pagamento e assinatura incluem custom_field_responses
Preço do produto para a cobrança inicial ao cliente. Se não especificado, o preço armazenado do produto será usado.Formato: Representado na menor denominação da moeda (por exemplo, centavos para USD). Por exemplo, para cobrar $1.00, passe 100.
Se taxas de câmbio adaptativas devem ser incluídas no preço do produto (verdadeiro) ou adicionadas por cima (falso). Ignorado se o precificação adaptativa não estiver ativado.
A substituição billing_currency só entra em vigor quando a moeda adaptativa está ativada nas configurações da sua conta. Se a moeda adaptativa estiver desativada, este parâmetro não terá efeito.
11. Usando Métodos de Pagamento Existentes para Checkout Instantâneo
Use um método de pagamento salvo do cliente para criar uma sessão de checkout que processa imediatamente, pulando a coleta de método de 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'});
Ao usar payment_method_id, confirm deve ser definido como true e um customer_id existente deve ser fornecido. O método de pagamento será validado para elegibilidade com a moeda do pagamento.
O método de pagamento deve pertencer ao cliente e ser compatível com a moeda do pagamento. Isso permite compras com um clique para clientes retornantes.
12. Links Curtos para URLs de Pagamento Mais Limpos
Gere links de pagamento curtos e compartilháveis com slugs personalizados:
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
Links curtos são perfeitos para compartilhamento por SMS, email ou redes sociais. São mais fáceis de lembrar e constroem mais confiança com o cliente do que URLs longas.
Use redirect_immediately: true quando você tem uma página de sucesso personalizada que oferece melhor experiência do usuário do que a página de sucesso padrão de pagamento. Isso é especialmente útil para aplicativos móveis e fluxos de checkout incorporados.
Quando redirect_immediately é habilitado, os clientes são redirecionados para o seu return_url imediatamente após a conclusão do pagamento, pulando a página de sucesso padrão inteiramente.
Use force_language quando você conhece o idioma preferido do seu cliente (por exemplo, a partir das configurações da conta) ou quando está direcionando mercados regionais específicos.
As respostas de campos personalizados são automaticamente incluídas nos payloads de webhook (payment.succeeded, subscription.active, etc.) e podem ser recuperadas via API. Use-as para enriquecer seu CRM, acionar fluxos de onboarding, ou personalizar a experiência do cliente.
Tipos de campo disponíveis:text, number, email, url, date, dropdown, boolean
Antes de criar uma sessão de checkout, você pode visualizar a separação de preços, incluindo impostos, descontos e totais. Isso é útil para exibir preços precisos aos clientes antes que eles prossigam para o checkout.
Anteriormente, ao criar um link de pagamento com Links Dinâmicos, você precisava fornecer o endereço de cobrança completo do cliente.Com Sessões de Checkout, isso não é mais necessário. Você pode simplesmente passar as informações que possui, e nós cuidamos do resto. Por exemplo:
Se você conhece apenas o país de cobrança do cliente, basta fornecer isso.
O fluxo de checkout coletará automaticamente os detalhes ausentes antes de levar o cliente à página de pagamento.
Por outro lado, se você já tiver todas as informações necessárias e quiser ir diretamente para a página de pagamento, pode passar o conjunto completo de dados e incluir confirm=true no corpo da sua solicitação.