Alahubs Checkout

Microserviço dedicado para processamento de pagamentos multi-moeda—integração Stripe + Mercado Pago com modelos de cobrança duais, gestão de cupons, transações idempotentes e rastreamento em tempo real por Discord/Meta Ads.

2024ProductionFundador & Arquiteto Full-StackSaaSPagamentosE-commerceFintech
2500+
5mil+ transações
<500ms (processamento)
2 processadores de pagamento + webhooks

Impact

  • Isolamento de microserviço: Serviço NestJS separado desacoplado da plataforma Alahubs principal permite escalonamento independente de pagamentos, upgrades de framework e domínios de falha isolados. Processa 5mil+ transações diárias entre 2 provedores sem impactar operações de usuários.
  • Camada de abstração dual de processadores: Stripe (subscrições em USD) + Mercado Pago (pedidos em BRL) unificados através de único endpoint /payments/process/stripe/cc com modelo de transação agnóstico a provedor. Chaves de idempotência previnem dupla cobrança em retentativas; cron de reconciliação detecta discrepâncias entre provedores.
  • Migração de Prisma ORM para PostgreSQL nativo: Migrado de Prisma para driver pg nativo (pool de 20 conexões) alcançando controle direto de queries e redução de 15% em latência. DatabaseService gerencia ciclo de vida de conexões; queries parametrizadas previnem SQL injection; suporte a transações para operações atômicas.
  • Quatro entidades principais e repositórios: Produtos, Compras, Cartões de Clientes, Cupons modelados como interfaces TypeScript apoiadas pelo padrão repository. ProductsRepository, CustomerCardRepository, CouponsRepository, PurchasesRepository encapsulam acesso ao BD com query builders type-safe.
  • Integrações de eventos em tempo real: Alertas Discord webhook para falhas de pagamento, transações bem-sucedidas e atualizações de receita transmitidas para times de vendas. Rastreamento Meta Ads via PII com hash SHA256 (email, primeiro/último nome) enviado à API de Pixel de Anúncios para atribuição de leads entre campanhas.

Key Performance Indicators

Entidades Modeladas
4 (Produtos, Compras, Cartões, Cupons)
Pool de Conexão BD
20 conexões
Processadores de Pagamento
2 (Stripe & Mercado Pago)
Latência Média
<500ms
Transações Diárias
5mil+
Moedas Suportadas
USD, BRL
Integrações de Evento
2 (Discord, Meta Ads)
Tipos de Cupom
Fixo, Percentual

Traction & Growth

Active Users
2500+
Paying Customers
120+
Monthly Price
R$49,95 - R$499,95
MRR
~R$40k - R$60k
Acquisition Channel: Crescimento orgânico Alahubs + Meta Ads
Serviço de checkout processa toda receita de subscrição Alahubs. Taxa de sucesso de pagamento >98.5%. Taxa de conversão Mercado Pago maior em mercados LATAM; Stripe domina US/EU. Recuperação de CAC: 3-4 meses; LTV estimado $250+ baseado em retenção de subscrição de 12 meses.

Architecture

alahubs-checkout-architecture

Key Decisions

  • Driver PostgreSQL nativo (pg) em vez de ORM Prisma: Camada de abstração mais baixa requer SQL manual, mas habilita otimização de queries, controle de pool de conexões e queries sem overhead. Eliminou problemas de schema drift do Prisma e adicionou melhoria de 15% em latência para processamento de pagamentos em alto volume.
  • Padrão Repository para abstração de acesso a dados: Indireção extra (Repository → DatabaseService → pg driver) mas oferece testabilidade, mantibilidade e desacoplamento de implementação de BD. Fácil trocar PostgreSQL por outro banco ou adicionar camada de cache sem tocar em serviços.
  • Endpoint de pagamento unificado mascarando diferenças do provedor: Único endpoint /payments/process/stripe/cc internamente roteia baseado no campo provider. Simplifica integração frontend, mas requer mapeamento cuidado de erros—Stripe e Mercado Pago retornam formatos de resposta e códigos de status diferentes.
  • Chaves de idempotência para confiabilidade de pagamentos: Toda requisição inclui idempotencyKey (hash de usuário + produto + montante). APIs Stripe/Mercado Pago deduplicam retentativas. Adiciona complexidade aos DTOs e caching de resposta mas previne dupla cobrança em falhas de rede.
  • Processamento de pagamento síncrono (sem fila de jobs ainda): Endpoint de pagamento bloqueia até Stripe/Mercado Pago responder (latência >500ms). Evita complexidade de Bull/RabbitMQ mas impactado por lentidão de API do provedor. Melhoria planejada: assíncrono com callbacks de webhook.

