📄 Cópia local — fonte de verdade no GitHub. Origem:
felipeluissalgueiro/cadencia-app/master/docs/adr/0001-stripe-em-vez-de-asaas.mdSincronizar via/documentarousync_to_framework.py.
adr: 0001 titulo: Stripe em vez de Asaas como gateway do Cadencia data: 2026-05-11 status: aceito
ADR-0001 — Stripe em vez de Asaas como gateway do Cadencia¶
Contexto¶
Cadencia operava com Asaas v3 (Epic 5 DONE em produção). Felipe quer centralizar visualização de pagamentos no GHL Cadencia (subaccount agência nova). Asaas não tem integração GHL. GHL tem integração nativa com Stripe (Axis é a conta Stripe do Felipe).
Adicionalmente, há clientes B2B legados no Asaas (Sorria Rio, Vamos Sorrir, GCI GO, Nathalia, Rogéria, Alvina) que precisam ser migrados ou cancelados.
Decisão¶
Trocar Asaas por Stripe em big bang (sem feature flag, sem convivência). Stripe vira fonte da verdade. Cancelamentos no Asaas executados em massa (33 subs + 82 boletos). 47 customers Asaas migrados pra Stripe pra preservar histórico/cadastro.
Pra ver pagamentos no GHL: webhook custom Stripe → GHL (cria Invoice paga + tags no Contact via API GHL).
Alternativas avaliadas¶
| Opção | Por que descartada |
|---|---|
| Manter Asaas + sync paralelo pro GHL | Acumula 2 gateways. Asaas não integra nativamente com GHL nem com Customer Portal hospedado. |
| Stripe + criar subs como GHL Invoice Schedule | GHL Invoice recurring é menos refinada que Stripe Subscriptions (sem proration automática, trial complexo, etc). Cadencia tem lógica de créditos/addons que exige flexibilidade do Stripe. |
| Stripe com Custom Provider GHL apontando pra Asaas | Direção inversa (GHL→Asaas). Não resolve "ver no GHL o que rola no Stripe". |
| Sync Stripe→GHL via integração nativa GHL | NÃO funciona pra subscriptions criadas via Stripe API direto. Integração nativa só conhece transações que nascem no GHL. Validado empiricamente em 11/05. |
Consequências¶
Positivas¶
- Cadencia SaaS ganha flexibilidade do Stripe (proration, Customer Portal, addons one-time programáticos, trial Stripe se quisermos)
- Visualização unificada no GHL (via webhook custom)
- Cancelamento de 33 contratos Asaas obsoletos limpou base
- Conta Stripe Axis é livemode, BRL nativo, suporta cartão internacional
Negativas¶
- Stripe BR não tem boleto nativo refinado (B2B GCI GO usa
send_invoiceque hospeda página, mas é diferente do boleto direto Asaas) - Stripe BR cobra ~3,99% + R$0,39 por transação cartão (Asaas era ~2,99%)
- Refund precisa ser feito em 2 lugares se quiser fluxo perfeito (Stripe API faz; GHL API com PIT não permite void de invoice paga retroativamente — fica apenas como tag/nota)
- Nicole Berti permanece no Asaas (8 parcelas R$417 com cartão pré-autorizado já garantidas até nov/2026) — split parcial da base
Neutras¶
- Migration Supabase mínima: tabela
stripe_webhook_log+ colunasstripe_subscription_id/stripe_invoice_idemtenant_plans.tenant_config.configJSONB acomodastripe_customer_id. - Bridge GHL existente via Workers Railway (
/api/v1/ghl/payment) continua funcionando (recebetenant_id+ plan + value). Webhook Stripe novo chama o mesmo endpoint.
Validação¶
Pagamento real R$199,90 (essencial) + addon R$49,90 + refunds completos rodaram E2E em 11/05/2026: - Stripe Checkout funciona - Webhook → Supabase libera créditos - Webhook → GHL cria Invoice paga + tags automaticamente - Refund → Supabase muda status='refunded' + tag GHL refund-stripe - Tempo entre Stripe event → GHL invoice criada: ~1 segundo
3 bugs descobertos durante validação e corrigidos: - createInvoice GHL exige name, businessDetails, currency por item (commit 1a1d565) - charge.refunded puxava tenant_id de charge.metadata (vazio) — agora cascata por subscription/PI (commit 24e2634) - Mirror GHL exigia session.invoice — não funciona pra addons one-time (commit 866e27b)
Referências¶
- Doc da feature: docs/features/billing-stripe-ghl/README.md
- Commits:
74634b8,674f620,1a1d565,24e2634,866e27b - Log de sessão:
Hub Projetos/Rotina/sessions-log/2026-05-11/cadencia-migracao-asaas-stripe-ghl_2026-05-11_2229.md