Langsung ke konten utama
Harga dinamis memungkinkan Anda menawarkan harga variabel untuk produk Anda tanpa membuat beberapa entri produk. Dengan mengaktifkan Bayar Sesuai Keinginan Anda (PWYW) pada satu produk, Anda dapat menetapkan batas harga minimum dan maksimum, kemudian mengirimkan jumlah dinamis saat membuat tautan sesi checkout. Pendekatan ini ideal ketika Anda membutuhkan:
  • Harga variabel tanpa mengelola beberapa produk
  • Harga yang ditentukan pelanggan di mana pembeli memilih jumlah mereka
  • Kontrol harga programatis di mana Anda menetapkan jumlah secara dinamis melalui API
  • Model harga fleksibel untuk produk digital, donasi, atau peluncuran eksperimental
Bayar Sesuai Keinginan Anda hanya tersedia untuk produk Pembayaran Tunggal (sekali bayar). Ini tidak dapat digunakan dengan produk langganan.

Cara Kerjanya

Dengan Bayar Sesuai Keinginan Anda diaktifkan, Anda dapat:
  1. Tetapkan batas harga: Tentukan harga minimum (diperlukan) dan opsional harga maksimum
  2. Kirim jumlah dinamis: Sertakan field amount di keranjang produk saat membuat sesi checkout
  3. Biarkan pelanggan memilih: Jika tidak ada jumlah yang diberikan, pelanggan dapat memasukkan harga mereka sendiri (dalam batas Anda)
Ketika Anda mengirimkan amount di keranjang produk, jumlah tersebut digunakan untuk checkout. Jika Anda mengabaikan field amount, pelanggan dapat memilih harga mereka sendiri selama checkout (tergantung pada pengaturan minimum/maksimum Anda).

Langkah 1: Buat Produk dengan Bayar Sesuai Keinginan Anda

Pertama, buat produk sekali bayar di dasbor Dodo Payments Anda dan aktifkan harga Bayar Sesuai Keinginan Anda.
1

Buat produk baru

Navigasikan ke Produk di dasbor Dodo Payments Anda dan klik Tambah Produk.
2

Konfigurasi detail produk

Isi informasi produk yang diperlukan:
  • Nama Produk: Nama tampilan untuk produk Anda
  • Deskripsi Produk: Deskripsi jelas tentang apa yang dibeli pelanggan
  • Gambar Produk: Unggah gambar (PNG/JPG/WebP, hingga 3 MB)
  • Kategori Pajak: Pilih kategori pajak yang sesuai
3

Tetapkan jenis harga

Pilih Jenis Harga sebagai Pembayaran Tunggal (pembayaran sekali).
4

Aktifkan Bayar Sesuai Keinginan Anda

Di bagian Harga, aktifkan toggle Bayar Sesuai Keinginan Anda.
5

Tetapkan harga minimum

Masukkan Harga Minimum yang harus dibayar pelanggan. Ini diperlukan dan memastikan Anda mempertahankan batas pendapatan.Contoh: Jika minimum Anda adalah $5.00, masukkan 5.00 (atau 500 sen).
6

Tetapkan harga maksimum (opsional)

Opsional, tetapkan Harga Maksimum untuk membatasi jumlah yang dapat dibayar pelanggan.
7

Tetapkan harga yang disarankan (opsional)

Opsional, masukkan Harga yang Disarankan yang akan ditampilkan untuk membimbing pelanggan. Ini membantu mengatur ekspektasi dan dapat meningkatkan nilai pesanan rata-rata.
8

Simpan produk

Klik Tambah Produk untuk menyimpan. Catat ID produk Anda (misalnya, pdt_123abc456def) untuk digunakan dalam sesi checkout.
Anda dapat menemukan ID produk Anda di dasbor di bawah ProdukLihat Detail, atau dengan menggunakan API Daftar Produk.

Langkah 2: Buat Sesi Checkout dengan Harga Dinamis

