Construindo SaaS Multi-Inquilino: Espaços de Trabalho, Papéis, Cobrança e Isolamento
Como projetar espaços de trabalho, acesso baseado em papéis, níveis de cobrança e isolamento de inquilinos para SaaS escalável. Arquitetura prática da DigiForge.

SaaS multi-inquilino é a arquitetura padrão para qualquer plataforma B2B que espera crescer além de um punhado de clientes. No entanto, o diabo está nos detalhes: como você modela workspaces, atribui funções, estrutura a cobrança e isola inquilinos determina se sua plataforma escala suavemente ou desmorona sob complexidade. Na DigiForge, construímos e reconstruímos esses sistemas em dezenas de produtos SaaS. Aqui está o que aprendemos.
Workspaces: A Unidade Central de Organização
Um workspace é um contêiner lógico que agrupa usuários, dados e configuração para um único cliente (ou uma equipe dentro de um cliente). Já vimos equipes confundirem workspaces com contas de cobrança ou até mesmo com projetos — não faça isso. Mantenha o workspace como o escopo fundamental do inquilino e adicione outros conceitos por cima.
Principais decisões de design:
- Hierárquico ou plano? Algumas plataformas precisam de workspaces dentro de workspaces (ex.: uma empresa com vários departamentos). Recomendamos uma hierarquia de dois níveis: organização (entidade de cobrança) e workspace (unidade de equipe). Evite aninhamento mais profundo a menos que absolutamente necessário — isso complica a herança de funções e o acesso a dados.
- Identificadores únicos: Use um slug legível por humanos (como
acmeouacme-marketing) para o workspace nas URLs, mas sempre confie em um UUID internamente. Slugs podem mudar; UUIDs não devem. - Exclusão suave com período de carência: Excluir um workspace é uma ação drástica. Implemente uma exclusão suave de 30 dias para que os usuários possam recuperar dados. Pare a cobrança imediatamente, mas mantenha os dados até que o período de carência expire.
Quando um novo usuário se cadastra, considere o fluxo de integração. Ele deve criar um workspace primeiro ou pode explorar uma sandbox? Preferimos um fluxo guiado onde o usuário cria uma organização, depois seu primeiro workspace e, imediatamente, é solicitado a convidar colegas de equipe. Isso reduz o atrito e define a expectativa de que a plataforma é colaborativa.
Um erro comum é vincular planos de cobrança diretamente aos workspaces. Em vez disso, associe a cobrança a uma organização que contém um ou mais workspaces. Isso permite que empresas tenham uma única fatura enquanto cada equipe tem seu próprio workspace.
Funções e Permissões: Granulares, Mas Não Excessivamente
O controle de acesso baseado em funções (RBAC) é o padrão da indústria, mas a granularidade importa. Na DigiForge, geralmente começamos com três funções internas — Admin, Membro, Visualizador — e permitimos funções personalizadas para planos avançados. A função Admin tem controle total do workspace, Membros podem criar e editar a maioria dos recursos, e Visualizadores podem apenas ler.
Onde as coisas ficam complicadas é no escopo das permissões. As permissões devem ser definidas no escopo do workspace por padrão, mas você pode precisar de permissões no nível da organização (por exemplo, gerenciar cobrança) ou até mesmo acesso de leitura entre workspaces para relatórios consolidados. Modele as permissões como um conjunto de pares ação:recurso e atribua-as às funções. Armazene as atribuições em uma tabela de junção: (workspace_id, user_id, role_id).
Dica profissional: Evite verificar permissões apenas na camada de aplicação. Empurre o máximo possível da lógica de autorização para o seu banco de dados usando segurança em nível de linha (RLS) ou um mecanismo de políticas como OPA. Isso reduz a chance de um bug na sua camada web expor dados de outra pessoa.
Um padrão que nos serviu bem é armazenar em cache a função do usuário dentro de um token de sessão (JWT) em vez de consultar o banco de dados a cada requisição. Mas cuidado: se você armazenar funções em JWTs, deve ter um mecanismo para invalidar tokens quando uma função mudar (por exemplo, expiração curta do token ou uma lista de bloqueio).
Pense também sobre herança de funções: um Administrador da organização deve automaticamente ser Administrador em todos os workspaces? Nossa regra prática: as funções da organização fornecem um teto, mas as funções do workspace podem ser mais restritivas. Por exemplo, um Admin da Org pode acessar qualquer workspace, mas um Admin do workspace não pode acessar faturamento.
Modelos de Faturamento e Precificação: Meta-Dados, Não Lógica de Negócio
Faturamento é onde a multi-inquilinação se torna real. Seu modelo de precificação — por assento, por workspace, baseado em uso ou em faixas — precisa ser refletido no seu modelo de dados, mas seu sistema de faturamento deve ser desacoplado do seu aplicativo principal. Use um provedor de faturamento terceirizado (Stripe, Recurly, Chargebee) e mantenha apenas o ID da assinatura e o ID do plano no seu banco de dados.
Recomendamos a seguinte abordagem para o banco de dados:
- Uma tabela
plansque define o slug do plano, preço e flags de funcionalidades (ex.:max_users,storage_gb,api_rate_limit). - Uma tabela
organizationsque possui umcurrent_plan_ide umbilling_provider_subscription_id. Vincule organizações a workspaces por meio de uma tabela de junção. - Uma tabela
features(ou uma coluna JSON simples) que armazena sobrescritas. Por exemplo, se um cliente negociar uma taxa personalizada, sobrescreva o preço do plano no nível da organização.
A parte mais difícil é limitar o acesso com base no plano. Você tem duas opções: aplicar limites na aplicação (verificar max_users antes de convidar) ou aplicar por meio de contagens de linhas no banco de dados e triggers. Preferimos a aplicação no nível da aplicação porque produz mensagens de erro melhores para o usuário, mas sempre adicionamos um job de reconciliação noturna que sinaliza organizações que excedem seus limites.
Upgrades e downgrades de plano exigem cuidado. Quando um cliente faz upgrade, conceda acesso imediato às novas funcionalidades, mas faça o rateio da cobrança por meio do seu provedor. No downgrade, você precisa decidir: bloquear o acesso a funcionalidades que excedem o novo plano ou permitir um período de carência? Recomendamos um período de carência do ciclo de faturamento atual, após o qual você aplica as restrições.
Uma lição das trincheiras: nunca deixe que falhas de cobrança causem perda de dados. Se um pagamento falhar, degrade graciosamente (ex.: restrinja operações de escrita), mas não exclua dados. Seu cliente pagará — eventualmente.
Isolamento de Inquilinos: Compartilhado vs. Silo
O isolamento é a decisão arquitetural mais consequente. A troca padrão é entre um banco de dados compartilhado (um banco para todos os inquilinos, com uma coluna tenant_id em cada tabela) e um banco de dados por inquilino (cada workspace tem seu próprio banco de dados). Já executamos ambos e optamos por uma abordagem híbrida na maioria dos projetos.
- Compartilhado com RLS estrito: Bom para inquilinos de pequeno a médio porte (até 10 mil usuários cada). A segurança em nível de linha é nativa no Postgres, e usamos uma variável de sessão (
app.tenant_id) para filtrar cada consulta. Esta é a opção mais simples de operar e atualizar. - Banco de dados por inquilino: Necessário quando os inquilinos exigem conformidade rigorosa (HIPAA, SOC 2, residência de dados GDPR) ou quando a aplicação tem alta intensidade de I/O por inquilino. A sobrecarga operacional é real — as migrações de esquema devem ser aplicadas a centenas de bancos de dados — mas ferramentas como Flyway e CI automatizada tornam isso gerenciável.
- Esquema por inquilino: Um meio-termo usando esquemas separados dentro de um único banco de dados. Oferece mais isolamento do que uma tabela compartilhada, mas menos sobrecarga operacional do que bancos de dados completos. Usamos isso para nossos planos de nível inferior e atualizamos clientes para banco de dados por inquilino se necessário.
Independentemente da estratégia de isolamento, nunca permita acesso direto ao banco de dados a partir do cliente. Sempre roteie através de uma camada de API que imponha a identidade do inquilino. E pelo amor da sua equipe de plantão: nunca, jamais use tenant_id em URLs sem validar que o usuário autenticado pertence a esse inquilino.
A migração de dados entre níveis de isolamento é uma realidade. Por exemplo, quando um inquilino supera o banco de dados compartilhado, pode ser necessário migrá-lo para um banco de dados dedicado. Planeje isso cedo: escreva um script de migração que exporte e importe dados, e teste-o com dados semelhantes aos de produção. Deve ser possível executar sem tempo de inatividade usando uma abordagem azul-verde.
Provisionamento Automatizado: Deixe a Máquina Fazer Isso
Criar manualmente novos tenants pode funcionar para os primeiros dez clientes, mas não escala. Como o recente depósito de patente da ContractorHUB destaca, a implementação zero-touch é um diferencial chave para SaaS multi-tenant [1]. Construímos fluxos de provisionamento que automatizam tudo, desde a criação de banco de dados (ou clonagem de esquemas) até a semeadura de dados padrão e o envio de e-mails de boas-vindas.
Um pipeline típico de provisionamento automatizado:
- O usuário se cadastra, cria uma organização e seleciona um plano.
- Um webhook do seu provedor de faturamento dispara um job de provisionamento (por exemplo, uma função serverless ou um Job Kubernetes).
- O job cria a camada de isolamento do tenant (esquema ou banco de dados), executa migrações iniciais e popula funções e configurações padrão.
- Um segundo job envia um e-mail com instruções de login e próximos passos.
- O usuário é redirecionado para o novo workspace — totalmente funcional — em segundos.
Idempotência é inegociável aqui. Se o job de provisionamento falhar no meio do caminho, deve ser seguro repeti-lo. Envolvemos todo o processo em uma máquina de estados com uma coluna provisioning_status na linha da organização: pending → creating → active → failed. Estados de falha são enviados para uma fila de mensagens mortas para intervenção humana.
Não se esqueça de provisionar a infraestrutura de suporte: registros DNS para domínios personalizados, warmers de cache de CDN, limites de taxa de API por locatário e alertas de monitoramento. Automatize tudo que puder ser scriptado, porque etapas manuais serão esquecidas sob pressão.
Conclusão: A Mentalidade Multi-Inquilino
A multi-inquilino não é algo que você adiciona após o lançamento. Ela deve guiar seu modelo de dados, seu controle de acesso, sua integração de faturamento e sua estratégia de implantação desde o primeiro dia. A boa notícia: se você acertar esses quatro pilares — workspaces, funções, faturamento e isolamento —, o restante do seu SaaS se torna notavelmente mais fácil de construir e manter.
Cada SaaS é diferente, mas os padrões acima nos serviram bem em diversos setores. Quer você esteja começando seu MVP ou escalando para milhares de inquilinos, encorajamos você a refletir profundamente sobre essas decisões. E se quiser uma segunda opinião sobre sua arquitetura, estamos sempre felizes em revisar.


