Esquema de CRM leve para equipes pequenas que permanece simples
Crie um esquema de CRM leve que mantenha Contatos, Negócios, Atividades e permissões simples, enquanto ainda suporta relatórios confiáveis e fluxos de trabalho diários.

Que problema este esquema de CRM deve resolver
Uma equipe pequena precisa de um CRM que responda rápido às perguntas do dia a dia: com quem estamos falando, o que estamos tentando fechar, o que aconteceu por último e o que vem a seguir. Esse é o trabalho real de um esquema de CRM leve. Tudo o que não suporta essas perguntas costuma ser ruído.
Equipes pequenas raramente precisam de hierarquias complexas de contas, dezenas de objetos personalizados ou modelos complicados de pontuação. Elas precisam de propriedade clara, um histórico simples de interações e um pipeline que todo mundo entenda do mesmo jeito.
"Simples" se quebra quando depende de texto livre e duplicatas. Se uma pessoa escreve um estágio de negócio como "Negotiation" e outra escreve "negotiating", o relatório vira um palpite. Se atividades vivem em tabelas separadas para chamadas, reuniões e notas, você acaba com múltiplos campos de data e sem um valor confiável de “último contato”.
Este esquema se mantém em quatro objetos principais que cobrem a maior parte dos CRMs de equipes pequenas sem virar um monstro:
- Contatos (e opcionalmente organizações) como as pessoas com quem você fala
- Negócios como as oportunidades que você acompanha em um pipeline
- Atividades como um registro unificado para tarefas, reuniões, chamadas e notas
- Permissões como regras práticas sobre quem pode ver e editar o quê
Relatórios limpos significam que você pode ver com confiança negócios por estágio nesta semana, taxa de conversão entre estágios, tempo médio em estágio, última atividade por negócio e as tarefas abertas de cada representante para hoje. Esses relatórios ainda devem fazer sentido quando a equipe cresce de 3 para 15 pessoas.
Se você está construindo um CRM interno em uma ferramenta no-code como AppMaster, essa abordagem mantém o banco de dados pequeno enquanto ainda entrega números estáveis para dashboards e revisões semanais.
Princípios para permanecer leve sem se prender
Um esquema de CRM leve funciona quando responde claramente a uma pergunta: onde este fato vive? Se a mesma “verdade” pode ser armazenada em dois lugares, ela será, e seus relatórios vão divergir.
Escolha um pequeno conjunto de objetos fonte da verdade e faça todo o resto apontar para eles. Para a maioria das equipes pequenas, isso significa Contatos, Organizações (opcional), Negócios e Atividades. Quando precisar de mais detalhe, adicione uma nova tabela em vez de enfiar significado em um único campo de texto que vira uma gaveta de tralha.
Algumas regras mantêm o modelo simples e flexível:
- Um fato, um lar: um telefone pertence ao Contact, o valor de um negócio pertence ao Deal.
- Prefira tabelas explícitas a campos sobrecarregados: histórico de estágio não é uma string separada por vírgula.
- Mantenha IDs estáveis e nomes editáveis: pessoas renomeiam empresas, elas não mudam chaves primárias.
- Separe “status” de “tipo”: uma tarefa pode ser “open” e “call” ao mesmo tempo.
- Pressupõe que imports serão bagunçados: campos em branco, duplicatas e formatações estranhas são normais.
Planeje dados bagunçados desde o primeiro dia adicionando alguns campos chatos, mas poderosos: created_at, updated_at, e um simples external_id (ou import_source + import_key) nas suas tabelas principais. Isso dá uma maneira segura de reimportar sem criar duplicatas.
Um exemplo concreto: você importa uma planilha onde “Acme Inc.” aparece como “ACME” em metade das linhas. Se Organization.name for editável e Organization.id for estável, você pode mesclar registros depois sem quebrar negócios e atividades existentes.
Contatos e organizações: a estrutura mais simples que funciona
Um esquema de CRM leve começa com uma decisão: você rastreia apenas pessoas, ou pessoas mais empresas? Se sua equipe vende para negócios, quase sempre vale ter tanto Contact (uma pessoa) quanto Organization (uma empresa). Se você vende para consumidores, pode pular organizações e manter cada registro como um contato.
Para um setup B2B, mantenha a relação simples: cada contato pertence a uma organização primária (nullable), e uma organização pode ter muitos contatos. Isso cobre a maioria dos fluxos de trabalho de equipes pequenas sem empurrar para hierarquias de contas complicadas.
Mantenha campos obrigatórios mínimos
A maneira mais rápida de obter dados bagunçados é tornar muitos campos obrigatórios. Uma boa linha de base é:
- Contact:
id, name (oufirst_name+last_name),created_at - Organization:
id,name,created_at
Todo o resto (cargo, site, endereço, setor, origem) pode ser opcional. Você pode adicionar regras depois, mas é difícil limpar um banco cheio de placeholders como "N/A".
Email e telefone: unicidade sem dor
É tentador tornar o email único. Isso funciona bem para B2C, ou para um CRM que também é seu sistema de login. Em equipes pequenas B2B, caixas de entrada compartilhadas (sales@, info@) e números reutilizados são comuns. Regras rígidas de unicidade podem bloquear registros válidos.
Um compromisso prático:
- Aplique unicidade apenas quando o valor estiver presente (e só se fizer sentido para seu caso de uso).
- Permita duplicatas, mas mostre um aviso suave na interface quando uma correspondência for encontrada.
Se você precisa de múltiplos emails ou telefones, evite colunas como email_2 ou phone_3. Use uma tabela separada em vez disso (por exemplo, ContactMethod com type, value, is_primary). Assim os relatórios permanecem limpos e o modelo escala naturalmente.
Exemplo: sua equipe encontra Pat, que troca de emprego no meio do trimestre. Com Contact ligado a Organization, você pode mover Pat para a nova empresa, manter métodos de contato antigos para histórico e seus relatórios ainda contam negócios por empresa corretamente.
Negócios e pipelines: estrutura que continua legível
Um negócio é sua unidade de previsão: uma possível compra com um próximo passo claro. Mantenha o registro do negócio enxuto e referencie todo o resto.
Comece com campos que você consiga explicar para qualquer pessoa da equipe:
- Deal name: um rótulo curto que faça sentido em uma lista
- Stage: referência a um estágio do pipeline (não digitado à mão)
- Value: valor esperado (e escolha uma moeda para todo o sistema)
- Owner: a pessoa responsável por movê-lo adiante
- Close date: a melhor estimativa atual de quando irá fechar
Para relacionamentos, escolha um contato principal no negócio. Isso mantém os relatórios diretos (por exemplo, receita por contato, taxa de conversão por segmento). Se às vezes precisar de mais pessoas envolvidas, adicione uma tabela deal_contacts para anexar contatos extras sem transformar todo negócio em um many-to-many complexo. A maioria das equipes pequenas vai bem com 1 contato primário mais participantes opcionais.
Os estágios são onde CRMs frequentemente ficam bagunçados. Não armazene estágio como texto livre. Armazene estágios como dados de referência para que você possa renomear um estágio depois sem quebrar relatórios. Uma tabela mínima de estágios pode conter:
stage_idpipeline_idstage_namestage_orderis_closed(ou flags separadas para won e lost)
Se sua equipe é pequena, evite dividir registros em “lead” e “deal” a menos que você realmente gerencie leads de forma diferente. Uma regra simples funciona: quando você tem uma oportunidade real que vale a pena acompanhar, é um deal. Antes disso, mantenha como um contato com um status como “new” ou “nurture”. Isso mantém o pipeline legível e evita que negócios pela metade poluam seus números.
Exemplo: uma equipe de vendas de duas pessoas registra “Acme Renewal” como um negócio com owner Sam, estágio “Proposal Sent”, valor 12.000, data de fechamento no mês que vem. O contato primário é o comprador, e um segundo contato é adicionado como aprovador financeiro. Relatórios permanecem consistentes porque nomes e ordenação dos estágios são fixos.
Atividades: um modelo para tarefas, reuniões e notas
Uma equipe pequena não precisa de tabelas separadas para chamadas, emails, reuniões e notas. Um modelo Activity único costuma ser suficiente, e torna o CRM mais fácil de usar e de reportar.
Uma única tabela Activity
Use um registro por coisa que aconteceu (ou deva acontecer). Dê a ele um campo simples type com um conjunto pequeno e fixo, como: call, email, meeting, note, task. Mantenha a lista curta para que as pessoas escolham as mesmas palavras sempre.
Para vincular atividades sem confusão, use regras claras:
- Se for sobre uma pessoa (follow-up, email de apresentação), vincule ao contact.
- Se for sobre mover receita (chamada de preço, reunião de negociação), vincule ao deal.
- Se realmente envolver ambos, vincule aos dois, mas trate o deal como primário para relatórios de pipeline.
Na prática, Activity pode ter contact_id (nullable) e deal_id (nullable), mais um owner_id opcional (quem é responsável).
Timestamps pensados para relatório
Mantenha tanto due_at quanto completed_at. Eles respondem perguntas diferentes. due_at mostra o que deveria ter acontecido (planejamento e carga de trabalho). completed_at mostra o que aconteceu de fato (execução e tempo de ciclo).
Você pode derivar o status sem um campo separado: se completed_at estiver preenchido, está feito. Se não, está aberto. Isso evita valores de status extras que ficam fora de sincronia.
Para o texto da atividade, armazene um campo pesquisável como summary ou body. Evite estruturar demais notas desde cedo. Exemplo: “Call with Maya: confirmed budget, send proposal Friday.” Adicione campos especializados depois apenas quando sentir dor real.
Propriedade e visibilidade: mantenha prático
Propriedade é quem é responsável pelo próximo passo. Em um esquema de CRM leve, isso geralmente significa um campo como owner_user_id no negócio (e muitas vezes em contatos também).
Dois significados de “owner” costumam se misturar: atribuição a usuário (uma pessoa específica) e atribuição a time (um grupo). Se você tenta fazer tudo como propriedade de time desde o início, perde clareza sobre quem deve agir hoje.
Um padrão que funciona para a maioria das equipes pequenas é: tudo visível para todos, mas todo negócio tem exatamente um owner. A colaboração fica fácil, e você evita casos de permissão quando alguém precisa cobrir um colega.
Quando precisar de visibilidade mais rígida, mantenha como um único interruptor, não uma matriz complexa. Por exemplo, adicione um campo visibility em negócios e atividades com valores como public e private, onde private significa “apenas o owner (e admins) podem ver”.
Você só precisa de times ou territórios quando uma destas for verdadeira:
- Você tem grupos separados que não devem ver os negócios uns dos outros.
- Você reporta performance por time e as pessoas mudam de time.
- Gerentes precisam acessar seu grupo, mas não a empresa inteira.
- Você atribui leads a uma fila compartilhada antes de um representante reivindicá-los.
A propriedade afeta relatórios. Se quiser números limpos “por representante”, reporte pelo owner_user_id atual no negócio. Se também quiser agregados “por time”, adicione owner_team_id (ou derive do perfil do owner), mas seja explícito sobre qual é a fonte da verdade.
Exemplo: dois representantes compartilham uma caixa de entrada. Um novo negócio começa sem dono com owner_user_id = null e owner_team_id = Sales. Assim que Alex o assume, defina owner_user_id = Alex (mantenha o time como Sales). Seu pipeline permanece legível e os totais por time ainda funcionam.
Design de permissões: controle suficiente sem complexidade
Comece com RBAC simples
Permissões funcionam melhor quando você separa três ideias: roles (quem), resources (o quê) e actions (o que podem fazer). Isso é role-based access control (RBAC), e continua compreensível conforme a equipe cresce.
Mantenha resources próximos aos seus objetos centrais: Contacts, Organizations, Deals, Activities e talvez Pipelines (se estágios forem editáveis). Defina um pequeno conjunto consistente de ações entre eles: view, create, edit, delete, export.
Exportar vale separação. Muitas equipes aceitam direitos amplos de visualização, mas querem limitar extrações de dados em massa.
Permissões a nível de objeto são o lugar mais fácil para começar: “Esse papel pode editar negócios?” Para a maioria das equipes pequenas, isso basta por meses. Regras a nível de registro (por contato ou por negócio) é onde a complexidade aparece, então adicione só quando houver necessidade real.
Um passo prático inicial é uma regra única de propriedade: cada registro tem owner_user_id, e não-admins podem editar apenas o que possuem. Se precisar de mais uma camada, adicione team_id e permita visualização por time mantendo edição restrita ao owner.
Regras por registro quando realmente precisar
Adicione permissões por registro para casos como:
- Representantes de vendas não devem ver os negócios uns dos outros
- Suporte pode visualizar negócios mas nunca editá-los
- Gerentes podem ver tudo e reatribuir owners
Mantenha necessidades de auditoria leves, mas reais. Adicione created_at, created_by, updated_at e updated_by em cada tabela principal. Se precisar de histórico mais profundo depois, adicione uma pequena tabela audit_log com: object type, record id, action, who, when, e um JSON curto dos campos alterados.
Passo a passo: construa o esquema em um fim de semana
Isso fica mais fácil quando você trata como um pequeno produto: defina os dados primeiro, prove que funciona com entradas reais e depois construa telas.
Dia 1: trave o modelo de dados
Comece com um esboço ERD rápido em papel ou quadro. Mantenha o número de tabelas pequeno, mas seja claro sobre os links: contact pertence a uma organization (opcional), deal pertence a um pipeline e tem um owner, activity pode relacionar-se a um contact e/ou a um deal.
Depois faça o básico na ordem:
- Defina objetos e relacionamentos: contacts, organizations, deals, activities, users/roles, mais pequenas tabelas de lookup se necessário.
- Defina campos obrigatórios e padrões: torne
created_at,owner_ide nomes chave obrigatórios; defina padrões para estágio e moeda se usar valores. - Defina enums ou tabelas de lookup: estágios de negócio e tipos de atividade para manter relatórios consistentes.
- Adicione índices para filtros comuns:
owner_id, stage,due_at,created_ate chaves estrangeiras que você filtra diariamente. - Teste com 20 registros reais: use nomes, datas e notas bagunçadas para ver o que quebra.
Dia 2: prove que os relatórios ficam limpos
Antes de construir formulários, escreva 6–8 perguntas que sua equipe faz toda semana. Por exemplo: “Negócios em Negotiation por owner”, “Atividades atrasadas”, “Novos contatos este mês”, “Receita ganha por mês”. Se uma pergunta precisar de joins confusos ou casos especiais, corrija o esquema agora.
Um cenário de teste simples ajuda: adicione 3 contatos em uma empresa, 2 negócios em estágios diferentes e 6 atividades entre eles (uma chamada, uma reunião, duas tarefas e duas notas). Então verifique se você consegue responder quem é o dono, qual é o próximo passo e o que mudou na semana passada sem adivinhação.
Com os dados sólidos, construa a interface e automações por último. Você vai avançar mais rápido e não precisará reescrever o histórico depois para fazer os relatórios baterem com a realidade.
Erros comuns que deixam os relatórios bagunçados
Relatórios bagunçados geralmente começam com “gambiarras” que parecem mais rápidas hoje, mas custam toda semana depois. Um esquema de CRM leve funciona melhor quando seus dados têm formas claras e algumas regras que a equipe realmente segue.
Uma armadilha comum é forçar tudo em uma tabela “customer”. Parece simples até você precisar responder perguntas básicas como “Quantos negócios estão ligados a uma empresa?” ou “Qual pessoa mudou de emprego?”. Separe pessoas (contacts) e empresas (organizations) e conecte-as.
Outro assassino de relatório é deixar estágios de negócio em texto livre. Se alguém digita “Negotiation” e outro “negotiating”, o gráfico do pipeline já está errado. Use uma lista fixa de estágios (ou uma tabela de estágios) para que todo negócio aponte para o mesmo conjunto.
Evite empacotar múltiplos valores em um campo. Emails ou telefones separados por vírgula tornam busca, deduplicação e exportações dolorosas. Se realmente precisar de múltiplos valores, armazene-os como linhas separadas (por exemplo, um email por registro numa tabela filha).
Atividades ficam bagunçadas quando as datas são ambíguas. Um único campo “date” não diz se uma tarefa venceu na sexta passada ou foi concluída na sexta passada. Separe esses conceitos para que você possa reportar trabalho atrasado e trabalho concluído corretamente.
Aqui vai um checklist rápido para “salvar o você do futuro”:
- Separe contacts e organizations, depois conecte-os
- Use IDs de estágio, não nomes digitados
- Um valor por campo; use uma tabela filha para múltiplos
- Mantenha
due_atecompleted_atcomo campos distintos - Comece com funções simples; adicione regras por registro só depois de ver fluxos reais
Exemplo: se sua equipe registra chamadas como notas e depois marca como “feito” editando o mesmo campo, você não conseguirá reportar quanto tempo os follow-ups levaram. Com campos separados, esse relatório fica direto.
Checklist rápido antes de confirmar o esquema
Antes de construir telas, automações e dashboards, faça uma verificação rápida de relatórios e regras. Um esquema de CRM leve permanece leve só se você conseguir responder perguntas comuns sem gambiarras ou campos pontuais.
Passe por estes checagens usando dados de exemplo reais (mesmo 20 contatos e 10 negócios já é suficiente). Se travar, geralmente falta um campo, uma picklist consistente ou um relacionamento solto demais.
As 5 checagens que pegam a maior parte dos problemas
- Fundamentos de relatório: você consegue agrupar negócios por estágio, por owner e por mês de fechamento sem adivinhar qual campo de data usar?
- Gestão de trabalho: você consegue puxar “atividades atrasadas por owner” em um relatório, onde atraso é baseado em uma única data de vencimento e um status feito claro?
- Contato para organização: um contato pode existir sem organização, e pode ser vinculado depois sem quebrar histórico (emails, notas, participação em negócios)?
- Consistência: estágios e tipos de atividade vêm de uma lista fixa, para não acabar com “Follow up”, “Follow-up” e “Followup” como três valores diferentes?
- Segurança: você consegue restringir quem pode deletar registros ou exportar listas, sem bloquear atualizações normais como mover um negócio para o próximo estágio?
Se você responde “sim” para os cinco, está em um bom lugar. Se não, corrija agora enquanto o esquema ainda é pequeno.
Uma dica prática: defina estágios e tipos de atividade uma vez (como tabela ou enum) e reutilize em todo lugar para que cada tela e processo use os mesmos valores.
Um exemplo realista para equipes pequenas e próximos passos
Uma agência de 5 pessoas é um bom teste para um esquema de CRM leve. A equipe está ocupada, leads vêm de todo lugar e ninguém quer passar tempo arrumando dados. Imagine: 1 admin, 2 vendas, 1 responsável por operações e 1 colega com acesso somente leitura (o fundador que só checa números).
Um novo pedido inbound chega (formulário web ou email): “Precisa de renovação de site, orçamento $15k, prazo 6 semanas.” A regra é simples: crie uma organização (se for empresa) e um contato (a pessoa). Depois crie um negócio ligado à organização, com o contato como contato primário desse negócio.
Para manter rápido, eles usam um checklist de entrada pequeno:
- Se o domínio ou nome da empresa coincidir com uma organization existente, reutilize-a.
- Se o email da pessoa existir, reutilize esse contato.
- Sempre crie um negócio para intenção de compra real.
- Coloque a mensagem original na descrição do negócio.
- Adicione a origem (referral, form, outbound) como um campo único.
Atividades evitam chamadas perdidas porque todo próximo passo vira um item datado com um responsável. Quando vendas faz uma call de discovery, registram uma atividade como meeting e já adicionam a próxima: uma chamada dois dias depois. Se operações precisa de detalhes para orçar o trabalho, cria uma tarefa activity no mesmo negócio para que tudo apareça em um único lugar.
As funções permanecem práticas: Admin pode editar tudo e gerenciar configurações, Sales pode criar e atualizar contatos, negócios e suas atividades, Ops pode atualizar campos relacionados à entrega e atividades, e Read-only pode ver pipeline e relatórios sem alterar dados.
Se quiser transformar isso em uma ferramenta interna funcional rápido, AppMaster (appmaster.io) é uma opção direta: você pode modelar o esquema no Data Designer (PostgreSQL), adicionar regras de workflow no editor Business Process, construir uma caixa de entrada de leads simples e uma página de negócio, então publicar no AppMaster Cloud ou na sua própria nuvem quando estiver pronto para compartilhar com a equipe.
FAQ
Comece com quatro objetos centrais: Contatos (pessoas), Organizações (empresas opcionais), Negócios (oportunidades) e Atividades (um log unificado). Se cada pergunta que sua equipe faz mapear para um desses, você terá velocidade sem quebrar os relatórios.
Use Organizações se você vende B2B e precisa de relatórios por empresa, ou se múltiplos contatos pertencem ao mesmo cliente. Pule Organizações para B2C ou quando “pessoa” for tudo o que você vende, mantendo tudo em Contatos.
Evite texto livre para estágios porque variações de escrita e nomeação arruinarão os painéis. Use uma lista fixa (uma tabela de estágios) e armazene um ID de estágio em cada negócio para que você possa renomear estágios depois sem alterar dados históricos.
Mantenha campos obrigatórios mínimos: um ID, um nome e created_at para contatos e organizações, além de campos principais do negócio como estágio, owner, valor e data de fechamento. Campos opcionais são aceitáveis; muitos campos obrigatórios geram valores de preenchimento como “N/A”.
Não bloqueie duplicatas rigidamente a menos que isso faça sentido para seu fluxo. Um padrão prático é permitir duplicatas, mas mostrar um aviso quando um email ou telefone similar for encontrado, e adicionar um external_id (ou chaves de importação) para que reimportações não criem registros extras.
Use uma única tabela Activity com um pequeno conjunto fixo em type como call, email, meeting, note, task. Isso torna “último toque”, trabalho pendente e histórico de atividades consistentes porque tudo compartilha os mesmos timestamps e estrutura.
Armazene ambos due_at e completed_at porque respondem a perguntas diferentes. due_at serve para planejamento e relatórios de atraso; completed_at serve para execução e análise de tempo de ciclo. Misturá-los torna ambos os relatórios pouco confiáveis.
Padrão para um contato primário por negócio para manter os relatórios claros e a interface simples. Se você precisar de mais pessoas envolvidas às vezes, adicione uma tabela deal_contacts para participantes em vez de transformar todo negócio em um many-to-many complexo desde o início.
Um bom padrão é: tudo visível para todos, mas cada negócio tem exatamente um owner responsável pelos próximos passos. Se precisar de privacidade depois, adicione um campo simples visibility como public/private em vez de construir uma matriz de permissões complicada desde o começo.
Modele as tabelas primeiro, depois teste com dados reais antes de construir telas. Se você não conseguir responder facilmente perguntas comuns como negócios por estágio, atividades em atraso e último contato por negócio, corrija o esquema enquanto ele ainda é pequeno.


