📄 Cópia local — fonte de verdade no GitHub. Origem:
felipeluissalgueiro/cadencia-app/master/src/app/api/app/billing/CLAUDE.mdSincronizar via/documentar-softwareousync_to_framework.py.⚠️ Vocabulário desatualizado (DEV-989, 2026-06-30): este doc descreve o fluxo em termos de "planos" — modelo anterior ao PDL-505 (11/06/2026). Cadência não tem planos, é créditos puros. Fonte única de vocabulário/modelo:
times/produto/cadencia/MODELO-CREDITOS.md. A tabela "Planos e créditos" abaixo é referência histórica dos price tiers do Stripe (pode não refletir os produtos Stripe atuais — conferirplans.ts) — ao falar do modelo de negócio, usar sempre "carteira de créditos"/"créditos comprados", nunca "plano X". Correção completa do fluxo técnico (se o código ainda usa nomenclatura de plano internamente) é escopo de uma sincronização real com o repocadencia-app, fora deste sweep de framework.
payment-billing — pagamento e créditos (Stripe)¶
TL;DR¶
Integração Stripe para compra de créditos (carteira de créditos por tenant — sem planos/assinatura, ver MODELO-CREDITOS.md). Migrado de Asaas em 11/05/2026.
Identidade¶
- Tipo: Next.js API routes + Stripe
- Paths:
src/lib/stripe.tssrc/app/api/webhooks/stripe/route.tssrc/app/(app)/app/plans/(frontend)src/app/api/app/admin/billing/credits/(admin)- Status: ativo (Asaas deprecated, código ainda em
src/lib/integrations/— dívida técnica) - Deps: Stripe, Supabase (
tenant_plans)
Fluxo de compra¶
- Usuário acessa
/app/plans - Clica em plano →
POST /api/app/checkout→ cria Stripe Checkout Session - Redirect para Stripe → pagamento confirmado
- Stripe envia
checkout.session.completedwebhook →POST /api/webhooks/stripe - Webhook: verifica assinatura → ativa plano → credita créditos em
tenant_plans - Redirect para
/app/plans/callback(confirmação)
Planos e créditos¶
| Plano | Créditos | Preço |
|---|---|---|
| trial | 3 | R$ 0 |
| essencial | 30 | — |
| starter | 80 | — |
| profissional | 80 | R$ 399,90 |
| growth_pro | 9999 | R$ 1.497 |
Múltiplos tenant_plans com status=active somam créditos disponíveis.
Dívida técnica¶
Código Asaas ainda presente em src/lib/integrations/asaas.ts — não remove operações ativas mas polui a lib. PDL pendente para remoção.
Don'ts¶
- Nunca confiar no valor retornado pelo Stripe sem verificar
stripe-signature— man-in-the-middle risk - Não creditar créditos antes de confirmar pagamento no webhook (não na redirect page)
Quando usar¶
- Compra/upgrade de plano no
/app/plans. - Crédito manual via admin (
/app/admin/billing/credits). - Recebimento de pagamento (
/api/webhooks/stripe).
Quando NÃO usar¶
- ❌ Asaas em código novo — descontinuado em 11/05/2026. Ver ADR-0001.
- ❌ Creditar antes de webhook confirmado — usuário pode cancelar antes do webhook.
- ❌ Confiar em redirect page para confirmar —
/plans/callbacké UI; webhook é fonte da verdade.
Por que funciona assim¶
- ADR-0001 — Stripe substituiu Asaas.
- Múltiplos
tenant_plansativos somam créditos — permite addon sem refazer plano principal. - Webhook assinado é fonte da verdade — redirect page só UX.
🚫 Don'ts¶
- Não ativar plano em redirect page — usar webhook.
- Não confiar em payload sem
stripe-signature. - Não processar webhook 2x para mesmo
event_id. - Não dar crédito manual sem audit log (admin).
🪦 Já tentamos¶
- Migração Asaas → Stripe em 11/05/2026. Razão: cobertura internacional, UX checkout, suporte recorrência mais maduro.
- Código Asaas em
src/lib/integrations/asaas.tsainda no repo — dívida técnica para limpar.
🔥 Troubleshooting¶
| Sintoma | Causa provável | Fix |
|---|---|---|
| Pagamento OK, plano não ativou | Webhook não chegou / signature errada | Replayar via Stripe dashboard |
| Crédito duplicado | Webhook idempotência rejeitou re-tentativa | Conferir event_id dedup |
| Plano errado ativado | Mapping price_id → plan errado | Auditar plans.ts |
| Trial não criou | provision-tenant falhou pré-Stripe | Ver api-auth-provisioning |
📚 Referências cruzadas¶
- api-integrations — Webhook Stripe
- api-auth-provisioning — Cria plano trial
- supabase-schema —
tenant_plans - ADR: 0001 Stripe