Pular para o conteúdo principal
Preços dinâmicos permitem que você ofereça preços variáveis para seus produtos sem criar várias entradas de produtos. Ao ativar Pague o Que Quiser (PWYW) em um único produto, você pode definir limites de preço mínimo e máximo e, em seguida, passar valores dinâmicos ao criar links de sessão de checkout. Essa abordagem é ideal quando você precisa:
  • Preços variáveis sem gerenciar vários produtos
  • Preços impulsionados pelo cliente onde os compradores escolhem seu valor
  • Controle de preço programático onde você define o valor dinamicamente via API
  • Modelos de preços flexíveis para produtos digitais, doações ou lançamentos experimentais
Pague o Que Quiser está disponível apenas para produtos de Pagamento Único (pagamento único). Não pode ser usado com produtos de assinatura.

Como Funciona

Com Pague o Que Quiser ativado, você pode:
  1. Definir limites de preço: Defina um preço mínimo (obrigatório) e opcionalmente um preço máximo
  2. Passar valores dinâmicos: Inclua um campo amount no carrinho do produto ao criar sessões de checkout
  3. Deixar os clientes escolherem: Se nenhum valor for fornecido, os clientes podem inserir seu próprio preço (dentro dos seus limites)
Quando você passa um amount no carrinho do produto, esse valor é usado para o checkout. Se você omitir o campo amount, os clientes podem selecionar seu próprio preço durante o checkout (sujeito às suas configurações de mínimo/máximo).

Passo 1: Criar um Produto com Pague o Que Quiser

Primeiro, crie um produto de pagamento único no seu painel do Dodo Payments e ative a precificação Pague o Que Quiser.
1

Criar um novo produto

Navegue até Produtos no seu painel do Dodo Payments e clique em Adicionar Produto.
2

Configurar detalhes do produto

Preencha as informações obrigatórias do produto:
  • Nome do Produto: Nome exibido para seu produto
  • Descrição do Produto: Descrição clara do que os clientes estão comprando
  • Imagem do Produto: Faça upload de uma imagem (PNG/JPG/WebP, até 3 MB)
  • Categoria de Imposto: Selecione a categoria de imposto apropriada
3

Definir tipo de preço

Selecione Tipo de Preço como Pagamento Único (pagamento único).
4

Ativar Pague o Que Quiser

Na seção Preços, ative o botão de alternância Pague o Que Quiser.
5

Definir preço mínimo

Insira o Preço Mínimo que os clientes devem pagar. Isso é obrigatório e garante que você mantenha um piso de receita.Exemplo: Se seu mínimo é R$5,00, insira 5.00 (ou 500 centavos).
6

Definir preço máximo (opcional)

Opcionalmente, defina um Preço Máximo para limitar o valor que os clientes podem pagar.
7

Definir preço sugerido (opcional)

Opcionalmente, insira um Preço Sugerido que será exibido para guiar os clientes. Isso ajuda a ancorar expectativas e pode melhorar o valor médio do pedido.
8

Salvar o produto

Clique em Adicionar Produto para salvar. Anote o ID do seu produto (por exemplo, pdt_123abc456def) para uso em sessões de checkout.
Você pode encontrar o ID do seu produto no painel em ProdutosVer Detalhes, ou usando a API List Products.

Passo 2: Criar Sessões de Checkout com Preços Dinâmicos

Uma vez que seu produto esteja configurado com Pague o Que Quiser, você pode criar sessões de checkout com valores dinâmicos. O campo amount no carrinho do produto permite que você defina o preço programaticamente para cada sessão de checkout.

Entendendo o Campo de Valor

Ao criar uma sessão de checkout, você pode incluir um campo amount em cada item do carrinho do produto:
  • Se amount for fornecido: O checkout usa esse valor exato (deve estar dentro dos seus limites de mínimo/máximo)
  • Se amount for omitido: Os clientes podem inserir seu próprio preço durante o checkout (dentro dos seus limites)
O campo amount é aplicável apenas para produtos Pague o Que Quiser. Para produtos regulares, esse campo é ignorado.

Exemplos de Código

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'
);
Formato do Valor: O campo amount deve estar na menor denominação da moeda. Para USD, isso significa centavos (por exemplo, R$25,00 = 2500). Para outras moedas, use a menor unidade (por exemplo, paise para INR).

Passo 3: Deixar os Clientes Escolherem Seu Preço

Se você quiser que os clientes selecionem seu próprio preço durante o checkout, simplesmente omita o campo amount do carrinho do produto. A página de checkout exibirá um campo de entrada onde os clientes podem inserir qualquer valor dentro dos seus limites mínimo e máximo.
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;
  }
}

Casos de Uso Comuns

Caso de Uso 1: Preços em Camadas com Base no Tipo de Usuário

Ofereça preços diferentes para diferentes segmentos de clientes usando o mesmo produto:
// 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'
);

Caso de Uso 2: Preços Dinâmicos com Base na Quantidade

Ajuste o preço com base na quantidade comprada:
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;
}

Caso de Uso 3: Preços Baseados em Tempo ou Promoções

Aplique preços promocionais durante períodos específicos:
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;
}

Melhores Práticas

Defina Limites Razoáveis

Escolha um preço mínimo que cubra seus custos enquanto permanece acessível. Use um preço sugerido para guiar as expectativas dos clientes.

Valide os Valores

Sempre valide se os valores dinâmicos estão dentro dos limites mínimo e máximo do seu produto antes de criar sessões de checkout.

Rastreie Decisões de Preço

Use metadados para rastrear por que valores específicos foram escolhidos (por exemplo, pricing_tier, discount_code, user_segment).

Lide com Casos Limite

Certifique-se de que sua aplicação lida com casos em que os valores excedem os limites máximos ou ficam abaixo dos mínimos de forma adequada.

Validação e Tratamento de Erros

Sempre valide os valores em relação às configurações mínimas e máximas do seu produto:
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'
  });
}

Referência da API

Solução de Problemas

Se seu campo amount está sendo ignorado, verifique se:
  • O produto tem Pague o Que Quiser ativado no painel
  • O produto é um produto de Pagamento Único (pagamento único), não uma assinatura
  • O valor está no formato correto (menor denominação da moeda, por exemplo, centavos para USD)
A API rejeitará sessões de checkout onde o valor viola os limites de preço do seu produto. Sempre valide os valores antes de criar sessões de checkout, ou deixe os clientes escolherem seu preço omitindo o campo amount.
Se os clientes não estão vendo o campo de entrada de preço, certifique-se de que você omitiu o campo amount do carrinho do produto. Quando amount é fornecido, o checkout usa esse valor exato.