SaaS e tecnologia · Dados por cliente

Dados entregues aos clientes do SaaS

Relatório de ROI, portal e extrações para cada cliente do seu SaaS saindo de um modelo só, isolado por cliente e com números que o cliente consegue conferir.

UsoMuito usado
EsforçoMédio
Para quemEmpresas de SaaS que precisam provar valor a cada cliente ou entregar a ele os próprios dados.
Fonte

Banco do produto multi-tenant, GA4 e planilhas do cliente

Regra

Um modelo parametrizado por tenant, com janela de atribuição e marcação de estimado

Resultado

Métricas de valor por tenant, isoladas e sem dado sensível

Ativação

Portal, relatório mensal, extração e agente de IA

O que resolve

  • Cada cliente recebe o mesmo cálculo de valor, sem uma query manual por pedido.
  • Nenhum cliente enxerga dado de outro, nem credencial de integração.
  • O número entregue diz quando é medido, estimado ou sem dado, e o cliente consegue conferir.

Perguntas de negócio que responde

Faça estas perguntas ao seu agente quando o caso estiver pronto.

Quanto de receita nossa ferramenta gerou para cada cliente no mês passado?
Quais clientes tiveram queda de resultado em relação ao mês anterior e precisam de conversa do CS?
Quanto o cliente economizou desde que começou a usar a automação?
Os produtos com a nossa funcionalidade vendem mais que os sem ela?
Quais clientes estão com a integração parada e por isso aparecem sem resultado?
Quanto tempo leva para colocar um cliente novo no portal?

O que você precisa

  • Banco do produto conectado na Nekt, com o id do tenant em todas as tabelas ou alcançável por chave
  • Uma tabela de configuração por tenant: id, camada de destino, data de início e fontes ativas
  • A regra de valor combinada com os clientes: janela de atribuição, linha de base e tarifa

O que você recebe

  • Tabelas por tenant, isoladas por camada e sem colunas sensíveis
  • Relatório mensal de valor com mês fechado, comparação e alertas
  • Portal ou extração para o banco do cliente alimentados pelo mesmo modelo
  • Um agente de IA que responde por cliente sem misturar dados

Onde ativar

Portal do cliente

Sincronize a camada de cada tenant para o banco do portal (Postgres, Supabase ou S3) e mostre o tipo do valor ao lado do número.

Relatório mensal de valor

Uma linha por tenant com mês fechado, comparação e alertas, que o CS leva para a reunião de resultado.

Agente de IA via MCP

Responde o CS e o próprio cliente sobre um tenant por vez, com a janela e a marcação de estimado já aplicadas.

Quer construir?

O cálculo é simples; o trabalho está em parametrizar por tenant e combinar a regra de valor. Depois disso, cada cliente novo é uma linha de configuração. O detalhado traz as regras de negócio, as armadilhas e o teste de aceitação. Ou mande tudo direto para o seu agente com o MCP da Nekt.

Ver detalhado
O problema

Clientes do SaaS pedem os próprios dados e uma prova de valor, e cada pedido vira uma query no banco de produção ou uma cópia da transformação com o id do cliente fixo no código. Há workspaces com centenas de cópias quase iguais, e um ajuste de regra precisa ser repetido em todas. Ao mesmo tempo, a métrica de valor tem detalhes que mudam o número: janela de atribuição, horário truncado pela integração, dia sem medição e tarifa ausente.

Como costuma ser feito, e a regra

Cada linha é um erro que já aconteceu na prática.

O jeito comumA regra
01
Duplicar a transformação e trocar o id literal do cliente em cada cópia.
Um modelo parametrizado, não uma cópia por cliente

Escreva a transformação uma vez com o id do tenant como coluna e leia a lista de tenants de uma tabela de configuração (id, nome de exibição, camada de destino, data de início, fontes ativas, parâmetros como janela e tarifa). Cliente novo é uma linha nessa tabela. Cópias só se justificam quando o cliente tem fonte própria que não existe para os outros, e mesmo assim chamando o mesmo cálculo.

02
Uma tabela única com todos os clientes e um filtro no painel.
A camada é a fronteira de permissão

Na Nekt, permissão se dá por camada. Entregue cada cliente numa camada própria (ou num destino próprio) e nunca numa tabela compartilhada filtrada só na leitura. A tabela consolidada com todos os tenants fica numa camada interna, visível só para o time do SaaS.

03
Copiar tabelas filhas inteiras porque não têm a coluna do tenant.
Filtre pelo tenant e propague pelas chaves

