Athletes Ocean

Construindo o Athletes Ocean — De $5K para $70K+ de MRR
Os Numeros Contam a Historia
| Metrica | Inicio | Atual | Crescimento |
|---|---|---|---|
| MRR (aprox.) | ~$5K | ~$71K | 14x |
| Pedidos Mensais | 663 | 1.172 | 1.8x |
| Usuarios | ~7.500 | 14.899 | 2x |
| Teamspaces | ~45 | 533 | 12x |
| Atletas em Teamspaces | - | 3.590 | - |
| Videos | ~2.700 | 6.001 | 2.2x |
| Instrutores | - | 141 | - |
| Produtos | - | 261 | - |
| Assinaturas Ativas | - | 1.182 | - |
| Commits | - | 4.032 | - |
A trajetoria de receita foi explosiva: comecando com $72K em valor bruto de pedidos, crescendo para $125K/mes no pico, e estabilizando em torno de $71K+. A criacao de teamspaces saltou de ~10/mes para 121 em um unico mes quando o modelo de colaboracao em equipe encontrou product-market fit.
A Stack Tecnologica
Um monorepo full-stack de verdade alimentando iOS, Android, Web, Admin, CRM e Workers:
| Camada | Tecnologia |
|---|---|
| App Mobile + Web | Expo SDK 52, React Native 0.76, Expo Router |
| Estilizacao | NativeWind (Tailwind CSS) |
| Estado | Zustand + TanStack React Query |
| API Backend | Node.js, Express, TSOA (rotas auto-geradas + OpenAPI) |
| Banco de Dados | PostgreSQL, Prisma ORM (59 modelos, schema de 1.369 linhas) |
| Painel Admin | AdminJS com 70+ configs de recursos, dashboards React customizados |
| Autenticacao | Firebase Auth (client) + Firebase Admin (server) |
| Pagamentos | Stripe (web), RevenueCat (compras in-app iOS/Android) |
| Video | Mux (streaming + playback seguro + transcricao) |
| Armazenamento | Cloudflare R2 |
| Chat | Stream Chat (mensagens em tempo real) |
| Resend + templates React Email | |
| Rastreamento de Erros | Sentry (app + server) |
| Analytics | PostHog (web + mobile + server), GA4 |
| SEO | Server-side rendering para crawlers, dados estruturados, sitemaps |
| Workers | Cloudflare Workers (automacao CRM, redimensionamento de imagens) |
| CI/CD | GitHub Actions, EAS Build/Update, Lefthook |
Tamanho do codebase: ~787 arquivos do app, ~255 arquivos do server, ~142 arquivos do admin, 779 arquivos de teste.
Timeline de Features — O Que Construimos
Fase 1 — Fundacao & Painel Admin
O ponto de partida: $5K de MRR, produto basico. Comecamos com:
- Dashboard AdminJS — painel admin completo com impersonacao de usuario, relacoes de produtos, reset de senha
- Migracao Prisma v6 — upgrade major do ORM
- Integracao RevenueCat — atributos de usuario para rastreamento de assinaturas mobile
- Emails de convite de Teamspace — fluxo de onboarding automatizado
- Previews gratuitos de conteudo em produtos nao comprados
Fase 2 — Pagamentos para Instrutores & Infraestrutura de Video
- Stripe Connect para instrutores — split automatico de pagamentos para criadores de conteudo
- Sync de videos Bunny.net — gerenciamento em massa da infraestrutura de video
- Emails de confirmacao de compra — sistema de emails transacionais
- Cron: process-order-items — pipeline automatizado de processamento de pedidos
- Emails de boas-vindas para assinantes Apple
- Scripts para corrigir consistencia de dados entre DB e Stripe
Fase 3 — Metricas Admin & Experiencia do Usuario
- Revenue Dashboard (AdminJS) — primeiro dashboard customizado com metricas
- Rastreamento de progresso de video — continuar de onde parou em todos os dispositivos
- Feature flags por usuario — sistema de rollout gradual
- Fluxo de troca de email — migracao de email em multiplas etapas
- Gerenciamento de assentos para teamspaces
- Dashboard de instrutores atras de feature flag
Fase 4 — Reformulacao de Assinaturas & Pagamentos
- Migracao de assinaturas de Teamspace — migrando cobranca legada para novo modelo
- Sistema de payouts — payouts de custo, credito, workflows de aprovacao
- Compra sem autenticacao — checkout como convidado aumentando conversao
- Bundle upsell — venda cruzada de bundles no checkout
- Suporte a Markdown para descricoes de produtos
- Notificacoes por email de compra para usuarios de teamspace
Fase 5 — IA & Notificacoes Push
- Chat IA (Conversation AI) — assistente para atletas alimentado por OpenAI
- Notificacoes push — Firebase Cloud Messaging para iOS/Android
- Rastreamento de checkout via GTM
- Melhorias na validacao de sessoes Stripe
Fase 6 — Resend & Plataforma de Ads
- Sync de audiencia Resend — separacao de listas de email producao/staging
- Sistema de Ad Tags — plataforma de publicidade e insights para instrutores
- Exclusao de usuario — remocao de conta em conformidade com GDPR
- Selecao padrao de licao/video item
Fase 7 — Loja & Fortalecimento de Auth
- Pagina de loja — experiencia dedicada de navegacao de produtos
- Refresh de token Firebase — fluxo de auth fortalecido prevenindo sessoes expiradas
- Integracao Intercom — chat de suporte ao cliente
- CMS Promos — banners promocionais com agendamento
- Busca com debounce na homepage
Fase 8 — Sistema de Calendario
- Eventos recorrentes de calendario — suporte completo a RRULE (diario, semanal, customizado)
- Templates de calendario — planos de treino reutilizaveis
- UI otimista — marcar tarefas como concluidas com feedback instantaneo
- Usuarios designados podem marcar itens como feitos
- Validacao de eventos recorrentes e helpers de formulario
Fase 9 — Recursos de Teamspace & Carrinho Mobile
- Novos tipos de eventos de calendario — expandidos alem de treinos (reunioes, sessoes de video, etc.)
- Recursos de teamspace — compartilhamento de arquivos/documentos
- Carrinho no mobile — experiencia de carrinho de compra in-app
- Deep links de notificacao push — tocar na notificacao para navegar ate comentario/produto
- Lembretes de convite de teamspace
- UI skeleton para formulario de calendario
Fase 10 — Busca & Diario
- Busca global — busca em videos, instrutores, teamspaces
- Suporte a timezone no diario — lembretes de diario com reconhecimento de fuso horario
- Modal de troca de senha — gerenciamento de senha in-app
- Busca e descoberta de instrutores
- Busca em todas as paginas de conteudo
Fase 11 — Motor de Notificacoes (O Ponto de Inflexao do Crescimento)
Esta foi a fase onde teamspaces explodiram de 15/mes para 121. Features principais:
- Envio em lote de notificacoes push — enviar para todos os membros do teamspace eficientemente
- Emails de resumo diario — digest automatizado para donos de teamspace
- Lembretes de prazo de tarefas — nunca perca um prazo de treino
- Lembretes de calendario por timezone — respeitar fusos horarios de atletas globalmente
- Notificacoes de preview de treino — visualizar proximos treinos
- Ordenacao de calendario e produtos comprados
Fase 12 — Templates de Calendario & Controle de Acesso
- Sistema de templates de calendario — treinadores criam planos de treino reutilizaveis
- Grupos de teamspace — organizar atletas em esquadras/grupos
- Controle de acesso ao chat — apenas membros ativos do teamspace podem acessar mensagens
- Paginas de detalhe de link do calendario — entradas de calendario com deep link
- Envio de email com rate limit
Fase 13 — Dashboards & Migracao Mux
- Teamspace Dashboard (AdminJS) — analytics abrangentes de equipe
- Migracao de video para Mux — migrado de Bunny.net para Mux para streaming profissional de video
- Sync de teamspace com Notion — sincronizar dados de teamspace com Notion para relatorios
- Rastreamento de ultimo login
- Seletor de emoji para chat web
Fase 14 — Bundles de Produtos & Anexos de Email
- Bundles de produtos — empacotar multiplos produtos em bundles compraveis
- Anexos em email de compra — enviar arquivos (PDFs, guias) na compra via R2
- Access gate — restricao de conteudo para nao-assinantes
- Listas de video arrastáveis — ordenacao de videos por drag-and-drop
- Armazenamento Cloudflare R2 — gerenciamento de arquivos para anexos
- Acoes dropdown na web (substituindo acoes de swipe exclusivas do mobile)
- Testes de integracao de webhook Stripe
Fase 15 — Upload de Video & Reformulacao de Convites
- Upload multiplo de videos — APIs de upload em massa para treinadores
- Publicar/despublicar video — modo rascunho para videos
- Redesign de convite de teamspace — link de convite + QR code unificados em modal
- Preco riscado — mostrar economia em assentos pre-pagos
- Replay de video — videos assistidos recentemente no construtor de treinos
- Product Manager (AdminJS) — interface completa de gerenciamento de produtos
- Pagina de configuracao de conta para novos convidados
- Testes de integracao de video
Fase 16 — CRM, SEO, Analytics & Video com IA
- Sistema CRM — CRM completo com contatos, oportunidades, log de eventos, atribuicao de origem (6 novas tabelas no DB)
- Cloudflare Workers — workers de automacao CRM (intake de leads, briefing pre-call, inteligencia de chamadas, ingestao de agendamentos, ops diarias, follow-up, recuperacao de no-show)
- Reformulacao SEO — dados estruturados (JSON-LD), sitemaps com extensoes de imagem, HTML especifico para crawlers, meta tags, secoes de FAQ
- Camada de analytics — analytics centralizado com adaptadores GA4 + PostHog, funil de navegacao, rastreamento de checkout
- Metadados de video com IA — geracao automatica de titulos e legendas a partir de transcricoes usando OpenAI
- Sistema de log de eventos — rastrear todas as acoes de usuario (auth, compras, webhooks) com metadados de IP/dispositivo
- Pagina de Atividade do Usuario (AdminJS) — visualizacao em timeline com metricas de DAU/MAU
- Reescrita do Dashboard de Instrutores — metricas precisas com helpers extraidos
- Integracao PostHog — analytics de produto no server + web + mobile
- Bridge Google Calendar — sincronizar agendamentos no CRM
- Gerenciamento de canais Stream Chat (adicionar/remover membros)
- Testes E2E com Playwright
A Historia do AdminJS
O AdminJS merece sua propria secao. Construimos uma plataforma completa de operacoes internas com:
- 70+ configuracoes de recursos — cada modelo Prisma tem uma interface admin customizada com propriedades, acoes e grupos de navegacao personalizados
- 4 dashboards customizados:
- Revenue Dashboard — MRR, receita por loja, tendencias mensais
- Teamspace Dashboard — metricas de saude do time, atividade de usuarios, status de assinatura
- Instructor Dashboard — metricas de conteudo, rastreamento de payouts
- Sales Commission Dashboard — atribuicao de representante, calculadora de payout, historico de transacoes com exportacao CSV
- Componentes customizados: Video Manager, Product Manager, Bulk Tag Manager, Email Attachment Manager, Payout Approval, Order Item Export, User Impersonation, Firebase Token Manager, Teamspace Chat Sync, User Activity Timeline
- Component loader com 90+ componentes registrados
- Roda como um app separado (
admin-adminjs/) conectando ao mesmo PostgreSQL via Prisma
Desafio: O CRUD nativo do AdminJS e otimo para casos simples, mas cada recurso do mundo real precisava de acoes customizadas (atribuir representante, aprovar payout, exportar CSV, operacoes em massa). Os componentes React customizados dentro do AdminJS se comunicam com o servidor via endpoints admin gerados pelo TSOA — um padrao que evoluimos ao longo do tempo que mantem a logica de negocio no servidor enquanto da ao admin UI total flexibilidade.
Principais Desafios Tecnicos
1. Sistema Dual de Pagamentos (Stripe + RevenueCat)
Pagamentos web passam pelo Stripe (checkout sessions, assinaturas, faturas). Mobile passa pelo RevenueCat (App Store, Google Play). Ambos precisam criar os mesmos registros de Order/OrderItem/Subscription. Aprendemos da maneira dificil que isMobile e true tanto para iOS QUANTO Android (corrigimos o bug da API key do RevenueCat), e que as taxas das lojas precisam de calculo por loja via getStoreFee() ao inves de taxas Apple hardcoded.
2. Migracao de Video Bunny.net para Mux
6.000+ videos migrados do CDN Bunny.net para o Mux para streaming profissional de video com tokens de playback seguro, transcricao automatica e geracao de thumbnails. Isso envolveu scripts de migracao, suporte dual-CDN durante a transicao e atualizacao de toda referencia de video no sistema.
3. Precificacao de Teamspace & Gerenciamento de Assentos
Teamspaces tem precificacao complexa: custos por assento, descontos por volume, suporte a cupons, adicao de assentos no meio da assinatura e renovacoes pro-rata. Acertar o calculateTeamspacePricing — especialmente para edge cases como reembolsos parciais e adicao de assentos no meio do ciclo — exigiu multiplas iteracoes e scripts para corrigir dados historicos.
4. Eventos Recorrentes de Calendario
Implementar suporte a RRULE (RFC 5545) para eventos recorrentes de calendario que respeitam fusos horarios, lidam com excecoes (ocorrencias deletadas/modificadas) e funcionam em iOS/Android/Web foi uma das features mais complexas. Cada ocorrencia precisa do seu proprio ID composto enquanto compartilha o template do evento pai.
5. Chat em Tempo Real com Controle de Acesso
A integracao com Stream Chat precisava de controles de acesso customizados — apenas membros ativos do teamspace podem acessar canais, e quando uma assinatura expira, o acesso ao chat deve ser revogado. Gerenciamento de canais (adicionar/remover membros) com UI otimista e refresh de estado adicionou mais uma camada de complexidade.
6. Monorepo Sem Workspaces
Evitamos intencionalmente Yarn workspaces porque o bundler Expo/Metro nao funciona bem com dependencias hoisted. Isso significa que app/ e server-api/ tem node_modules independentes, e codigo compartilhado fica em server-api/shared/ — um trade-off pragmatico que preveniu pesadelos com bundler ao custo de alguma duplicacao.
7. Confiabilidade de Webhooks
Webhooks do Stripe e RevenueCat devem ser idempotentes, lidar com retries e nunca bloquear o fluxo principal de pagamento. Adicionamos wrappers createSafeFromOrderItem que capturam erros para efeitos colaterais nao-criticos (como criacao de transacao de venda), enquanto garantimos que a criacao do pedido principal permanece atomica com prisma.$transaction.
O Que Aprendi
Construir uma plataforma de $5K para $70K+ de MRR me ensinou que as features que impulsionam o crescimento nem sempre sao as mais chamativas. A explosao de teamspaces (de 15/mes para 121/mes) foi impulsionada pela infraestrutura de notificacoes — resumos diarios, lembretes de tarefas, notificacoes de calendario com reconhecimento de fuso horario. Facilitar a vida dos treinadores com comunicacao automatizada foi a verdadeira alavanca de crescimento.
O investimento no AdminJS se pagou muitas vezes. Ter uma ferramenta interna poderosa significou que o time de operacoes podia se auto-atender ao inves de abrir tickets de engenharia. Cada dashboard customizado que construimos reduziu a carga de suporte.
E usar o Claude Code como co-piloto diario em toda essa stack — de migrations Prisma a componentes React Native a Cloudflare Workers — permitiu que um time pequeno entregasse em um ritmo que normalmente exigiria 3-4x o tamanho da equipe.


