메인 콘텐츠로 건너뛰기
동적 가격 책정을 사용하면 여러 제품 항목을 생성하지 않고도 제품에 대해 가변 가격을 제공할 수 있습니다. 단일 제품에서 **원하는 가격 지불(Pay What You Want, PWYW)**을 활성화하면 최소 및 최대 가격 범위를 설정한 다음 체크아웃 세션 링크를 생성할 때 동적 금액을 전달할 수 있습니다. 이 접근 방식은 다음과 같은 경우에 이상적입니다:
  • 가변 가격을 관리할 필요 없이 여러 제품을 관리하지 않음
  • 구매자가 금액을 선택하는 고객 주도 가격 책정
  • API를 통해 동적으로 금액을 설정하는 프로그래밍 방식 가격 제어
  • 디지털 제품, 기부 또는 실험적 출시를 위한 유연한 가격 모델
원하는 가격 지불은 단일 결제(일회성) 제품에만 사용할 수 있습니다. 구독 제품과 함께 사용할 수 없습니다.

작동 방식

원하는 가격 지불이 활성화되면 다음을 수행할 수 있습니다:
  1. 가격 범위 설정: 최소 가격(필수)을 정의하고 선택적으로 최대 가격을 설정합니다.
  2. 동적 금액 전달: 체크아웃 세션을 생성할 때 제품 장바구니에 amount 필드를 포함합니다.
  3. 고객이 선택하도록 허용: 금액이 제공되지 않으면 고객이 자신의 가격(귀하의 범위 내)을 입력할 수 있습니다.
제품 장바구니에 amount를 전달하면 해당 금액이 체크아웃에 사용됩니다. amount 필드를 생략하면 고객이 체크아웃 중에 자신의 가격을 선택할 수 있습니다(귀하의 최소/최대 설정에 따라).

1단계: 원하는 가격 지불이 있는 제품 생성

먼저 Dodo Payments 대시보드에서 일회성 제품을 생성하고 원하는 가격 지불 가격 책정을 활성화합니다.
1

새 제품 생성

Dodo Payments 대시보드에서 제품으로 이동하고 제품 추가를 클릭합니다.
2

제품 세부정보 구성

필수 제품 정보를 입력합니다:
  • 제품 이름: 제품의 표시 이름
  • 제품 설명: 고객이 구매하는 내용에 대한 명확한 설명
  • 제품 이미지: 이미지 업로드(PNG/JPG/WebP, 최대 3MB)
  • 세금 카테고리: 적절한 세금 카테고리 선택
3

가격 유형 설정

가격 유형단일 결제(일회성 결제)로 선택합니다.
4

원하는 가격 지불 활성화

가격 섹션에서 원하는 가격 지불 토글을 활성화합니다.
5

최소 가격 설정

고객이 지불해야 하는 최소 가격을 입력합니다. 이는 필수이며 수익 바닥을 유지하는 데 도움이 됩니다.: 최소 가격이 $5.00인 경우 5.00(또는 500 센트)을 입력합니다.
6

최대 가격 설정(선택 사항)

선택적으로 고객이 지불할 수 있는 금액을 제한하는 최대 가격을 설정합니다.
7

제안 가격 설정(선택 사항)

선택적으로 고객을 안내하기 위해 표시될 제안 가격을 입력합니다. 이는 기대치를 고정하는 데 도움이 되며 평균 주문 가치를 개선할 수 있습니다.
8

제품 저장

제품 추가를 클릭하여 저장합니다. 체크아웃 세션에서 사용할 제품 ID(예: pdt_123abc456def)를 기록해 두십시오.
대시보드의 제품세부정보 보기에서 제품 ID를 찾거나 제품 목록 API를 사용하여 찾을 수 있습니다.

2단계: 동적 가격으로 체크아웃 세션 생성

제품이 원하는 가격 지불로 구성되면 동적 금액으로 체크아웃 세션을 생성할 수 있습니다. 제품 장바구니의 amount 필드를 사용하여 각 체크아웃 세션에 대한 가격을 프로그래밍 방식으로 설정할 수 있습니다.

금액 필드 이해하기

체크아웃 세션을 생성할 때 각 제품 장바구니 항목에 amount 필드를 포함할 수 있습니다:
  • amount가 제공된 경우: 체크아웃은 이 정확한 금액을 사용합니다(귀하의 최소/최대 범위 내에 있어야 함)
  • amount가 생략된 경우: 고객은 체크아웃 중에 자신의 가격을 입력할 수 있습니다(귀하의 범위 내에서)
amount 필드는 원하는 가격 지불 제품에만 적용됩니다. 일반 제품의 경우 이 필드는 무시됩니다.

코드 예제

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'
);
금액 형식: amount 필드는 통화의 가장 낮은 단위로 되어 있어야 합니다. USD의 경우 이는 센트를 의미합니다(예: $25.00 = 2500). 다른 통화의 경우 가장 작은 단위를 사용하십시오(예: INR의 경우 파이세).

3단계: 고객이 자신의 가격 선택하기

고객이 체크아웃 중에 자신의 가격을 선택하도록 하려면 제품 장바구니에서 amount 필드를 생략하면 됩니다. 체크아웃 페이지에는 고객이 귀하의 최소 및 최대 범위 내에서 금액을 입력할 수 있는 입력 필드가 표시됩니다.
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;
  }
}

일반 사용 사례

사용 사례 1: 사용자 유형에 따른 계층 가격 책정

동일한 제품을 사용하여 서로 다른 고객 세그먼트에 서로 다른 가격을 제공합니다:
// 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'
);

사용 사례 2: 수량에 따른 동적 가격 책정

구매한 수량에 따라 가격을 조정합니다:
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;
}

사용 사례 3: 시간 기반 또는 프로모션 가격 책정

특정 기간 동안 프로모션 가격을 적용합니다:
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;
}

모범 사례

합리적인 범위 설정

비용을 충당하면서 접근 가능하도록 최소 가격을 선택하십시오. 고객의 기대치를 안내하기 위해 제안 가격을 사용하십시오.

금액 검증

체크아웃 세션을 생성하기 전에 항상 동적 금액이 제품의 최소 및 최대 범위 내에 있는지 검증하십시오.

가격 결정 추적

메타데이터를 사용하여 특정 금액이 선택된 이유를 추적합니다(예: pricing_tier, discount_code, user_segment).

엣지 케이스 처리

금액이 최대 범위를 초과하거나 최소 범위 미만인 경우 애플리케이션이 이를 우아하게 처리하도록 하십시오.

검증 및 오류 처리

항상 제품의 최소 및 최대 설정에 대해 금액을 검증하십시오:
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'
  });
}

API 참조

문제 해결

amount 필드가 무시되는 경우 다음을 확인하십시오:
  • 대시보드에서 제품에 원하는 가격 지불이 활성화되어 있습니다.
  • 제품이 단일 결제(일회성) 제품이며 구독이 아닙니다.
  • 금액이 올바른 형식(최소 통화 단위, 예: USD의 경우 센트)입니다.
API는 금액이 제품의 가격 범위를 위반하는 체크아웃 세션을 거부합니다. 체크아웃 세션을 생성하기 전에 항상 금액을 검증하거나 amount 필드를 생략하여 고객이 자신의 가격을 선택하도록 하십시오.
고객이 가격 입력 필드를 보지 못하는 경우 제품 장바구니에서 amount 필드를 생략했는지 확인하십시오. amount가 제공되면 체크아웃은 해당 정확한 금액을 사용합니다.