Alahubs Checkout
Microserviço de pagamentos dedicado com Stripe e Mercado Pago. Processa assinaturas em USD e pedidos em BRL com idempotency, alertas Discord e atribuição de leads via Meta Ads.
2024ProduçãoFundador & Arquiteto Full-StackSaaSPagamentosFintech
- NestJS
- TypeScript
- PostgreSQL
- Stripe
- Mercado Pago
- Docker
- Kubernetes
- Meta Ads
- Discord API
2500+ usuários
5k+ transações/dia
<500ms processamento
Stripe + Mercado Pago
Impact
- Serviço NestJS isolado da plataforma Alahubs principal, permitindo scaling independente de pagamentos e atualizações sem afetar as operações de usuário.
- Stripe para assinaturas em USD e Mercado Pago para pedidos em BRL unificados em um único endpoint de processamento. Idempotency keys previnem cobrança dupla; cron noturno reconcilia ledgers entre os dois processadores.
- Driver pg nativo com pool de 20 conexões no lugar do Prisma ORM, com 15% de melhoria em latência. Queries parametrizadas, transações atômicas e padrão repository para abstração de dados.
- Alertas em tempo real via webhook Discord para falhas e transações bem-sucedidas. Atribuição de leads com SHA256 de PII enviado à API de Pixel do Meta.
KPIs
Entidades modeladas
4 (Produtos, Compras, Cartões, Cupons)
Pool de conexão
20 conexões
Processadores
Stripe + Mercado Pago
Latência média
<500ms
Transações diárias
5k+
Moedas suportadas
USD, BRL
Integrações de evento
Discord, Meta Ads
Tipos de cupom
Fixo, Percentual
Traction & Growth
Active Users
2500+
Paying Customers
120+
Monthly Price
R$ 49,95 a R$ 499,95
MRR
~R$ 40k - R$ 60k
Acquisition Channel
Crescimento orgânico Alahubs + Meta Ads
Processa toda a receita de assinatura do Alahubs. Taxa de sucesso de pagamento acima de 98.5%. Mercado Pago domina em LATAM; Stripe nos mercados US/EU. LTV estimado em $250+ com base na retenção de 12 meses.
Architecture
alahubs-checkout-architecture
Key Decisions
- Driver pg nativo em vez de Prisma ORM: SQL manual aumenta o custo de manutenção, mas elimina o overhead do ORM e o schema drift. Ganho de 15% em latência para processamento de pagamentos em alto volume.
- Padrão Repository para abstração de dados: Uma camada de indireção extra, mas facilita testes e troca de banco sem tocar na lógica de negócio.
- Endpoint único de pagamento com roteamento interno por provedor: Simplifica a integração com o frontend, mas exige mapeamento cuidadoso de erros: Stripe e Mercado Pago retornam formatos de resposta completamente diferentes.
- Processamento síncrono sem fila de jobs: Endpoint bloqueia até o provedor responder (latência acima de 500ms). Menos complexidade operacional, mas fica refém da lentidão das APIs externas. Bull ou RabbitMQ resolvem isso.
Hard Problems
- Stripe usa subscriptions em USD; Mercado Pago usa orders em BRL sem modelo nativo de assinatura. Um enum BillingType e lógica específica por provedor dentro do PaymentsService resolvem o mapeamento. Assinaturas Mercado Pago são emuladas com criação recorrente de pedido e verificações agendadas.
- Queries SQL sem ORM exigem binding manual de parâmetros. Utilitários de query builder com interfaces TypeScript estritas mantêm type safety sem depender do Prisma.
- Uma requisição pode conter vários produtos com descontos diferentes. O repositório de cupons rastreia quais produtos cada cupom se aplica; o cálculo soma as reduções por produto antes de processar o pagamento.
- Meta Ads exige email e nome do usuário para atribuição de lead, mas esses dados não podem ser persistidos em plaintext. Hash SHA256 aplicado no momento da requisição; valores hasheados enviados ao Pixel. PII raw nunca gravado.
- O pool de 20 conexões pode esgotar sob carga. Métricas de pool monitoradas com alertas a 80% de utilização. Requisições não críticas rejeitadas graciosamente quando o pool está próximo do limite.
Ops & Runbook
- Stripe é o processador primário; Mercado Pago é o fallback. Circuit breaker ativa após 3 falhas consecutivas. Reset manual via /admin/circuit-breaker/reset.
- Pool de conexão monitorado via Datadog APM. Alerta se utilização acima de 80% por mais de 5 minutos. Resposta: escalar horizontalmente ou investigar queries lentas.
- Webhooks Discord e Meta Ads disparam de forma assíncrona após transação bem-sucedida. Retentativas com backoff exponencial (1s, 2s, 4s). Falhas persistentes vão para tabela DLQ.
- Cache de produto com TTL de 1 minuto. Invalidação manual via /admin/cache/invalidate?entity=products. Mudanças propagam para réplicas em até 30s.
- Cron noturno às 03:00 UTC compara ledger local com invoices Stripe e pedidos Mercado Pago. Discrepâncias disparam alerta Slack.
Security & Privacy
- DTOs decorados com class-validator rejeitam requisições malformadas antes de qualquer processamento.
- Todas queries usam parâmetros pg ($1, $2). Nenhuma concatenação dinâmica de SQL permitida.
- Cupons identificados por slug, sem IDs inteiros sequenciais. Previne força bruta. Criação limitada a endpoints admin com guards de role.
- Chave secreta Stripe nunca hardcoded ou logada. Rotação trimestral via gerenciador de segredos no CI/CD.
- Todos os webhooks Stripe validados via header sig_* antes de qualquer processamento.
What I'd Improve Next
- Trocar processamento síncrono por filas com Bull ou RabbitMQ. O endpoint retornaria imediatamente; workers processariam a transação em background.
- Retries automáticos com backoff exponencial para falhas transitórias de rede sem intervenção manual.
- Ledger de transações imutável para trilha de auditoria completa e resolução de disputas sem depender das APIs de terceiros.
- Portal de autoatendimento para clientes gerenciarem faturas, métodos de pagamento e tiers de assinatura.