Skip to main content

Visão Geral

A integração com Stripe cria conversões automaticamente quando um pagamento é aprovado no Stripe. Você não precisa chamar trackConversion() manualmente - tudo é feito via webhook.
Pré-requisito: A SDK JavaScript deve estar instalada no seu site! Ela é responsável por salvar o cookie com o código do afiliado. Esta integração Stripe é complementar à SDK.
Quando usar:
  • Você usa Stripe para processar pagamentos
  • Quer automação total de conversões
  • Processa assinaturas recorrentes ou pagamentos únicos
  • Já tem a SDK instalada

Como Funciona

  1. SDK salva cookie: Cliente acessa com ?ref=CODIGO, SDK salva no cookie
  2. Metadata no checkout: Seu backend lê o cookie e passa para o Stripe
  3. Cliente finaliza compra no Stripe
  4. Stripe aprova o pagamento
  5. Stripe envia webhook com o código do afiliado
  6. Conversão é criada automaticamente
Papel da SDK: Ela salva o código do afiliado em um cookie que dura 30 dias. Seu backend lê esse cookie e passa para o Stripe via metadata.

Configuração

Passo 1: Ative a Integração no Dashboard

  1. Vá em “Configurações”“Integrações”
  2. Encontre o card do Stripe
  3. Clique em “Ativar”
  4. Anote a URL do Webhook (você vai precisar)
A URL será algo como:
https://api.affiliatus.io/api/campaigns/{SEU_ID}/stripe/webhook

Passo 2: Crie o Webhook no Stripe

  1. Acesse o Dashboard do Stripe
  2. Clique em “Add endpoint”
  3. Cole a URL do webhook copiada no passo anterior
  4. Em “Events to send”, selecione:
    • checkout.session.completed
    • payment_intent.succeeded (opcional, para redundância)
  5. Clique em “Add endpoint”
  6. Copie o Signing Secret (começa com whsec_...)
Guarde o Signing Secret em local seguro! Ele é necessário para validar os webhooks.

Passo 3: Configure o Signing Secret

  1. Volte para o dashboard do Affiliatus
  2. Em “Configurações”“Integrações”Stripe
  3. Cole o Signing Secret no campo correspondente
  4. Clique em “Salvar”
O Signing Secret garante que apenas webhooks legítimos do Stripe sejam aceitos.

Enviando Código do Afiliado

Existem 2 formas de informar ao Stripe qual afiliado trouxe a venda:

Método 1: Via Metadata (Recomendado)

Adicione o código do afiliado no metadata da sessão de checkout:
const session = await stripe.checkout.sessions.create({
  payment_method_types: ["card"],
  line_items: [
    {
      price: "price_1234567890",
      quantity: 1,
    },
  ],
  mode: "subscription", // ou 'payment'
  success_url: "https://seusite.com/sucesso",
  cancel_url: "https://seusite.com/cancelado",

  metadata: {
    affiliate_code: "JOAO1", // <- Código do afiliado
  },
});
O código pode vir de um cookie, query string (?ref=JOAO1) ou campo no formulário.

Método 2: Via Cupom de Desconto

Se o afiliado tem um cupom exclusivo no Stripe:
const session = await stripe.checkout.sessions.create({
  payment_method_types: ["card"],
  line_items: [
    {
      price: "price_1234567890",
      quantity: 1,
    },
  ],
  mode: "subscription",
  success_url: "https://seusite.com/sucesso",
  cancel_url: "https://seusite.com/cancelado",

  discounts: [
    {
      coupon: "JOAO1", // <- Código do cupom = código do afiliado
    },
  ],
});
Neste caso, você precisa mapear o cupom ao afiliado no dashboard:
  1. Vá em “Configurações”“Mapeamento de Cupons”
  2. Associe o cupom JOAO1 ao afiliado correspondente

Exemplos de Implementação

Next.js/React

// pages/api/create-checkout-session.ts
import Stripe from "stripe";
import { NextApiRequest, NextApiResponse } from "next";

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== "POST") {
    return res.status(405).json({ error: "Method not allowed" });
  }

  try {
    const { priceId, affiliateCode } = req.body;

    const session = await stripe.checkout.sessions.create({
      payment_method_types: ["card"],
      line_items: [
        {
          price: priceId,
          quantity: 1,
        },
      ],
      mode: "subscription",
      success_url: `${process.env.NEXT_PUBLIC_URL}/sucesso?session_id={CHECKOUT_SESSION_ID}`,
      cancel_url: `${process.env.NEXT_PUBLIC_URL}/cancelado`,

      // Passar código do afiliado no metadata
      metadata: {
        affiliate_code: affiliateCode || null,
      },
    });

    res.status(200).json({ sessionId: session.id });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}
Componente React:
import { loadStripe } from "@stripe/stripe-js";
import { useState, useEffect } from "react";

const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_KEY);

export default function CheckoutButton() {
  const [affiliateCode, setAffiliateCode] = useState(null);

  // Capturar código do afiliado do cookie ou URL
  useEffect(() => {
    const urlParams = new URLSearchParams(window.location.search);
    const code = urlParams.get("ref") || getCookie("aff_ref");
    setAffiliateCode(code);
  }, []);

  const handleCheckout = async () => {
    const response = await fetch("/api/create-checkout-session", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        priceId: "price_1234567890",
        affiliateCode: affiliateCode,
      }),
    });

    const { sessionId } = await response.json();
    const stripe = await stripePromise;

    await stripe.redirectToCheckout({ sessionId });
  };

  return <button onClick={handleCheckout}>Assinar Agora</button>;
}

function getCookie(name) {
  const match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)"));
  return match ? match[2] : null;
}

Node.js (Express)

const express = require("express");
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);
const app = express();

