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.Format: Dicontohkan dalam denominasi terkecil dari mata uang (misalnya, sen untuk USD). Sebagai contoh, untuk mengenakan biaya $1.00, kirim 100.
Pengaturan ulang per-checkout-session untuk hak kredit yang sudah terlampir pada produk ini. Gunakan ini untuk memberikan jumlah kredit yang berbeda untuk sesi tunggal ini — misalnya, bundel promosi yang memberikan 1.000 kredit API daripada 500 default produk — tanpa membuat produk terpisah.
Setiap credit_entitlement_id harus sudah terlampir pada produk. Bidang ini hanya mengesampingkan credits_amount yang diberikan saat sesi ini dipenuhi; pengaturan hak kredit tingkat produk (kedaluwarsa, pembaruan, dll.) masih berlaku.
Jumlah kredit yang akan diberikan untuk sesi checkout ini, menggantikan credits_amount tingkat produk. Harus lebih besar dari nol.
Temukan ID Produk Anda: Anda dapat menemukan ID produk di dasbor Pembayaran Dodo Anda di bawah Produk → Lihat Detail, atau dengan menggunakan API Daftar Produk.
Nomor ponsel pelanggan dalam format internasional. Diperlukan untuk beberapa metode pembayaran dan pencegahan penipuan.Format: Sertakan kode negara, misalnya, "+1234567890" untuk nomor AS
Kode negara ISO dua huruf (ISO 3166-1 alpha-2). Bidang ini selalu diperlukan saat alamat penagihan diberikan.Contoh: "US" (Amerika Serikat), "CA" (Kanada), "GB" (Inggris), "DE" (Jerman)
Country Code Reference
Lihat daftar lengkap negara yang didukung dan kode ISO mereka
Kontrol metode pembayaran mana yang tersedia untuk pelanggan selama checkout. Ini membantu memaksimalkan pasar atau persyaratan bisnis tertentu.Opsi yang Tersedia: credit, debit, upi_collect, apple_pay, google_pay, amazon_pay, klarna, affirm, afterpay_clearpay, cashapp, multibanco, bancontact_card, eps, ideal, przelewy24, paypal, sunbit
Kritis: Selalu sertakan credit dan debit sebagai opsi cadangan untuk mencegah kegagalan checkout saat metode pembayaran yang diinginkan tidak tersedia.
Ganti pilihan mata uang default dengan mata uang penagihan tetap. Gunakan kode mata uang ISO 4217.Mata uang yang Didukung: USD, EUR, GBP, CAD, AUD, INR, dan lainnyaContoh: "USD" untuk Dolar AS, "EUR" untuk Euro
Bidang ini hanya efektif saat harga adaptif diaktifkan. Jika harga adaptif dinonaktifkan, mata uang default produk akan digunakan.
URL untuk mengarahkan pelanggan setelah menyelesaikan pembayaran. Aplikasi Dodo Payments menambahkan parameter kueri berikut ke URL Anda pada pengalihan:
Parameter
Tipe
Kondisi
payment_id
string
Selalu ada untuk pembayaran satu kali
subscription_id
string
Selalu ada untuk pembayaran berlangganan
status
string
Selalu ada
license_key
string
Ada jika produk memiliki kunci lisensi diaktifkan. Dipisahkan dengan koma jika ada beberapa kunci
email
string
Ada jika pelanggan memiliki email dalam catatan
Contoh URL redirect:
# 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
Gunakan parameter kueri license_key dan email untuk menampilkan kunci lisensi atau mengirim konfirmasi segera pada halaman kembali Anda, tanpa perlu panggilan API tambahan.
URL untuk mengarahkan pelanggan ketika mereka mengklik tombol kembali atau membatalkan sesi checkout. Jika tidak disediakan, tombol kembali tidak akan ditampilkan.
Setel cancel_url untuk memberikan cara yang jelas bagi pelanggan untuk kembali ke situs Anda tanpa menyelesaikan pembelian. Ini meningkatkan pengalaman checkout dan mengurangi gesekan.
Terapkan satu atau lebih kode diskon bertumpuk ke sesi checkout. Kode diterapkan dalam urutan array (kode pertama mengurangi harga dasar, kode kedua mengurangi harga yang sudah diskon, dan seterusnya), maksimal 20 kode per sesi.
discount_codes: ['WELCOME10', 'BLACKFRIDAY20']
Bidang singular discount_code di bawah ini ditinggalkan tetapi masih sepenuhnya didukung — integrasi yang ada tetap berfungsi tanpa perubahan. Ini tidak dapat digabungkan dengan discount_codes dalam permintaan yang sama. Beralihlah ke discount_codes bila nyaman untuk memanfaatkan pengurutan.
Ditinggalkan — prefer discount_codes untuk integrasi baru. Bidang ini masih berfungsi untuk kompatibilitas mundur, tetapi tidak dapat digabungkan dengan discount_codes dalam permintaan yang sama.
Aktifkan mode pengumpulan alamat minimal. Saat diaktifkan, checkout hanya mengumpulkan:
Negara: Selalu diperlukan untuk penentuan pajak
Kode pos/Kode pos: Hanya di wilayah di mana ini diperlukan untuk penghitungan pajak penjualan, PPN, atau GST
Ini secara signifikan mengurangi gesekan checkout dengan menghilangkan bidang formulir yang tidak diperlukan.
Aktifkan alamat minimal untuk penyelesaian checkout yang lebih cepat. Pengumpulan alamat lengkap tetap tersedia untuk bisnis yang memerlukan detail penagihan lengkap.
Paksa antarmuka checkout untuk dirender dalam bahasa tertentu. Secara default, checkout mendeteksi bahasa browser pelanggan.Kode bahasa yang didukung:ar (Arab), ca (Katalan), de (Jerman), en (Inggris), es (Spanyol), fr (Prancis), he (Ibrani), id (Indonesia), it (Italia), ja (Jepang), ko (Korea), ms (Melayu), nl (Belanda), pl (Polandia), pt (Portugis), ro (Rumania), ru (Rusia), sv (Swedia), th (Thailand), tr (Turki), zh (Cina)Contoh: "es" untuk bahasa Spanyol, "ja" untuk bahasa Jepang
Aktifkan mode pengumpulan alamat minimal. Saat diaktifkan, checkout hanya mengumpulkan:
Negara: Selalu diperlukan untuk penentuan pajak
Kode pos/Kode pos: Hanya di wilayah di mana ini diperlukan untuk penghitungan pajak penjualan, PPN, atau GST
Ini secara signifikan mengurangi gesekan checkout dengan menghilangkan bidang formulir yang tidak diperlukan.
Aktifkan alamat minimal untuk penyelesaian checkout yang lebih cepat. Pengumpulan alamat lengkap tetap tersedia untuk bisnis yang memerlukan detail penagihan lengkap.
Lewati halaman sukses pembayaran default dan langsung arahkan pelanggan ke return_url Anda setelah penyelesaian pembayaran.
Gunakan ini ketika Anda memiliki halaman sukses kustom yang menyediakan pengalaman pengguna yang lebih baik, atau untuk aplikasi seluler dan alur checkout tersemat.
Kumpulkan informasi tambahan dari pelanggan selama checkout dengan bidang formulir kustom. Anda dapat mendefinisikan hingga 5 bidang kustom per sesi checkout. Tanggapan pelanggan disertakan dalam payload webhook dan tersedia melalui API.
Daftar opsi untuk tipe bidang dropdown. Diperlukan bila field_type adalah dropdown, diabaikan untuk jenis lain.Contoh: ["Google", "Twitter", "Friend referral", "Other"]
Tanggapan pelanggan terhadap bidang kustom disertakan dalam:
Webhook: payment.succeeded, subscription.active, dan payload acara terkait lainnya mengandung array custom_field_responses
Respon API: Objek pembayaran dan langganan menyertakan custom_field_responses
Harga produk untuk biaya awal kepada pelanggan. Jika tidak ditentukan, harga yang tersimpan dari produk akan digunakan.Format: Dicontohkan dalam denominasi terkecil dari mata uang (misalnya, sen untuk USD). Misalnya, untuk mengenakan biaya $1.00, kirim 100.
Apakah biaya mata uang adaptif harus termasuk dalam harga produk (benar) atau ditambahkan di atasnya (salah). Diabaikan jika harga adaptif tidak diaktifkan.
billing_currency penggantian hanya berfungsi ketika mata uang adaptif diaktifkan dalam pengaturan akun Anda. Jika mata uang adaptif dinonaktifkan, parameter ini tidak akan berpengaruh.
11. Menggunakan Metode Pembayaran yang Ada untuk Checkout Instan
Gunakan metode pembayaran yang tersimpan pelanggan untuk membuat sesi checkout yang diproses segera, melewati pengumpulan metode pembayaran:
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'});
Saat menggunakan payment_method_id, confirm harus diatur ke true dan customer_id yang sudah ada harus diberikan. Metode pembayaran akan divalidasi untuk kelayakan dengan mata uang pembayaran.
Metode pembayaran harus dimiliki oleh pelanggan dan kompatibel dengan mata uang pembayaran. Ini memungkinkan pembelian satu klik untuk pelanggan yang kembali.
12. Tautan Pendek untuk URL Pembayaran yang Lebih Bersih
Hasilkan tautan pembayaran yang dipersingkat, dapat dibagikan dengan slug kustom:
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
Tautan pendek sempurna untuk SMS, email, atau berbagi media sosial. Mereka lebih mudah diingat dan membangun lebih banyak kepercayaan pelanggan daripada URL panjang.
Gunakan redirect_immediately: true saat Anda memiliki halaman sukses kustom yang menyediakan pengalaman pengguna yang lebih baik daripada halaman sukses pembayaran default. Ini sangat berguna untuk aplikasi seluler dan alur checkout tersemat.
Saat redirect_immediately diaktifkan, pelanggan diarahkan ke return_url Anda segera setelah penyelesaian pembayaran, melewati halaman sukses default sepenuhnya.
Gunakan force_language ketika Anda mengetahui bahasa pilihan pelanggan Anda (misalnya, dari pengaturan akun mereka) atau saat menargetkan pasar regional tertentu.
Bahasa yang didukung: Arab (ar), Katalan (ca), Cina (zh), Belanda (nl), Inggris (en), Prancis (fr), Jerman (de), Ibrani (he), Indonesia (id), Italia (it), Jepang (ja), Korea (ko), Melayu (ms), Polandia (pl), Portugis (pt), Rumania (ro), Rusia (ru), Spanyol (es), Swedia (sv), Thailand (th), Turki (tr)
Respon bidang kustom secara otomatis disertakan dalam payload webhook (payment.succeeded, subscription.active, dll.) dan dapat diambil melalui API. Gunakan untuk memperkaya CRM Anda, memicu alur onboarding, atau menyesuaikan pengalaman pelanggan.
Jenis bidang yang tersedia:text, number, email, url, date, dropdown, boolean
Sebelum membuat sesi checkout, Anda dapat mempratinjau rincian harga termasuk pajak, diskon, dan total. Ini berguna untuk menampilkan harga yang akurat kepada pelanggan sebelum mereka melanjutkan ke checkout.
Sebelumnya, saat membuat tautan pembayaran dengan Tautan Dinamis, Anda diharuskan memberikan alamat penagihan lengkap pelanggan.Dengan Sesi Checkout, ini tidak lagi diperlukan. Anda cukup mengirimkan informasi apa pun yang Anda miliki, dan kami akan menangani sisanya. Misalnya:
Jika Anda hanya mengetahui negara penagihan pelanggan, cukup berikan itu.
Alur checkout akan secara otomatis mengumpulkan detail yang hilang sebelum memindahkan pelanggan ke halaman pembayaran.
Di sisi lain, jika Anda sudah memiliki semua informasi yang diperlukan dan ingin langsung ke halaman pembayaran, Anda dapat mengirimkan set data lengkap dan menyertakan confirm=true dalam badan permintaan Anda.