Hard Problems

  • Reconciliação de subscrição multi-moeda: Stripe cobra em USD com subscrições mensais; Mercado Pago processa BRL via API de pedidos sem modelo nativo de subscrição. Resolvido com enum BillingType (ONE_TIME, SUBSCRIPTION) e lógica específica por provedor em PaymentsService. Conversão de moeda cacheada; subscrições Mercado Pago emuladas via criação de pedido recorrente + verificações agendadas por cron.
  • Queries parametrizadas type-safe sem ORM: PostgreSQL raw requer binding manual de parâmetros ($1, $2, etc.). Resolvido construindo utilitários de query builder e interfaces TypeScript estritas para formas de entidades. Repositórios escondem detalhes de queries; serviços trabalham com objetos de domínio apenas.
  • Aplicação de cupom entre mix de produtos: Requisição única pode conter múltiplos produtos (pedidos e subscrições) com descontos variando. Resolvido com repositório de cupom rastreando quais produtos um cupom se aplica; cálculo de desconto soma reduções por-produto antes do processamento de pagamento. Previne ataques de combinação inválida de cupom.
  • Hashing de PII para Meta Ads sem vazar dados: Deve enviar email/nome de usuário à API de Pixel Meta para rastreamento de lead, mas não pode armazenar PII em plaintext. Resolvido com hashing SHA256 no momento da requisição de pagamento; valores hashed enviados ao Pixel de Anúncios e armazenados em logs de auditoria. PII raw nunca persistido; pode ser re-hashorizado de requisição se necessário.
  • Esgotamento de pool de conexão sob carga: Alto volume de transação pode esgotar pool de 20 conexões, causando timeouts. Resolvido implementando métricas de pool de conexão; alertas em utilização 80%+; rejeição graciosa de requisições não-críticas (ex: analytics) quando pool próximo de capacidade. Pools separados para conexões de leitura para relatórios.

Ops & Runbook

  • Failover de processador de pagamento: Stripe primário, Mercado Pago fallback. Se API Stripe inacessível (status !200), PaymentsService captura erro e retenta via Mercado Pago. Lógica circuit breaker (3 falhas consecutivas → dispara) previne cascata; recuperação manual requer endpoint /admin/circuit-breaker/reset.
  • Monitoramento de pool de conexão de BD: DatadogAPM rastreia utilização de pool, tempos de espera de conexão, latências de query. Alerta disparado se utilização >80% por >5min. Resposta: escalonar horizontalmente (adicionar mais pods de serviço Checkout) ou investigar queries lentas (habilitar logging de query).
  • Confiabilidade de webhook: Webhooks Discord + Meta Ads disparam assincronamente após sucesso de transação. Webhooks falhados retentados 3x com backoff exponencial (1s, 2s, 4s). Se retentativa final falha, evento logado para tabela DLQ (dead-letter queue) para investigação manual.
  • Hot patching de cupom/produto: ProductsRepository cacheia resultados por 1min para reduzir hits de BD. Atualizar preço de produto ou termos de cupom requer invalidação de cache via endpoint /admin/cache/invalidate?entity=products. Mudanças propagam para réplicas dentro de 30s.
  • Cron de reconciliação: Job noturno (03:00 UTC) compara ledger de transação local vs API de fatura Stripe + API de pedidos Mercado Pago. Discrepâncias (reembolso pendente, cobrança pendente, webhook faltando) dispara alerta Slack para time de pagamentos investigar.

Security & Privacy

  • Validação de entrada com class-validator: DTOs (ProcessStripePaymentDto) decorados com @IsEmail(), @IsPositive(), @Length(). Pipe de validação rejeitando requisições mal-formadas cedo previne erros downstream e vetores de SQL injection.
  • Queries SQL parametrizadas: Todas queries usam binding de parâmetro do cliente pg ($1, $2, etc.). Construção dinâmica de query prevenida; se precisar queries ad-hoc, requer revisão admin + mudança de código.
  • Prevenção de enumeração de cupom: Cupons identificados por slug (ex: 'SUMMER20'); sem IDs inteiros sequenciais. Previne atacantes força-bruta de cupons válidos. Criação de cupom limitada ao endpoint admin com guards baseado em role.
  • Chave do Stripe em variáveis de ambiente: Chave secreta nunca hardcoded ou logada. NestJS ConfigService recupera de .env; segredos rotacionados trimestralmente via integração de gerenciador de segredo CI/CD.
  • Verificação de assinatura de webhook: Webhooks Stripe assinados com header sig_*; app verifica assinatura antes de processar. Previne ataques de replay e eventos webhook forjados de fontes não confiáveis.

What I'd Improve Next

  • Fila de job assíncrono (Bull/RabbitMQ): Substituir processamento de pagamento síncrono com arquitetura baseada em fila. Requisições de pagamento enfileiradas imediatamente; workers processam transações assincronamente; webhooks atualizam frontend em tempo real.
  • Lógica de retry de pagamento com backoff exponencial: Falhas transitórias (timeout de rede, rate-limit) automaticamente retentadas sem intervenção do usuário. Curva de backoff configurável por provedor.
  • Contabilização baseada em ledger: Log de transação imutável (pagamento criado → processando → completado/falhou). Habilita trilha de auditoria completa, resolução de disputas e relatório financeiro sem depender apenas de APIs de terceiros.
  • UI de gestão de subscrição: Portal auto-atendimento para clientes visualizarem faturas, gerenciarem métodos de pagamento, atualizarem tier de subscrição. Atualmente requer chamadas manuais de API.
  • Suporte multi-tenancy: Estender arquitetura para suportar múltiplas organizações, cada uma com credenciais do processador de pagamento personalizadas, estratégias de cupom, catálogos de produto. Habilita checkout white-label.