Passer au contenu principal
Le prix dynamique vous permet d’offrir des prix variables pour vos produits sans créer plusieurs entrées de produit. En activant Pay What You Want (PWYW) sur un seul produit, vous pouvez définir des limites de prix minimum et maximum, puis passer des montants dynamiques lors de la création de liens de session de caisse. Cette approche est idéale lorsque vous avez besoin de :
  • Prix variables sans gérer plusieurs produits
  • Prix déterminé par le client où les acheteurs choisissent leur montant
  • Contrôle de prix programmatique où vous définissez le montant dynamiquement via l’API
  • Modèles de prix flexibles pour des produits numériques, des dons ou des lancements expérimentaux
Pay What You Want n’est disponible que pour les produits Paiement Unique (paiement unique). Il ne peut pas être utilisé avec des produits d’abonnement.

Comment ça fonctionne

Avec Pay What You Want activé, vous pouvez :
  1. Définir des limites de prix : Définissez un prix minimum (obligatoire) et éventuellement un prix maximum
  2. Passer des montants dynamiques : Incluez un amount dans le panier de produits lors de la création de sessions de caisse
  3. Laisser les clients choisir : Si aucun montant n’est fourni, les clients peuvent entrer leur propre prix (dans vos limites)
Lorsque vous passez un amount dans le panier de produits, ce montant est utilisé pour la caisse. Si vous omettez le champ amount, les clients peuvent sélectionner leur propre prix lors de la caisse (sous réserve de vos paramètres minimum/maximum).

Étape 1 : Créer un produit avec Pay What You Want

Tout d’abord, créez un produit unique dans votre tableau de bord Dodo Payments et activez le prix Pay What You Want.
1

Créer un nouveau produit

Accédez à Produits dans votre tableau de bord Dodo Payments et cliquez sur Ajouter un produit.
2

Configurer les détails du produit

Remplissez les informations requises sur le produit :
  • Nom du produit : Nom affiché pour votre produit
  • Description du produit : Description claire de ce que les clients achètent
  • Image du produit : Téléchargez une image (PNG/JPG/WebP, jusqu’à 3 Mo)
  • Catégorie fiscale : Sélectionnez la catégorie fiscale appropriée
3

Définir le type de prix

Sélectionnez Type de prix comme Paiement Unique (paiement unique).
4

Activer Pay What You Want

Dans la section Prix, activez le bouton bascule Pay What You Want.
5

Définir le prix minimum

Entrez le Prix minimum que les clients doivent payer. Cela est requis et garantit que vous maintenez un plancher de revenus.Exemple : Si votre minimum est de 5,00 $, entrez 5.00 (ou 500 cents).
6

Définir le prix maximum (facultatif)

Optionnellement, définissez un Prix maximum pour limiter le montant que les clients peuvent payer.
7

Définir le prix suggéré (facultatif)

Optionnellement, entrez un Prix suggéré qui sera affiché pour guider les clients. Cela aide à ancrer les attentes et peut améliorer la valeur moyenne des commandes.
8

Enregistrer le produit

Cliquez sur Ajouter un produit pour enregistrer. Notez votre ID de produit (par exemple, pdt_123abc456def) pour une utilisation dans les sessions de caisse.
Vous pouvez trouver votre ID de produit dans le tableau de bord sous ProduitsVoir les détails, ou en utilisant l’API Liste des Produits.

Étape 2 : Créer des sessions de caisse avec des prix dynamiques

Une fois votre produit configuré avec Pay What You Want, vous pouvez créer des sessions de caisse avec des montants dynamiques. Le champ amount dans le panier de produits vous permet de définir le prix de manière programmatique pour chaque session de caisse.

Comprendre le champ Montant

Lors de la création d’une session de caisse, vous pouvez inclure un champ amount dans chaque élément du panier de produits :
  • Si amount est fourni : La caisse utilise ce montant exact (doit être dans vos limites minimum/maximum)
  • Si amount est omis : Les clients peuvent entrer leur propre prix lors de la caisse (dans vos limites)
Le champ amount n’est applicable que pour les produits Pay What You Want. Pour les produits réguliers, ce champ est ignoré.

Exemples de Code

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 du Montant : Le champ amount doit être dans la plus petite dénomination de la devise. Pour USD, cela signifie des cents (par exemple, 25,00 $ = 2500). Pour d’autres devises, utilisez la plus petite unité (par exemple, paise pour INR).

Étape 3 : Laisser les clients choisir leur prix

Si vous souhaitez que les clients sélectionnent leur propre prix lors de la caisse, omettez simplement le champ amount du panier de produits. La page de caisse affichera un champ de saisie où les clients peuvent entrer n’importe quel montant dans vos limites minimum et maximum.
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;
  }
}

Cas d’utilisation courants

Cas d’utilisation 1 : Tarification par paliers en fonction du type d’utilisateur

Offrez des prix différents à différents segments de clients en utilisant le même produit :
// 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'
);

Cas d’utilisation 2 : Tarification dynamique en fonction de la quantité

Ajustez le prix en fonction de la quantité achetée :
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;
}

Cas d’utilisation 3 : Tarification basée sur le temps ou promotionnelle

Appliquez une tarification promotionnelle pendant des périodes spécifiques :
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;
}

Meilleures pratiques

Définir des limites raisonnables

Choisissez un prix minimum qui couvre vos coûts tout en restant accessible. Utilisez un prix suggéré pour guider les attentes des clients.

Valider les montants

Validez toujours que les montants dynamiques se situent dans les limites minimum et maximum de votre produit avant de créer des sessions de caisse.

Suivre les décisions de prix

Utilisez des métadonnées pour suivre pourquoi des montants spécifiques ont été choisis (par exemple, pricing_tier, discount_code, user_segment).

Gérer les cas particuliers

Assurez-vous que votre application gère les cas où les montants dépassent les limites maximales ou tombent en dessous des minimums de manière élégante.

Validation et gestion des erreurs

Validez toujours les montants par rapport aux paramètres minimum et maximum de votre produit :
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'
  });
}

Référence API

Dépannage

Si votre champ amount est ignoré, vérifiez que :
  • Le produit a Pay What You Want activé dans le tableau de bord
  • Le produit est un produit Paiement Unique (paiement unique), pas un abonnement
  • Le montant est au format correct (plus petite dénomination de la devise, par exemple, cents pour USD)
L’API rejettera les sessions de caisse où le montant viole les limites de prix de votre produit. Validez toujours les montants avant de créer des sessions de caisse, ou laissez les clients choisir leur prix en omettant le champ amount.
Si les clients ne voient pas le champ de saisie du prix, assurez-vous que vous avez omis le champ amount du panier de produits. Lorsque amount est fourni, la caisse utilise ce montant exact.