← blog/desenvolvimento-saasEN
    // blog/desenvolvimento-saas.md

    Desenvolvimento de SaaS

    O que muda quando seu software deixa de servir um cliente e passa a servir muitos — multi-tenancy, RLS e as decisões que não dá pra desfazer.

    2026-05-09·8 min de leitura·produto·POSTEP Digital

    org_id em toda tabela · RLS no banco, não no app · terceirize billing · decida cedo o que não dá pra desfazer

    // 01

    O problema

    Construir software para um cliente é diferente de construir um produto. No primeiro, você resolve um problema específico, com regras de negócio conhecidas e um único conjunto de usuários. No segundo, você precisa servir N empresas que não se conhecem — e não podem se ver.

    A primeira vez que tentamos transformar uma feature de cliente em produto, descobrimos que quase nada do código era reutilizável. Schema, autenticação, permissões, billing, onboarding — tudo precisava ser repensado.

    O que parecia uma extensão era um projeto novo.

    // 02

    O que muda quando vira SaaS

    A diferença real entre um app de cliente e um SaaS multi-tenant não está no frontend. Está na forma como os dados são isolados, no modelo de auth e na fronteira entre o que é da plataforma e o que é da empresa que assina.

    // comparativo
    App de cliente
    1 banco, 1 conjunto de usuários
    regras fixas, definidas no contrato
    deploy específico por cliente
    sem cobrança recorrente
    onboarding manual ou inexistente
    SaaS multi-tenant
    1 banco, N organizações isoladas
    configuração por org, não por contrato
    1 deploy serve todos os clientes
    Stripe, planos, limites por tier
    onboarding self-service do zero
    // 03

    Multi-tenancy: o coração do problema

    Toda decisão de SaaS começa por aqui: como duas empresas dividem o mesmo banco sem nunca verem os dados uma da outra. A escolha errada nesse ponto custa um rewrite no segundo cliente.

    // modelo que adotamos
    tabela organizations
    cada empresa é uma org com id próprio
    toda tabela tem org_id
    vendas, leads, comissões — tudo amarrado à org
    RLS no Supabase
    política USING (org_id = auth.jwt()->org_id)
    resultado
    isolamento garantido pelo banco, não pelo app

    Quando o isolamento depende do código do frontend, basta um bug numa query para vazar dados entre clientes. Com RLS, mesmo um SELECT * sem filtro retorna apenas o que a org logada pode ver.

    // 04

    A stack que escolhemos

    Construir SaaS sozinho ou em equipe pequena exige uma stack que reduza decisões. Cada peça tem um motivo concreto — quase sempre porque elimina código de infraestrutura que não agrega valor pro produto.

    React + Vite + TanStack Routertipagem ponta a ponta, rotas type-safe, build rápido o suficiente pra iterar várias vezes por dia
    Tailwind v4sistema de design sem sair do JSX, zero CSS órfão, theming via CSS vars
    Supabase (Postgres + Auth + RLS)banco real, auth pronto, isolamento por org via policy — sem inventar middleware de permissão
    Edge Functionslógica server-side que precisa de chave secreta (Stripe, e-mails, integrações) sem subir um backend separado
    Stripecheckout, billing recorrente, webhooks. Em produto SaaS, terceirizar cobrança é não-negociável
    N8Ntudo que é ops — relatório, notificação, sync — vira workflow em vez de código no app

    Nenhuma dessas peças é opinião — são consequência de duas regras: (1) não escrever o que dá pra terceirizar, (2) deixar o banco resolver o que pode resolver.

    // 05

    As decisões que custam caro depois

    Algumas escolhas no início são quase invisíveis e se tornam impossíveis de reverter quando o produto já tem clientes pagantes. Vale parar e decidir antes de a primeira linha de código.

    auth model

    user pertence a 1 org? a várias? convite por e-mail? Mudar isso depois quebra todo schema de permissão

    billing unit

    cobra por usuário, por uso ou por plano fixo? Define schema de planos e limites — refatorar é doloroso

    onboarding flow

    self-service ou liberação manual? Define tudo: signup, criação de org, trial, ativação de Stripe

    data export

    cliente pediu pra sair com os dados, você consegue? GDPR e LGPD exigem — pensar antes evita correria depois

    feature flag

    como liberar funcionalidade pra alguns clientes sem subir branch? Decidir cedo evita if(orgId === 'X') no código

    Nenhuma dessas decisões precisa estar perfeita no MVP. Mas todas precisam estar conscientes — escolha errada por desconhecimento é a única que machuca de verdade.

    // 06

    Por onde começar

    semana 1

    Defina o problema com um único cliente real. Quem é, o que dói, quanto pagaria. Sem cliente concreto, qualquer SaaS é hipótese.

    semana 2

    Modele o schema com org_id em todas as tabelas desde o primeiro CREATE TABLE. Crie políticas de RLS antes de qualquer query no app.

    semanas 3–4

    MVP funcional: signup → criar org → fluxo principal → 1 caso de uso completo. Sem Stripe ainda. Foco é validar o uso, não cobrar.

    mês 2

    Stripe + planos + limites. Onboarding self-service. Logs de uso por org. A partir daqui é produto, não protótipo.

    mês 3+

    Iterar com base no que os primeiros 3 clientes fazem (e o que não fazem). Cortar features que ninguém usa. Ouvir o pedido recorrente.

    // regra principal

    SaaS não é tecnologia — é distribuição de software com cobrança recorrente. Se o seu produto não resolve um problema que alguém pagaria todo mês para resolver, nenhuma stack salva. Comece pelo cliente, não pelo schema.

    escrito por
    POSTEP Digital
    ← ver todos os posts