Setelah produk Anda dikonfigurasi dengan Bayar Sesuai Keinginan Anda, Anda dapat membuat sesi checkout dengan jumlah dinamis. Field amount di keranjang produk memungkinkan Anda menetapkan harga secara programatis untuk setiap sesi checkout.

Memahami Field Jumlah

Saat membuat sesi checkout, Anda dapat menyertakan field amount di setiap item keranjang produk:
  • Jika amount disediakan: Checkout menggunakan jumlah ini secara tepat (harus dalam batas minimum/maksimum Anda)
  • Jika amount diabaikan: Pelanggan dapat memasukkan harga mereka sendiri selama checkout (dalam batas Anda)
Field amount hanya berlaku untuk produk Bayar Sesuai Keinginan Anda. Untuk produk reguler, field ini diabaikan.

Contoh Kode

import DodoPayments from 'dodopayments';

// Initialize the Dodo Payments client
const client = new DodoPayments({
  bearerToken: process.env.DODO_PAYMENTS_API_KEY,
});

async function createDynamicPricingCheckout(
  productId: string,
  amountInCents: number,
  returnUrl: string
) {
  try {
    const session = await client.checkoutSessions.create({
      product_cart: [
        {
          product_id: productId,
          quantity: 1,
          // Dynamic amount in cents (e.g., 1500 = $15.00)
          amount: amountInCents
        }
      ],
      return_url: returnUrl,
      // Optional: Pre-fill customer information
      customer: {
        email: '[email protected]',
        name: 'John Doe'
      },
      // Optional: Add metadata for tracking
      metadata: {
        order_id: 'order_123',
        pricing_tier: 'custom'
      }
    });

    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: Create checkout with $25.00 (2500 cents)
const session = await createDynamicPricingCheckout(
  'prod_123abc456def',
  2500, // $25.00 in cents
  'https://yoursite.com/checkout/success'
);

// Example: Create checkout with $10.00 (1000 cents)
const session2 = await createDynamicPricingCheckout(
  'prod_123abc456def',
  1000, // $10.00 in cents
  'https://yoursite.com/checkout/success'
);
Format Jumlah: Field amount harus dalam denominasi terendah dari mata uang. Untuk USD, ini berarti sen (misalnya, $25.00 = 2500). Untuk mata uang lain, gunakan unit terkecil (misalnya, paise untuk INR).

Langkah 3: Biarkan Pelanggan Memilih Harga Mereka

Jika Anda ingin pelanggan memilih harga mereka sendiri selama checkout, cukup abaikan field amount dari keranjang produk. Halaman checkout akan menampilkan field input di mana pelanggan dapat memasukkan jumlah apa pun dalam batas minimum dan maksimum Anda.
async function createCustomerChoiceCheckout(
  productId: string,
  returnUrl: string
) {
  try {
    const session = await client.checkoutSessions.create({
      product_cart: [
        {
          product_id: productId,
          quantity: 1
          // No amount field - customer will choose their price
        }
      ],
      return_url: returnUrl,
      customer: {
        email: '[email protected]',
        name: 'John Doe'
      }
    });

    return session;
  } catch (error) {
    console.error('Failed to create checkout session:', error);
    throw error;
  }
}

Kasus Penggunaan Umum

Kasus Penggunaan 1: Harga Bertingkat Berdasarkan Tipe Pengguna

Tawarkan harga yang berbeda untuk segmen pelanggan yang berbeda menggunakan produk yang sama:
// Student discount: $10.00
const studentSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  1000, // $10.00
  'https://yoursite.com/success'
);

// Regular price: $25.00
const regularSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  2500, // $25.00
  'https://yoursite.com/success'
);

// Premium price: $50.00
const premiumSession = await createDynamicPricingCheckout(
  'prod_123abc456def',
  5000, // $50.00
  'https://yoursite.com/success'
);

