Pular para o conteúdo
IndicaSaaS
Navegar na documentação

Stripe

OAuth (Connect) · cartão, recorrência nativa

Stripe Connect (OAuth): você autoriza uma vez e os eventos de todas as contas conectadas chegam num endpoint único. Recorrência nativa, cartão.

Client ID, chave e webhook precisam corresponder à mesma conta e ambiente. Valide a integração em ambiente de teste antes de processar vendas reais; conexão ativa não comprova atribuição ou homologação.

Conectar

  1. Ative o Connect (Connect → Overview → Standard/OAuth) e aceite o termo de plataforma.
  2. Settings → Connect → OAuth: copie o client_id (ca_…) e adicione o Redirect URI https://indicasaas.com/oauth/stripe/callback.
  3. Developers → API keys: copie a Secret key (sk_live_…).
  4. Developers → Webhooks: crie um endpoint https://indicasaas.com/webhooks/stripe, estilo Snapshot, ouvindo Connected accounts, com os eventos da tabela abaixo. Copie o signing secret (whsec_…).
  5. Configure os 3 como secrets do Worker: STRIPE_CLIENT_ID, STRIPE_SECRET_KEY, STRIPE_CONNECT_WEBHOOK_SECRET — todos da mesma conta, no mesmo modo.
  6. No painel → Meu SaaS → Instalação → Gateways → Stripe → Conectar → autorize.

Passe o ref no checkout

Leia a referência com AFS.getRef() e envie o valor completo, sem interpretar ou encurtar, no client_reference_id (Checkout) e/ou subscription_data.metadata.aff_ref (assinatura) ao criar a cobrança. Se retornar null, omita o campo de indicação.

const ref = AFS.getRef(); // vindo do front

const session = await stripe.checkout.sessions.create({
  mode: 'subscription',            // ou 'payment'
  line_items: [/* ... */],
  client_reference_id: ref,        // 1ª venda
  subscription_data: {             // renovações mantêm a atribuição
    metadata: { aff_ref: ref },
  },
  // O backend determina este valor pelo cadastro do SaaS:
  metadata: { aff_new: isNewCustomer ? '1' : '0' },
});
Em assinaturas, a 1ª cobrança só semeia a atribuição; a comissão vem em cada invoice.paid — evita comissão dobrada na 1ª cobrança.

Eventos

EventoO que faz
checkout.session.completed1ª venda (one-off) ou semeia a assinatura
invoice.paid / invoice.payment_succeededcobrança recorrente → comissão
charge.refundedreembolso → clawback
charge.dispute.createdchargeback → clawback
charge.dispute.closeddesfecho da disputa; vitória pode restaurar a parcela de comissão debitada
customer.subscription.deletedcancelamento (churn)

Problemas comuns

gw_error=exchange indica falha na troca do código OAuth. Confira credenciais, conta e ambiente; o código isolado não identifica a causa.