Tabelas que têm o id do tenant são filtradas direto. Tabelas filhas sem essa coluna (itens, mensagens, insights) entram pela chave estrangeira da tabela dona; tabelas de referência entram só com as linhas que os registros do tenant usam. Confira que toda tabela copiada tem caminho até o tenant.

04
Copiar a tabela inteira do banco do produto para a camada do cliente.
Remova colunas sensíveis antes de entregar

Mantenha uma lista fechada de colunas que nunca saem: client_secret, access_token, refresh_token, senhas, chaves de API e credenciais de integração. Exclua-as em toda tabela entregue, inclusive nas que vêm de conector padrão, como o client_secret do payment intent do Stripe.

05
Somar todo pedido do contato no mês como receita da ferramenta.
Atribuição com janela declarada

Receita atribuída a uma mensagem, campanha ou automação conta só pedidos do mesmo cliente final feitos depois do envio e dentro da janela combinada (um caso real usa 3 dias). Cada pedido é atribuído a um único disparo, o mais recente antes dele. Valores em centavos são divididos por 100 uma vez.

06
Comparar pedido à meia-noite com mensagem enviada às 15h e perder a atribuição do mesmo dia.
Detecte horário truncado por tenant

Algumas integrações de pedido mandam só a data, com hora 00:00:00. Para cada tenant, olhe os últimos três pedidos: se todos têm hora, minuto e segundo zerados, trate o campo como data e compare a janela em dias; senão, como timestamp. Guarde a decisão na configuração do tenant.

07
Gravar economia zero quando não há tarifa.
Sem dado é nulo, com o motivo

Se falta um insumo (tarifa não cadastrada, medidor offline, integração parada), o resultado é nulo com uma coluna de motivo, nunca zero. Distinga erro de dado de decisão deliberada: um cliente que contratou só a medição em kWh tem economia em reais nula e sem alerta, não um alerta de tarifa incompleta.

08
Preencher lacunas com um valor fixo e entregar como dado real.
Estimado aparece como estimado

Dias sem leitura podem ser preenchidos pela média do mesmo dia da semana no período real mais próximo, mas a linha leva uma marca (medido ou projetado). Nunca use um valor fixo de preenchimento. A linha de base de economia é a média por dia da semana na janela de monitoramento antes da automação; se a operação muda (por exemplo, o número de equipamentos), abra um novo regime de linha de base com data de corte.

09
Casar por nome com contém e contar o mesmo item em dois grupos.
Com e sem a funcionalidade, pelo mesmo catálogo

Para provar impacto de uma funcionalidade, divida os itens do cliente em com e sem ela a partir da lista que o próprio cliente mantém, e compare visualizações, carrinho, compra e receita no mesmo período. O cruzamento é pelo id do item; sem id, pelo nome que começa com o nome cadastrado, ficando com um único casamento, o mais específico (nome mais longo).

10
Montar o relatório a partir das tabelas derivadas e confiar no nome da tabela.
Leia as tabelas brutas da aplicação e documente as que enganam

Quando o produto grava tabelas derivadas próprias (prefixos como dw_ ou dwt_) ao lado das tabelas de aplicação, use as de aplicação, que são a fonte da verdade. Registre no context document as tabelas cujo nome engana (por exemplo, uma tabela chamada crédito que guarda cobranças), filtre soft delete (deletedAt nulo) e tire do relatório métricas cujo status nunca é preenchido na origem.

Como cada número entregue é marcado

Toda linha entregue ao cliente leva o tipo do valor, para o portal e o agente explicarem o número.

Leitura ou registro real no períodoMedidotipo_valor = medido
Lacuna preenchida pela média do mesmo dia da semanaProjetadotipo_valor = projetado
Insumo ausente por erro: tarifa, medidor, integraçãoSem dado, com alertavalor nulo, motivo preenchido
Insumo ausente por escolha do contratoNão se aplicavalor nulo, sem alerta
Pedido fora da janela de atribuiçãoNão atribuídofora da receita atribuída
Integração sem pedido novo há N diasIntegração paradaresultado não comparável

Definições