Kasus Penggunaan 2: Harga Dinamis Berdasarkan Jumlah

Sesuaikan harga berdasarkan jumlah yang dibeli:
async function createQuantityBasedCheckout(
  productId: string,
  quantity: number
) {
  // Base price: $20.00 per unit
  // Discount: 10% for 2+ items, 20% for 5+ items
  const basePrice = 2000; // $20.00 in cents
  let discount = 0;
  
  if (quantity >= 5) {
    discount = 0.20; // 20% off
  } else if (quantity >= 2) {
    discount = 0.10; // 10% off
  }
  
  const totalAmount = Math.round(basePrice * quantity * (1 - discount));
  
  const session = await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: quantity,
        amount: totalAmount
      }
    ],
    return_url: 'https://yoursite.com/success'
  });
  
  return session;
}

Kasus Penggunaan 3: Harga Berdasarkan Waktu atau Promosi

Terapkan harga promosi selama periode tertentu:
async function createPromotionalCheckout(productId: string) {
  const isPromoActive = checkIfPromotionActive(); // Your logic
  const regularPrice = 3000; // $30.00
  const promoPrice = 2000; // $20.00
  
  const amount = isPromoActive ? promoPrice : regularPrice;
  
  const session = await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: 1,
        amount: amount
      }
    ],
    return_url: 'https://yoursite.com/success',
    metadata: {
      pricing_type: isPromoActive ? 'promotional' : 'regular'
    }
  });
  
  return session;
}

Praktik Terbaik

Tetapkan Batas yang Wajar

Pilih harga minimum yang menutupi biaya Anda sambil tetap dapat diakses. Gunakan harga yang disarankan untuk membimbing ekspektasi pelanggan.

Validasi Jumlah

Selalu validasi bahwa jumlah dinamis berada dalam batas minimum dan maksimum produk Anda sebelum membuat sesi checkout.

Lacak Keputusan Harga

Gunakan metadata untuk melacak mengapa jumlah tertentu dipilih (misalnya, pricing_tier, discount_code, user_segment).

Tangani Kasus Tepi

Pastikan aplikasi Anda menangani kasus di mana jumlah melebihi batas maksimum atau jatuh di bawah minimum dengan baik.

Validasi dan Penanganan Kesalahan

Selalu validasi jumlah terhadap pengaturan minimum dan maksimum produk Anda:
async function createValidatedCheckout(
  productId: string,
  amountInCents: number,
  minAmount: number,
  maxAmount: number | null
) {
  // Validate minimum
  if (amountInCents < minAmount) {
    throw new Error(
      `Amount ${amountInCents} is below minimum ${minAmount}`
    );
  }
  
  // Validate maximum (if set)
  if (maxAmount !== null && amountInCents > maxAmount) {
    throw new Error(
      `Amount ${amountInCents} exceeds maximum ${maxAmount}`
    );
  }
  
  // Create checkout session
  return await client.checkoutSessions.create({
    product_cart: [
      {
        product_id: productId,
        quantity: 1,
        amount: amountInCents
      }
    ],
    return_url: 'https://yoursite.com/success'
  });
}

Referensi API

Pemecahan Masalah

Jika field amount Anda diabaikan, verifikasi bahwa:
  • Produk memiliki Bayar Sesuai Keinginan Anda diaktifkan di dasbor
  • Produk adalah produk Pembayaran Tunggal (sekali bayar), bukan langganan
  • Jumlah dalam format yang benar (denominasi mata uang terendah, misalnya, sen untuk USD)
API akan menolak sesi checkout di mana jumlah melanggar batas harga produk Anda. Selalu validasi jumlah sebelum membuat sesi checkout, atau biarkan pelanggan memilih harga mereka dengan mengabaikan field amount.
Jika pelanggan tidak melihat field input harga, pastikan Anda telah mengabaikan field amount dari keranjang produk. Ketika amount disediakan, checkout menggunakan jumlah tersebut secara tepat.