
🧠 Business Case: Os produtos que mais vendem também são os que mais retêm clientes?
Business Case: Os produtos que mais vendem também são os que mais retêm clientes?
Um estudo de análise de dados aplicado a uma rede fictícia de pet shops, usando SQL (BigQuery) e Power BI para responder uma pergunta real de negócio.
O Problema
Durante uma reunião de resultados, o diretor comercial de uma rede de pet shops trouxe a seguinte dúvida: "Nós sabemos quais são os produtos mais vendidos. Mas será que são esses produtos que fazem os clientes voltarem a comprar?"
A empresa investia em promoções e campanhas com base em volume de vendas, sem saber se isso realmente construía relacionamento de longo prazo com o cliente ou apenas gerava receita pontual.
O Que os Dados Mostraram
Os dados revelaram três métricas independentes lideradas por três produtos diferentes. O Petisco Bifinho lidera em volume, com 2.766 pedidos. A Ração Premium Cães Adultos lidera em receita, com R$ 689 mil faturados. E o Antipulgas Pipeta Gatos lidera em retenção, com 70,2% dos clientes voltando a comprar.
A categoria do primeiro produto comprado se mostrou o principal preditor do valor do cliente ao longo do tempo. Clientes que estreiam com Ração Premium Filhotes apresentam LTV médio de R$ 1.459, quase o dobro dos clientes que estreiam com Areia Sanitária, cujo LTV médio é de R$ 798.
Dashboard Completo

Explore os dados por categoria, produto e taxa de retenção. De 5.153 clientes analisados, 64,5% retornam para uma nova compra, o que confirma que a retenção é a métrica central para entender o real valor de cada produto no negócio.
Como a Análise Foi Construída
Toda a análise foi construída em SQL no BigQuery, partindo da base de vendas da rede. O processo passou por identificar a primeira compra de cada cliente, classificar clientes como recorrentes ou não recorrentes, e cruzar produto, categoria e status de recompra para calcular taxas de retenção e LTV médio por segmento.
- Classificação de cliente recorrente Essa é a base de tudo. Sem definir "o que é um cliente retido", nenhuma métrica depois faz sentido. É a query que qualquer analista vai querer ver primeiro, porque valida se sua definição de retenção é sólida.
SELECT
status_cliente,
COUNT(*) AS qtd_clientes
FROM (
SELECT
id_cliente,
CASE
WHEN COUNT(DISTINCT id_venda) > 1 THEN 'Recorrente'
ELSE 'Não Recorrente'
END AS status_cliente
FROM varejopet.conjunto01.vendas
GROUP BY id_cliente
)
GROUP BY status_cliente;
- Taxa de retenção por produto da primeira compra Essa é a query mais importante do projeto inteiro. Ela é literalmente a resposta técnica à pergunta do diretor: junta a primeira compra de cada cliente com o status de retenção dele, e calcula a taxa por produto. É aqui que nasce o achado do Antipulgas Pipeta Gatos com 70% de retenção.
WITH cliente_resumo AS (
SELECT
id_cliente,
MIN(data_venda) AS data_primeira_compra,
CASE WHEN COUNT(DISTINCT id_venda) > 1 THEN 'Recorrente' ELSE 'Não Recorrente' END AS status_cliente
FROM varejopet.conjunto01.vendas
GROUP BY id_cliente
),
itens_primeira_compra AS (
SELECT
v.id_cliente,
v.produto,
v.categoria,
cr.status_cliente
FROM varejopet.conjunto01.vendas v
INNER JOIN cliente_resumo cr
ON v.id_cliente = cr.id_cliente
AND v.data_venda = cr.data_primeira_compra
)
SELECT
produto,
categoria,
COUNT(DISTINCT id_cliente) AS total_clientes_primeira_compra,
ROUND(SUM(CASE WHEN status_cliente = 'Recorrente' THEN 1 ELSE 0 END) / COUNT(DISTINCT id_cliente) * 100, 2) AS taxa_retencao_pct
FROM itens_primeira_compra
GROUP BY produto, categoria
ORDER BY total_clientes_primeira_compra DESC;
- Taxa de retenção por categoria É a mesma lógica da anterior, mas agregada em categoria. Vale mostrar separada porque prova que você sabe reaproveitar uma CTE para responder duas perguntas de negócio diferentes (produto vs. categoria), o que é um sinal de organização de raciocínio, não só de sintaxe.
WITH cliente_resumo AS (
SELECT
id_cliente,
MIN(data_venda) AS data_primeira_compra,
CASE WHEN COUNT(DISTINCT id_venda) > 1 THEN 'Recorrente' ELSE 'Não Recorrente' END AS status_cliente
FROM varejopet.conjunto01.vendas
GROUP BY id_cliente
),
itens_primeira_compra AS (
SELECT
v.id_cliente,
v.categoria,
cr.status_cliente
FROM varejopet.conjunto01.vendas v
INNER JOIN cliente_resumo cr
ON v.id_cliente = cr.id_cliente
AND v.data_venda = cr.data_primeira_compra
)
SELECT
categoria,
COUNT(DISTINCT id_cliente) AS total_clientes_primeira_compra,
ROUND(SUM(CASE WHEN status_cliente = 'Recorrente' THEN 1 ELSE 0 END) / COUNT(DISTINCT id_cliente) * 100, 2) AS taxa_retencao_pct
FROM itens_primeira_compra
GROUP BY categoria
ORDER BY taxa_retencao_pct DESC;