Levar um app à produção é empilhar camadas sobre o que já funciona. O diagrama abaixo mostra a ordem: começar do app no ar, proteger com autenticação e RLS, monetizar com pagamento e, por fim, ligar workflows externos por webhook.
Diagrama ilustrativo — recriação conceitual das camadas de produção, não uma captura de tela real.
🛡️ Por que autenticar
Um app sem login é um app aberto: qualquer pessoa com a URL pode disparar o workflow e consumir os seus tokens de IA — e você paga pelo uso dos outros. Autenticar resolve dois problemas de uma vez: protege o uso (só usuários cadastrados acionam o backend) e protege os dados (cada um vê só o que é seu).
💡 O risco do app aberto
Enquanto o app está sem autenticação em produção, o relógio dos seus tokens roda para qualquer um. Adicionar login é o primeiro passo da "produção real" — antes de pensar em receita, você fecha a porta.
- •Uso: só usuários autenticados acionam o workflow.
- •Dados: cada usuário tem os seus, isolados dos demais.
- •Custo: você deixa de pagar pelo consumo de estranhos.
✗ App aberto em produção
- ✗Qualquer URL compartilhada vira consumo dos seus tokens.
- ✗Sem usuários, não há como isolar dados.
- ✗Sem login, não há como cobrar depois.
✓ App autenticado
- ✓Login/cadastro filtra quem aciona o backend.
- ✓Cada usuário tem dados próprios e protegidos.
- ✓Base pronta para tiers grátis e pago.
🎯 Dica prática
Não deixe um app sem autenticação no ar por muito tempo. Login é a primeira camada da produção — tudo o mais (segurança fina, pagamento) se apoia nela.
🔑 Autenticação com Supabase
O Supabase entra como provedor de banco e autenticação: em Plan Mode, você pede à IA para adicionar login/cadastro ao app usando o Supabase. Do lado da plataforma, você cria o projeto, define a senha do banco (distinta da senha de login) e escolhe a região.
Setup do Supabase
Criar o projeto
Defina a senha do banco (diferente da senha de login!) e escolha a região mais próxima dos seus usuários.
Copiar URL + publishable key
Pegue o project URL e a publishable key do Supabase para usar como variáveis de ambiente.
Adicionar como env vars no Vercel
Coloque URL e key como env vars no Vercel e redeploye para o frontend conhecer o Supabase.
⚠️ Atenção
- ✗A senha do banco não é a senha de login — guarde as duas separadamente.
- ✗Segredos só em env vars; nunca no código do frontend nem no chat.
Banco + auth prontos.
≠ senha de login.
Perto do usuário.
Env vars no Vercel.
🧱 Row-Level Security (RLS)
Row-Level Security são regras que vivem dentro do banco, não no código da interface. Elas garantem que um usuário só veja as suas próprias linhas — mesmo que haja um bug no frontend. É uma camada de defesa que não depende do código da tela estar perfeito: uma trava no nível mais profundo.
✗ Sem RLS
- ✗Um bug no frontend pode vazar dados de outro usuário.
- ✗A segurança depende inteiramente do código da tela.
- ✗Uma única falha expõe a base toda.
✓ Com RLS ativo
- ✓O banco recusa devolver linhas de outro usuário.
- ✓Defesa em profundidade: trava extra além do frontend.
- ✓Isolamento por linha, no nível mais baixo.
🧭 Defesa em profundidade
A boa segurança não confia em uma única camada. RLS soma-se à autenticação: mesmo se o login for burlado ou a tela tiver bug, o banco continua recusando o que não pertence ao usuário. Ative o RLS na tabela e teste.
🎯 Dica prática
Trate o RLS como inegociável: ative-o desde o início e confirme na auditoria de segurança que ele está ligado em todas as tabelas com dados de usuário.
Não no frontend.
Isola dados.
Defesa em profundidade.
Na tabela, e testar.
🗄️ Migração SQL & URLs de auth
Duas configurações fazem a autenticação funcionar de ponta a ponta. A migração SQL: rodar no SQL editor do Supabase o SQL gerado pela IA para criar a tabela (ex.: a tabela de leads). E as URLs de auth: configurar a URL do app (Vercel) e a redirect URL, para que o login volte corretamente para o app.
-- migração gerada pela IA create table leads ( id uuid primary key default gen_random_uuid(), user_id uuid references auth.users not null, empresa text, score int, created_at timestamptz default now() ); -- liga o Row-Level Security alter table leads enable row level security;
🗄️ Migração SQL
- •Abrir o SQL editor do Supabase.
- •Colar e rodar o SQL gerado pela IA.
- •Confirmar a tabela criada (ex.: leads).
🔗 URLs de auth
- •Definir a URL do app (a do Vercel).
- •Definir a redirect URL do login.
- •Em authentication → URL configuration.
🎯 Dica prática
Se o login "funciona" mas não volta para o app, o suspeito é quase sempre a redirect URL. Confirme que a URL do Vercel e a redirect estão exatas na configuração de auth do Supabase.
Roda a migração.
Criada por SQL.
A do Vercel.
Volta do login.
🔎 Auditoria de segurança
Antes de seguir, faça uma auditoria explícita: limpe a conversa e peça à IA para atuar como especialista em segurança e revisar o app. Uma auditoria pedida de propósito pega vulnerabilidades que passam batido no dia a dia — e dá uma lista clara do que corrigir.
O checklist da auditoria
Rotas protegidas
Confirmar que as páginas/endpoints sensíveis exigem usuário autenticado.
Nenhuma chave exposta
Garantir que nenhuma API key apareça no frontend (que roda no navegador do usuário).
Segredos só em env vars
Conferir que todos os segredos vêm de variáveis de ambiente, nunca do código versionado.
RLS ativo
Verificar que o Row-Level Security está ligado em todas as tabelas com dados de usuário.
✓ Aprovado na auditoria
- ✓Rotas sensíveis exigem login.
- ✓Nada de chave no frontend.
- ✓RLS confirmado em todas as tabelas.
✗ Bandeiras vermelhas
- ✗Endpoint acessível sem autenticação.
- ✗Secret key chegando ao navegador.
- ✗Tabela com dados de usuário sem RLS.
🎯 Dica prática
Peça a auditoria com escopo explícito ("revise rotas protegidas, chaves expostas, segredos em env e RLS"). Quanto mais específico o pedido, mais útil o relatório — e corrija tudo o que falhar antes de avançar.
💳 Stripe: modelo freemium
Com o Stripe, o app vira um SaaS: um modelo freemium com um tier grátis limitado e um tier pago por assinatura, via Stripe Checkout. A motivação é a mesma da autenticação — limitar o uso para você não pagar pelo consumo ilimitado de IA dos usuários — mas agora com receita do outro lado.
🆓 Tier grátis
Limitado — ex.: 2 qualificações de lead por dia.
- •Permite experimentar o app.
- •Limite controla o seu custo de tokens.
⭐ Tier pro
Assinatura — ex.: US$ 29/mês, qualificações ilimitadas.
- •Cobrança recorrente via Checkout.
- •Receita que sustenta o app.
🧭 De workflow a produto
O pagamento completa a transição: o que começou como "só um workflow" agora é um app que pode gerar receita. Em Plan Mode, a IA cria os pacotes, env vars, tabelas, o cliente/servidor do Stripe, a página de preços e atualiza a navbar.
🎯 Dica prática
Pense o freemium como dois objetivos casados: o tier grátis protege o seu custo e o tier pago abre receita. Defina o limite do grátis de olho no consumo real de tokens.
Grátis + pago.
Controla custo.
Recorrente.
Fluxo de pagamento.
🧾 Produto, chaves & webhook do Stripe
A integração do Stripe junta quatro peças que vêm de momentos diferentes. Você cria o produto recorrente e copia o price ID; pega as chaves (publishable + secret); cria o webhook apontando para a sua URL com os eventos certos; e roda a migração da tabela de assinaturas no Supabase.
As peças da integração
Produto recorrente + price ID
Crie um produto de assinatura mensal, defina o preço e copie o price ID.
Chaves: publishable + secret
Em developers → API keys, copie a publishable key e a secret key.
Webhook + eventos + webhook secret
Crie um endpoint apontando para a URL do Vercel + /api/stripe-webhook, ouvindo checkout.session.completed e os eventos de assinatura; copie o webhook secret.
Migração da tabela de assinaturas
Rode o SQL gerado para criar a tabela de subscriptions e adicione as quatro chaves como env vars no Vercel; redeploye.
⚠️ Atenção
- ✗Use a URL de webhook exata fornecida pela IA — não invente uma.
- ✗Mantenha um bloco de notas para colar as chaves/IDs durante o processo.
- ✗Teste o checkout com cartão de teste (data futura, CVC qualquer).
Do produto.
Publishable + secret.
Eventos + secret.
Tabela no banco.
🪝 Frontend para workflow n8n
Para dar uma interface bonita a um workflow n8n, o padrão é trocar dois nós: o primeiro (o formulário) por um Webhook trigger, e o último por um nó "Respond to Webhook". O frontend (gerado e melhorado com a skill de design) envia os dados para a URL do webhook e exibe a resposta — ligado por uma env var no Vercel.
Converter o workflow + ligar o frontend
Trocar o primeiro nó por um Webhook
Remova o nó de formulário e adicione um Webhook trigger, conectando-o à lógica existente.
Trocar o último nó por "Respond to Webhook"
Remova o nó de saída final e adicione "Respond to Webhook" para devolver a resposta ao frontend.
Publicar e copiar a URL de produção
Publique o workflow no n8n e copie a URL de produção do webhook (não a de teste).
Ligar via env var no Vercel
Adicione a URL do webhook n8n como env var no Vercel e redeploye; teste preenchendo o formulário em produção.
🎯 Dica prática
O padrão para conectar qualquer workflow n8n a um site é sempre o mesmo: troque o primeiro e o último nó por webhooks. Confirme que o workflow está publicado antes de copiar a URL — e use sempre a de produção.
Substitui o form.
Devolve a resposta.
URL publicada.
Liga no Vercel.
🪜 Iteração incremental (recap)
A jornada inteira é uma lição de iteração incremental: o app começou como um prompt de uma frase e cresceu por camadas — design → autenticação → pagamento → integração. Boa engenharia é assim: começar pequeno, publicar cedo e escalar conforme a necessidade, sem planejar tudo de uma vez.
As camadas, em ordem
App + design
Da ideia ao app no ar, com design profissional que foge da cara de IA (Módulo 4.1).
Autenticação + segurança
Usuários reais com seus dados protegidos: Supabase, RLS e auditoria.
Pagamento + integração
Receita por assinatura com Stripe e workflows externos ligados por webhook.
✓ Iteração incremental
- ✓Começar pequeno e publicar a primeira versão.
- ✓Crescer por camadas, uma feature por vez.
- ✓Colher feedback real entre as camadas.
✗ Big bang
- ✗Tentar planejar tudo antes de publicar nada.
- ✗Adicionar design, auth e pagamento de uma vez só.
- ✗Adiar o lançamento esperando a "versão perfeita".
🎯 Dica prática
Resultado da trilha: você consegue ligar um backend/lógica a um frontend bonito que pessoas realmente usam. Não precisa planejar tudo de antemão — publique pequeno e cresça por camadas.
Auto-recuperação (opcional): por que o Row-Level Security é uma camada extra de segurança?
📌 Resumo do Módulo
Fim da trilha:
Você foi do conceito a um app de verdade no ar — com automações, deploy, autenticação e pagamento. Hora de construir o seu.