Atualizado em 25/10/2026
As métricas essenciais de atendimento no WhatsApp são o tempo de primeira resposta, o TMR (tempo médio de resposta), o TMA (tempo médio de atendimento) e o CSAT (satisfação do cliente). Com a API oficial, todas podem ser calculadas a partir dos timestamps que chegam nos webhooks: a hora de cada mensagem do cliente e a hora de envio de cada resposta. O app WhatsApp Business não oferece esse nível de detalhe por atendente; com a API, os dados ficam no seu banco e você mede do jeito que a operação precisa.
As métricas que importam
Os nomes variam de empresa para empresa. O importante é fixar uma definição e usar sempre a mesma:
| Métrica | Pergunta que responde | Cálculo |
|---|---|---|
| Tempo de primeira resposta (TPR) | Quanto o cliente espera pelo primeiro retorno? | Primeira resposta da empresa − primeira mensagem do cliente na conversa |
| TMR (tempo médio de resposta) | Quanto o cliente espera a cada mensagem? | Média dos intervalos entre mensagem do cliente e a resposta seguinte |
| TME (tempo médio de espera) | Quanto tempo a conversa fica na fila? | Atribuição a um atendente − entrada na fila |
| TMA (tempo médio de atendimento) | Quanto dura um atendimento? | Encerramento − início da conversa |
| CSAT | O cliente ficou satisfeito? | Avaliações positivas ÷ total de avaliações |
| Resolução no primeiro contato | Resolvemos sem o cliente voltar? | Conversas encerradas sem reabertura em X dias ÷ conversas encerradas |
| Conversas sem resposta em 24 h | Perdemos a janela? | Conversas em que o cliente ficou 24 h sem resposta ÷ total |
A última é específica do WhatsApp. Pela regra da janela de 24 horas, se a empresa não responde dentro desse prazo, só consegue retomar com template aprovado. Uma conversa que estoura a janela é, além de um cliente insatisfeito, um custo extra.
De onde vêm os timestamps
Na API oficial do WhatsApp, dois tipos de evento alimentam as métricas:
Mensagem recebida. O webhook traz messages[].timestamp, em segundos Unix (UTC), com a hora em que o cliente enviou:
{
"from": "5511999999999",
"id": "wamid.HBgLNTUx...",
"timestamp": "1792929600",
"type": "text",
"text": { "body": "Meu pedido não chegou" }
}
Status da mensagem enviada. A resposta da API ao envio devolve só o wamid, sem horário. A hora do envio chega depois, no webhook de status sent, com o mesmo id:
{
"id": "wamid.HBgLNTUx...",
"status": "sent",
"timestamp": "1792929735",
"recipient_id": "5511999999999"
}
Os status seguintes (delivered, read, failed) chegam com seus próprios timestamps. O artigo sobre status de mensagem no webhook detalha cada um.
Três cuidados para não distorcer os números:
- Use o timestamp do evento, não a hora de chegada do webhook. A Meta reenvia eventos não confirmados por até 7 dias, e eles podem chegar atrasados ou duplicados.
- Separe bot de humano. Grave em cada mensagem enviada quem a originou (
bot,atendente,automacao). Uma boas-vindas automática em 2 segundos não pode entrar no TPR do time. - Considere o horário de atendimento. Uma mensagem às 23h respondida às 8h tem 9 horas de relógio e zero de expediente. Calcule as duas versões e deixe claro qual o painel mostra.
Modelo de dados mínimo
Para calcular tudo acima, cada mensagem precisa destes campos:
| Campo | Origem |
|---|---|
wamid | messages[].id ou resposta do envio |
conversa_id | Seu sistema |
direcao | entrada ou saida |
autor | cliente, bot, atendente, automacao |
atendente_id | Seu sistema |
enviada_em | messages[].timestamp (entrada) ou status sent (saída) |
entregue_em, lida_em | Status delivered e read |
E cada conversa: aberta_em, entrou_na_fila_em, atribuida_em, encerrada_em e a nota de CSAT, se houver.
Calculando TMR e primeira resposta em SQL
Com as mensagens em PostgreSQL, a função LAG encontra, para cada resposta, a mensagem anterior do cliente. A consulta abaixo calcula, por atendente, a mediana e o percentil 90 do tempo de resposta nos últimos 30 dias:
WITH turnos AS (
SELECT
conversa_id,
autor,
atendente_id,
enviada_em,
LAG(autor) OVER w AS autor_anterior,
LAG(enviada_em) OVER w AS anterior_em
FROM mensagens
WHERE enviada_em >= now() - interval '30 days'
WINDOW w AS (PARTITION BY conversa_id ORDER BY enviada_em)
)
SELECT
atendente_id,
COUNT(*) AS respostas,
percentile_cont(0.5) WITHIN GROUP (ORDER BY enviada_em - anterior_em) AS tmr_mediana,
percentile_cont(0.9) WITHIN GROUP (ORDER BY enviada_em - anterior_em) AS tmr_p90
FROM turnos
WHERE autor = 'atendente' AND autor_anterior = 'cliente'
GROUP BY atendente_id
ORDER BY tmr_mediana;
Para o tempo de primeira resposta, pegue a primeira mensagem do cliente e a primeira do atendente em cada conversa:
SELECT
c.id,
MIN(m.enviada_em) FILTER (WHERE m.autor = 'atendente')
- MIN(m.enviada_em) FILTER (WHERE m.autor = 'cliente') AS primeira_resposta
FROM conversas c
JOIN mensagens m ON m.conversa_id = c.id
WHERE c.aberta_em >= now() - interval '30 days'
GROUP BY c.id;
Por que mediana e percentil 90, e não só a média? Porque meia dúzia de conversas esquecidas no fim de semana puxam a média para cima e escondem o comportamento normal, e a média sozinha também esconde os clientes que esperaram demais. A mediana mostra o típico; o p90 mostra quem está sendo mal atendido.
Medindo CSAT pelo próprio WhatsApp
O CSAT é a pergunta “de 1 a 5, como foi o atendimento?” enviada ao encerrar a conversa. No WhatsApp, a melhor forma é uma mensagem interativa, porque o cliente toca em vez de digitar e a resposta chega estruturada. Botões de resposta aceitam até três opções; para uma escala de 1 a 5, use uma lista. A documentação de listas permite até 10 linhas, títulos de até 24 caracteres e texto do botão de até 20.
{
"messaging_product": "whatsapp",
"to": "5511999999999",
"type": "interactive",
"interactive": {
"type": "list",
"body": { "text": "Seu atendimento foi encerrado. Como você avalia a ajuda que recebeu?" },
"action": {
"button": "Avaliar",
"sections": [{
"title": "Sua nota",
"rows": [
{ "id": "csat_5", "title": "5 - Excelente" },
{ "id": "csat_4", "title": "4 - Bom" },
{ "id": "csat_3", "title": "3 - Regular" },
{ "id": "csat_2", "title": "2 - Ruim" },
{ "id": "csat_1", "title": "1 - Muito ruim" }
]
}]
}
}
}
A resposta chega como type: "interactive" com interactive.list_reply.id igual ao id da linha escolhida. Grave a nota na conversa.
Detalhes que fazem diferença:
- Envie logo após o encerramento. A janela de 24 horas ainda está aberta, então não precisa de template.
- Uma pergunta só. Se a nota for 1 ou 2, pergunte o motivo em seguida e encaminhe para um supervisor.
- Calcule CSAT como percentual de notas 4 e 5. E acompanhe a taxa de resposta: um CSAT alto com poucas respostas diz pouco.
- Custo. Desde 1º de outubro de 2026, mensagens de serviço são cobradas a partir da 1.001ª entregue no mês, por número, segundo a página de preços da Meta. Coloque a pesquisa na conta.
Para NPS e pesquisas depois da entrega do produto, quando a janela já fechou, veja pós-venda e NPS pelo WhatsApp.
Como definir metas
Este artigo não traz “benchmarks do mercado” de propósito: números genéricos dizem pouco sobre a sua operação. Um caminho mais útil:
- Meça duas a quatro semanas sem mudar nada. Esse é o ponto de partida.
- Defina a meta pelo percentil, não pela média. Exemplo: “90% das primeiras respostas em até X minutos dentro do expediente”.
- Trate a janela de 24 horas como teto absoluto. A meta de “conversas sem resposta em 24 h” deve ficar perto de zero.
- Separe por fila e por horário. Vendas e suporte têm ritmos diferentes; segunda de manhã não é igual a quinta à tarde.
- Revise todo mês. Meta batida com folga vira a nova linha de base.
Indicadores do lado da Meta
Além das métricas de atendimento, acompanhe dois indicadores que a própria Meta calcula:
- Qualidade do número. Verde, amarelo ou vermelho, com base em bloqueios e denúncias dos últimos dias. Atendimento lento e mensagens fora de contexto pioram esse indicador. Veja qualidade do número na API.
- Entrega e leitura. Percentual de mensagens
deliveredereadsobre as enviadas. Queda brusca costuma indicar problema de número, de template ou de lista.
Como fazer isso com a Vectalk
Na Vectalk, os webhooks de mensagem e de status são os da Meta, com os mesmos timestamp usados acima; registre sua URL com POST /api/webhooks e grave os eventos no seu banco. Para conferir ou reconstruir dados, GET /api/messages lista o histórico com filtros de data, status, direção e messageId. Para os indicadores agregados (enviadas, entregues, lidas, falhas, taxas e qualidade do número), use GET /api/analytics/instances/{instanceId}/stats, com agrupamento por dia, semana ou mês. As métricas de atendimento por atendente (TMR, TMA, CSAT) dependem dos dados do seu sistema, como no exemplo. Detalhes em docs.vectalk.com.br; cadastro em apps.vectalk.com.br/register.
Para montar a operação que gera esses números, veja multiatendimento com a API e mensagens de boas-vindas e ausência.
Perguntas frequentes
Qual a diferença entre TMR e TMA?
O TMR mede quanto o cliente espera a cada mensagem até receber resposta. O TMA mede a duração total do atendimento, do início ao encerramento. Uma operação pode ter TMR baixo e TMA alto, por exemplo quando o problema exige várias trocas de mensagem.
A resposta do bot conta no tempo de resposta?
Depende do que você quer medir. Para a experiência do cliente, conta. Para avaliar o time, não. Por isso vale gravar o autor de cada mensagem e calcular as duas versões.
Posso usar o timestamp da resposta da API em vez do webhook de status?
A resposta do envio não traz horário, só o wamid. Você pode usar a hora do seu servidor no momento do envio como aproximação, mas o status sent é o registro da Meta e é mais consistente.
Como medir o CSAT se o cliente não responde a pesquisa?
Conte a taxa de resposta separadamente e não preencha notas ausentes. Se poucas pessoas respondem, teste mudar o momento do envio ou o texto da pergunta.
Dá para tirar essas métricas do app WhatsApp Business?
Não com esse nível de detalhe. O app não registra quem respondeu nem quanto tempo cada atendente levou. As métricas por atendente exigem a API e um sistema que guarde os eventos.
Fontes oficiais consultadas em 25/10/2026: Webhook de mensagens, Visão geral de webhooks, Mensagens interativas de lista, Preços da plataforma, Docs da Vectalk: estatísticas da instância, Docs da Vectalk: listar mensagens.