Tenant
cliente do SaaS e unidade de isolamento; uma linha na tabela de configuração com id, camada de destino, data de início, fontes e parâmetros
Receita atribuída
soma do valor dos pedidos do tenant feitos depois de um disparo e dentro da janela (ex.: 3 dias), cada pedido atribuído ao disparo mais recente, em reais, por tenant e mês
Taxa de entrega
mensagens com status enviado, entregue ou lido / mensagens disparadas, por campanha e canal
Taxa de conexão
ligações com status conectado / ligações finalizadas (exclui em preparação e em andamento), por tenant e período
Taxa de influência
pedidos entregues influenciados / base alcançável (contatos com pedido anterior ou conversa, sem opt-out de campanha), por tenant e mês
Economia
(linha de base por dia da semana menos consumo real) x tarifa da faixa horária, por tenant e dia; nula quando falta tarifa
Relatório mensal de valor
mês fechado anterior contra o mês antes dele, com delta percentual e alertas, uma linha por tenant
Impacto da funcionalidade
visualizações, carrinho, compras e receita dos itens com a funcionalidade contra os sem, no mesmo período e tenant

Armadilhas que já aconteceram

Centenas de cópias

Uma transformação por cliente cresceu para centenas de versões; uma correção de regra deixou clientes com números diferentes para o mesmo cálculo.

Parametrize por tenant e migre as cópias para o modelo único.

Prefixo de conector fixo no código

Quando cada fonte conectada gera tabelas com o id do conector no nome, o id muda entre workspaces e se a fonte for reconectada; queries com o id fixo quebram.

Resolva o prefixo atual listando as tabelas antes de consultar e nunca grave o id no context document.

Apagão do histórico por sincronização completa

Uma sincronização completa da origem apagou meses de dados brutos que não existiam mais na API, e o relatório de valor perdeu o histórico.

Guarde um backup congelado do histórico já entregue e reprocesse por cima dele.

Planilha do cliente com texto no número

Planilhas de cadastro trouxeram vírgula decimal, ponto de milhar, símbolo de moeda, células vazias e erros como #DIV/0!.

Converta com tentativa segura e transforme erro e vazio em nulo, nunca em zero.

Datas em quatro formatos

O mesmo campo de data veio como ano-mês-dia, mês/dia/ano, dia/mês/ano e mês por extenso, conforme o tenant.

Tente os formatos em ordem fixa, registre o formato por tenant e marque o que não converteu.

Calendário diferente entre motores

Dia da semana numerado de forma diferente entre Spark e Athena trocou a linha de base de dia, e feriados móveis como a Páscoa ficaram de fora.

Use um calendário único com dia útil e feriados nacionais e móveis, gerado uma vez.

Teste de aceitação

O caso está pronto quando todos os itens passam.

Pacote para o agente

Cole no Claude, ChatGPT ou outro cliente com o MCP da Nekt conectado.

Markdown completo
Dados entregues aos clientes do SaaS
- Tenant = cliente do SaaS. A lista de tenants e seus parâmetros (camada de destino, data de início, janela de atribuição, tarifa, formato de data) está na tabela de configuração de tenants.
- Toda pergunta sobre um cliente filtra um único tenant. Nunca misture tenants numa resposta para um cliente.
- A camada de cada cliente é a fronteira de permissão. A tabela consolidada é interna.
- Nunca exponha client_secret, access_token, refresh_token, senhas ou chaves de API.
- Receita atribuída: pedidos depois do disparo e dentro da janela do tenant (padrão de 3 dias), cada pedido no disparo mais recente. Valores em centavos divididos por 100.
- Tenant com horário de pedido truncado (00:00:00) compara a janela por data.
- Valor nulo significa sem dado; leia a coluna de motivo. Nulo não é zero.
- Linhas com tipo_valor = projetado são estimadas pela média do mesmo dia da semana. Diga que são estimadas.
- Relatório mensal: mês fechado anterior contra o mês antes dele.
- Use as tabelas de aplicação, não as derivadas com prefixo dw_ ou dwt_. Filtre registros com deletedAt preenchido.
- Se o conector gera tabelas com prefixo de id, descubra o prefixo listando as tabelas antes de consultar.
Exceções por cliente:
- <cliente>: janela de atribuição de <n> dias em vez de 3.
- <cliente>: contratou só a medição; economia em reais fica nula e não gera alerta.
- <cliente>: linha de base trocada em <data> por mudança na operação; antes e depois são regimes separados.

Variações

Mídia e site por cliente

Quando o conector é de uma conta por fonte, cada cliente entra como mais uma fonte no mesmo modelo, com a conversão canônica combinada (ex.: um evento de cadastro no GA4).

Extração bruta para o cliente

Em vez de métricas, a cópia filtrada das tabelas do tenant para o banco dele, com a mesma propagação por chave e a lista de colunas proibidas.

Indicadores por área interna

O mesmo desenho serve para painéis por setor: uma camada por área, com o cálculo de atingimento no pipeline e não no agente.