app.post("/create-checkout-session", async (req, res) => {
  const { priceId, affiliateCode } = req.body;

  try {
    const session = await stripe.checkout.sessions.create({
      payment_method_types: ["card"],
      line_items: [{ price: priceId, quantity: 1 }],
      mode: "subscription",
      success_url: "https://seusite.com/sucesso",
      cancel_url: "https://seusite.com/cancelado",

      metadata: {
        affiliate_code: affiliateCode || null,
      },
    });

    res.json({ sessionId: session.id });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

app.listen(3000);

PHP (Laravel)

use Stripe\Stripe;
use Stripe\Checkout\Session;

Route::post('/create-checkout-session', function (Request $request) {
    Stripe::setApiKey(env('STRIPE_SECRET_KEY'));

    $affiliateCode = $request->cookie('aff_ref') ?? $request->input('ref');

    $session = Session::create([
        'payment_method_types' => ['card'],
        'line_items' => [[
            'price' => 'price_1234567890',
            'quantity' => 1,
        ]],
        'mode' => 'subscription',
        'success_url' => url('/sucesso'),
        'cancel_url' => url('/cancelado'),

        'metadata' => [
            'affiliate_code' => $affiliateCode,
        ],
    ]);

    return response()->json(['sessionId' => $session->id]);
});

Python (Django)

import stripe
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

stripe.api_key = os.environ.get('STRIPE_SECRET_KEY')

@csrf_exempt
def create_checkout_session(request):
    if request.method == 'POST':
        affiliate_code = request.COOKIES.get('aff_ref')

        session = stripe.checkout.Session.create(
            payment_method_types=['card'],
            line_items=[{
                'price': 'price_1234567890',
                'quantity': 1,
            }],
            mode='subscription',
            success_url='https://seusite.com/sucesso',
            cancel_url='https://seusite.com/cancelado',

            metadata={
                'affiliate_code': affiliate_code,
            },
        )

        return JsonResponse({'sessionId': session.id})

Testando a Integração

1. Teste com Stripe Test Mode

  1. Use as chaves de teste do Stripe
  2. Crie uma checkout session com metadata.affiliate_code
  3. Use o cartão de teste: 4242 4242 4242 4242
  4. Complete o pagamento
  5. Verifique se a conversão apareceu no dashboard

2. Use o Stripe CLI para Simular Webhooks

# Instalar Stripe CLI
brew install stripe/stripe-cli/stripe

# Login
stripe login

# Escutar webhooks localmente
stripe listen --forward-to https://api.affiliatus.io/api/campaigns/SEU_ID/stripe/webhook

# Disparar evento de teste
stripe trigger checkout.session.completed

3. Verifique os Logs

No dashboard do Stripe:
  1. Vá em “Developers”“Webhooks”
  2. Clique no seu webhook
  3. Veja a lista de eventos enviados
  4. Verifique se retornou status 200 OK

Solução de Problemas

Webhook retorna erro 401 ou 403

Causa: Signing Secret incorreto ou integração não ativada. Solução:
  1. Verifique se a integração está ativa no dashboard
  2. Confirme que o Signing Secret está correto
  3. Tente reativar a integração

Conversão não é criada

Possíveis causas:
  1. Metadata não enviado
    • Verifique se metadata.affiliate_code está sendo passado
    • Confirme o valor no evento do Stripe
  2. Código de afiliado inválido
    • O código deve corresponder a um afiliado ativo
    • Verifique em “Afiliados” se o código existe
  3. Webhook não configurado
    • Confirme que o webhook está ativo no Stripe
    • Verifique se o evento checkout.session.completed está selecionado
  4. Evento duplicado
    • O sistema ignora eventos já processados
    • Cada payment_intent só gera uma conversão

Valor da conversão está errado

O valor é capturado diretamente do Stripe em centavos e convertido para reais. Exemplo:
  • Stripe: amount_total: 9900 (centavos)
  • Conversão: order_value: 99.00 (reais)
Se o valor estiver incorreto, verifique o amount_total no evento do Stripe.

Configurações Avançadas

Permitir Metadata e/ou Cupom

No dashboard, em “Integrações”“Stripe”, você pode configurar:
  • Permitir Metadata: Aceita metadata.affiliate_code
  • Permitir Cupom: Aceita cupons mapeados
Recomendamos ativar ambos para máxima flexibilidade.

Mapeamento de Cupons

Se você usa cupons de desconto como identificadores de afiliados:
  1. Vá em “Configurações”“Mapeamento de Cupons”
  2. Clique em “Adicionar Mapeamento”
  3. Selecione o cupom do Stripe
  4. Associe ao afiliado correspondente
Exemplo:
  • Cupom: DESCONTO10JOAO
  • Afiliado: João Silva (código JOAO1)

Boas Práticas

Faça

  • Sempre teste em Test Mode primeiro
  • Use metadata ao invés de cupons (mais confiável)
  • Configure o Signing Secret corretamente
  • Monitore os logs de webhook no Stripe
  • Mantenha as chaves de API seguras

Não Faça

  • Não exponha chaves secretas no frontend
  • Não desative o webhook sem avisar os afiliados
  • Não modifique o metadata após criar a sessão
  • Não use cupons genéricos para múltiplos afiliados

Próximos Passos


Precisa de Ajuda?

Não diretamente no momento. Use metadata no checkout da conta conectada e processe via API.
Sim! Funciona tanto com mode: 'subscription' quanto mode: 'payment'.
A conversão permanece no sistema. Você pode rejeitá-la manualmente se necessário.
Sim! A SDK é obrigatória para salvar o código do afiliado no cookie. Sem ela, o webhook do Stripe não terá como saber qual afiliado trouxe a venda.
Dúvidas? Entre em contato pelo suporte ou consulte a documentação do Stripe.