Lucratividade: visão geral
Quanto custa adquirir um cliente, quanto ele retorna e quando o investimento se paga: métricas de lucratividade, séries temporais e coortes de retenção.
O que esta análise responde
A API de Lucratividade cruza o faturamento da sua loja com o investimento em mídia paga (Meta Ads e Google Ads) para mostrar se a aquisição e a retenção de clientes dão lucro. Todos os valores derivados de receita podem ser convertidos em margem de contribuição, de acordo com a margem configurada pela organização na plataforma V4MOS.AI.
Perguntas que você consegue responder:
- Quanto custa adquirir um cliente novo (CAC)? E quanto custa cada venda (CPV)?
- O valor que um cliente gera ao longo da vida (LTV) paga o custo de adquiri-lo (LTV/CAC)?
- Qual é o retorno do investimento em mídia (ROI) e em quantos meses ele se paga (payback)?
- Quantos clientes compram pela primeira vez e quantos voltam a comprar?
- Quanto da receita de cada safra de clientes volta nos meses seguintes?
- Quais produtos, canais, campanhas ou cupons de entrada trazem os clientes que mais recompram?
- Quanto o custo real das mercadorias (CMV) consome da receita?
Qual endpoint usar
| Pergunta | Endpoint |
|---|---|
| Quais são os indicadores consolidados do período e como eles se comparam ao período anterior? | GET /v1/profitability/cards |
| Quantos clientes novos e recorrentes compraram em cada dia ou mês? | GET /v1/profitability/new-vs-recurring |
| Como CAC, LTV, CPV, receita e investimento evoluíram mês a mês? | GET /v1/profitability/metrics-evolution |
| Quanto foi o CMV e o ticket médio em cada dia? | GET /v1/profitability/cmv-evolution |
| Quantos clientes (ou quanta receita) de cada safra voltam nos meses seguintes? | GET /v1/profitability/cohort |
Endpoints disponíveis
- getCards de resumo de lucratividade
/v1/profitability/cardsRetorna os indicadores consolidados de lucratividade da organização no período: faturamento, investimento em mídia, pedidos, clientes,… - getClientes novos vs. recorrentes ao longo do tempo
/v1/profitability/new-vs-recurringRetorna uma série temporal com clientes novos (primeira compra no período do ponto) e recorrentes (já tinham comprado antes) que fizeram… - getEvolução das métricas de lucratividade
/v1/profitability/metrics-evolutionRetorna uma série mensal com CAC, LTV, CPV, LTV/CAC, receita, pedidos, investimento, clientes novos e o bloco de CMV real de cada mês. - getEvolução diária do CMV
/v1/profitability/cmv-evolutionRetorna uma série diária com receita, pedidos, ticket médio e o custo real das mercadorias vendidas (CMV) de cada dia, com os mesmos… - getAnálise de safras de lucratividade
/v1/profitability/cohortRetorna uma matriz de retenção por coorte: cada linha agrupa clientes pelo início da relação com a loja e cada coluna mostra quanto deles…
Autenticação
Envie os headers x-client-id e x-client-secret em toda requisição, junto com o query parameter organizationId. Veja Autenticação.
Parâmetros comuns
Todos os endpoints usam a base URL https://data.v4mos.ai e aceitam os parâmetros abaixo.
| Parâmetro | Obrigatório | Formato | Descrição |
|---|---|---|---|
organizationId | Sim | texto | Identificador da organização. Sem ele a API responde 400. |
startDate | Não | YYYY-MM-DD | Primeiro dia do período (inclusivo). |
endDate | Não | YYYY-MM-DD | Último dia do período (inclusivo). |
O endpoint /cohort aceita ainda view, groupBy e breakBy (veja Coortes).
startDate e endDate só são aplicados quando enviados juntos. Se um deles faltar, a API considera todo o histórico da organização. Envie sempre datas de calendário puras (2025-01-31), sem horário.
- Parâmetros desconhecidos na query resultam em
400. - Valores fora da lista permitida em
view,groupByoubreakBytambém resultam em400.
Exemplos
# Indicadores consolidados de janeiro a março de 2025
curl "https://data.v4mos.ai/v1/profitability/cards?organizationId=SUA_ORG&startDate=2025-01-01&endDate=2025-03-31" \
-H "x-client-id: SEU_CLIENT_ID" \
-H "x-client-secret: SEU_CLIENT_SECRET"
# Evolução mensal das métricas em 2025
curl "https://data.v4mos.ai/v1/profitability/metrics-evolution?organizationId=SUA_ORG&startDate=2025-01-01&endDate=2025-12-31" \
-H "x-client-id: SEU_CLIENT_ID" \
-H "x-client-secret: SEU_CLIENT_SECRET"
# Retenção de receita por safra, com colunas trimestrais
curl "https://data.v4mos.ai/v1/profitability/cohort?organizationId=SUA_ORG&startDate=2024-01-01&endDate=2024-12-31&view=revenue&groupBy=quarter" \
-H "x-client-id: SEU_CLIENT_ID" \
-H "x-client-secret: SEU_CLIENT_SECRET"Métricas
Valores monetários estão na moeda da loja, arredondados em 2 casas decimais. "× margem" significa multiplicar por marginPercent / 100 (veja Margem de contribuição).
Indicadores gerais (/cards, /metrics-evolution)
| Campo | O que significa | Como é calculado | Unidade |
|---|---|---|---|
revenue / totalRevenue | Faturamento bruto | Soma da receita dos pedidos | moeda |
investment / totalInvestment | Investimento em mídia paga | Soma do gasto em Meta Ads e Google Ads | moeda |
orders / totalOrders | Pedidos | Quantidade de pedidos | contagem |
newCustomers | Clientes novos | Clientes cuja primeira compra caiu no período | contagem |
recurringCustomers | Clientes recorrentes | Clientes que compraram no período e já tinham comprado antes dele | contagem |
customers | Clientes ativos | newCustomers + recurringCustomers | contagem |
recurringOrders | Pedidos de recompra | Pedidos de clientes que já tinham comprado antes daquele pedido | contagem |
averageTicket | Ticket médio | revenue ÷ orders | moeda |
contribution | Margem de contribuição | revenue × margem | moeda |
contributionProfit | Lucro de contribuição | contribution − investment | moeda |
cpv | Custo por venda | investment ÷ orders | moeda |
cpr | Custo por recompra | investment ÷ recurringOrders | moeda |
cac | Custo de aquisição de cliente (médio) | investment ÷ clientes novos | moeda |
ltv | Valor do cliente ao longo da vida, para clientes adquiridos no período | Média da receita total por cliente × margem | moeda |
ltvLifetime | LTV de toda a base de clientes, sem filtro de período | Média da receita total por cliente × margem | moeda |
retentionLtv | Parte do LTV que vem das recompras | Média da receita após o mês da primeira compra × margem | moeda |
ltvCacRatio | Quantas vezes o LTV paga o CAC | ltv ÷ cac | razão (ex.: 5.43 = 5,43×) |
roi | Retorno sobre o investimento em mídia | (contribution − investment) ÷ investment | razão (ex.: 1.19 = 119%) |
clv | Valor líquido por cliente após o custo de aquisição | ltv − cac (pode ser negativo) | moeda |
payback | Meses até a margem acumulada de uma safra pagar o custo de aquisição | Média ponderada pelo número de clientes das safras que já se pagaram | meses |
conversionRate | Conversão da etapa Interesse para a etapa Decisão do funil configurado | Decisão ÷ Interesse × 100 | % (0–100) |
Indicadores por estratégia de campanha (/cards)
Dependem da classificação de campanhas feita na plataforma V4MOS.AI (aquisição, marca, monetização).
| Campo | O que significa | Como é calculado | Unidade |
|---|---|---|---|
campaignCac | CAC considerando só o investimento em campanhas de aquisição | Investimento de aquisição ÷ todos os clientes novos | moeda |
acquisitionInvestment | Investimento em campanhas classificadas como aquisição | Soma do gasto | moeda |
acquisitionNewCustomers | Clientes novos trazidos pelas campanhas de aquisição | Contagem por atribuição (UTM) da primeira compra | contagem |
acquisitionCac | CAC das campanhas de aquisição | acquisitionInvestment ÷ acquisitionNewCustomers | moeda |
acquisitionContribution | Margem gerada pelos clientes dessas campanhas | Receita desses clientes × margem | moeda |
acquisitionLtv | LTV médio dos clientes dessas campanhas | Média da receita total por cliente × margem | moeda |
acquisitionLtvCacRatio | LTV/CAC das campanhas de aquisição | acquisitionLtv ÷ acquisitionCac | razão |
acquisitionRoi | ROI das campanhas de aquisição | (acquisitionContribution − investimento) ÷ investimento | razão |
brandInvestment | Investimento em campanhas de marca | Soma do gasto | moeda |
brandImpressions | Impressões das campanhas de marca | Soma das impressões | contagem |
brandNewCustomers | Clientes novos atribuídos a campanhas de marca | Contagem por atribuição da primeira compra | contagem |
brandContribution | Margem gerada por esses clientes | Receita desses clientes × margem | moeda |
brandRoi | ROI das campanhas de marca | (brandContribution − investimento) ÷ investimento | razão |
monetizationInvestment | Investimento em campanhas de monetização (venda para a base) | Soma do gasto | moeda |
monetizationContribution | Margem dos pedidos atribuídos a campanhas de monetização | Receita desses pedidos × margem | moeda |
monetizationRoi | ROI das campanhas de monetização | (monetizationContribution − monetizationInvestment) ÷ monetizationInvestment | razão |
monetizationRecurringCustomers | Clientes recorrentes com pedido atribuído a campanha de monetização | Contagem de clientes distintos | contagem |
monetizationCpr | Custo por recompra das campanhas de monetização | monetizationInvestment ÷ recompras atribuídas a elas | moeda |
unclassifiedInvestment | Investimento em campanhas sem classificação | Soma do gasto | moeda |
hasAcquisitionClassification | Se a organização já classificou alguma campanha como aquisição (em qualquer período) | — | booleano |
Custo das mercadorias (/cards, /metrics-evolution, /cmv-evolution)
| Campo | O que significa | Como é calculado | Unidade |
|---|---|---|---|
cogs | Custo real das mercadorias vendidas (CMV) | Soma do custo informado pela plataforma de e-commerce, só nos pedidos que têm custo | moeda |
revenueWithCmv | Receita dos pedidos que têm CMV real | Soma da receita | moeda |
revenueWithoutCmv | Receita dos pedidos sem CMV real | revenue − revenueWithCmv | moeda |
marginBasis | De onde veio a margem do período | cmv_real, mixed, configured_percent ou no_basis | texto |
blendedContribution | Margem de contribuição usando o CMV real onde existe e a margem configurada no restante | Veja Regras importantes | moeda |
Coortes (/cohort)
| Campo | O que significa | Como é calculado | Unidade |
|---|---|---|---|
cohortMonth | Safra: mês da primeira compra dos clientes da linha | — | data (YYYY-MM-01) |
initialValue | Tamanho da safra no mês 0 | Clientes (view=logo) ou receita × margem (view=revenue) | contagem ou moeda |
months.{n}.pct | Retenção no período n em relação ao mês 0 | valor no período n ÷ valor no mês 0 | decimal (0.52 = 52%) |
months.{n}.absolute | Valor retido no período n | Clientes ou receita × margem | contagem ou moeda |
months.{n}.complementary | A métrica da outra visão para a mesma célula | Receita × margem na visão logo; clientes na visão revenue | moeda ou contagem |
months.{n}.repurchaseRevenue | Receita bruta de recompra no período n | Soma da receita, sem margem (nula no mês 0) | moeda |
acquisitionInvestment | Investimento em mídia do mês da safra | Soma do gasto | moeda |
roi (linha) | Retorno da safra no mês de entrada | (receita do mês 0 × margem − acquisitionInvestment) ÷ acquisitionInvestment | razão |
directRevenue / directMargin | Receita da primeira compra (bruta / × margem) | Soma no mês 0 | moeda |
totalRevenue / totalMargin | Receita total da safra até hoje (bruta / × margem) | Soma de todos os períodos | moeda |
additionalRevenue / additionalMargin | Receita das recompras (bruta / × margem) | total − direct | moeda |
firstPurchaseCustomers | Clientes que entraram pela linha (produto, canal, campanha ou cupom) | Contagem | contagem |
repurchaseCustomers | Desses, quantos voltaram a comprar | Contagem | contagem |
repurchasePct | Taxa de recompra | repurchaseCustomers ÷ firstPurchaseCustomers × 100 | % (0–100) |
investment, cac, ltv, payback, roi | Economia da linha em breakBy=origem (e ltv em todas as quebras por dimensão e por produto) | Veja a página do endpoint | variadas |
Regras importantes
Margem de contribuição
A organização pode configurar na plataforma a margem de contribuição, isto é, o percentual da receita que sobra depois dos custos variáveis (produto, impostos, frete, meios de pagamento). Toda resposta que usa essa margem informa:
marginPercent: o percentual aplicado (0–100).marginConfigured:truese a organização configurou uma margem;falsese não configurou.marginCompleteness:complete,partialounone. Indica se a margem foi montada item a item (gateway, imposto, frete e CMV) e se todos os itens estão resolvidos.nonequando não há composição por item.marginItemStatus: status de cada item (synced= vem dos pedidos,configured= informado pelo usuário,pending= não configurado ou sem dados).nullquando não há composição por item.
Sem margem configurada, a API usa marginPercent = 100 e marginConfigured = false. Nesse caso, campos como contribution, ltv e roi refletem a receita bruta, não a margem real. Verifique marginConfigured antes de apresentar esses números como lucro.
| Multiplicados pela margem | Não usam a margem |
|---|---|
contribution, contributionProfit, ltv, ltvLifetime, retentionLtv, ltvCacRatio, roi, clv, acquisitionContribution, acquisitionLtv, acquisitionLtvCacRatio, acquisitionRoi, brandContribution, brandRoi, monetizationContribution, monetizationRoi, valores de receita das coortes (absolute em view=revenue, initialValue, *Margin, ltv, roi) | revenue, investment, orders, contagens de clientes, averageTicket, cpv, cpr, cac, campaignCac, acquisitionCac, monetizationCpr, conversionRate, *Revenue das coortes, repurchaseRevenue, percentuais de retenção (pct) |
O percentual de retenção (pct) não muda com a margem, porque ela se cancela na divisão.
null não é 0
Muitos campos podem vir null. null significa "não foi possível calcular" (não há base, a divisão não está definida ou o dado não está disponível), enquanto 0 é um valor medido. Mostre um traço ou "N/D" para null e nunca o converta em 0.
Exceção: nos indicadores gerais de /cards (cac, cpv, cpr, roi, ltvCacRatio, campaignCac, averageTicket), uma divisão por zero retorna 0. Por exemplo, cac = 0 com newCustomers = 0 significa que não houve cliente novo, não que o custo foi zero. Já acquisitionCac, acquisitionRoi, brandRoi, monetizationRoi e monetizationCpr retornam null nessas situações.
Comparação com o período anterior
Em /cards, quando startDate e endDate são enviados, a resposta inclui:
previousPeriod: os mesmos indicadores calculados para o período imediatamente anterior, com o mesmo número de dias. Exemplo: para 01/03 a 31/03 (31 dias), o período anterior é 29/01 a 28/02.changes: a variação percentual de cada indicador:(atual − anterior) ÷ anterior × 100. Cada campo énullquando o valor anterior é0ounull.
Exceções: ltv e retentionLtv não usam o período anterior. Eles comparam a base de clientes adquirida até o fim do período selecionado com a base adquirida até o início dele. margin é a margem configurada, que não depende do período, então sua variação é sempre 0.
Sem startDate/endDate, previousPeriod e changes vêm null.
Granularidade das séries temporais
| Endpoint | Granularidade |
|---|---|
/new-vs-recurring | Diária para períodos de até 31 dias, respeitando exatamente as datas pedidas. Mensal para períodos maiores ou sem datas, com o período expandido para meses inteiros. O campo granularity informa qual foi usada. |
/metrics-evolution | Sempre mensal. O período é expandido para meses inteiros. |
/cmv-evolution | Sempre diária. Um ponto por dia com venda, cliente novo ou investimento. |
/cohort | Safras mensais. O período filtra os meses de entrada, expandido para meses inteiros. |
Nas séries mensais, o campo month é o primeiro dia do mês (2025-03-01). Na série diária de /new-vs-recurring, o mesmo campo month traz o próprio dia.
Coortes
view:logo(padrão) mede retenção por número de clientes;revenuemede por receita × margem.groupBy:month(padrão),quarterousemester. Muda apenas o tamanho das colunas de período (M1, M2… viram T1, T2… ou S1, S2…). As linhas continuam sendo safras mensais. A coluna 0 é sempre o mês de entrada.breakBy:cohort(padrão, uma linha por safra mensal),product(uma linha por produto da primeira compra),origem(canal),campanhaoucupom. Nas quebras diferentes decohort, cada cliente começa no seu próprio mês 0, independentemente do mês do calendário.
Maturação: uma célula cujo período ainda não terminou no calendário (o mês atual ainda está acumulando) vem com maturing: true. O valor dela é parcial e tende a crescer. Na quebra cohort com groupBy=month esse campo não é enviado.
- Com
breakBy=product, as linhas se sobrepõem: um cliente cujo primeiro pedido tem vários produtos entra em várias linhas. Não some as linhas (overlappingRows: true). - Com
breakBy=origem|campanha|cupom, cada cliente cai em exatamente uma linha, então as linhas podem ser somadas (overlappingRows: false). Clientes sem valor identificado entram na linhaSem origem,Sem campanhaouSem cupom. - A atribuição de clientes a campanhas e cupons depende das UTMs e cupons registrados nos pedidos. Exiba sempre o campo
coveragejunto dos números para indicar quanto da base foi atribuída. - Com
groupBy=quarter|semestereview=logo, as contagens somam clientes de cada mês. Um cliente ativo em vários meses do mesmo trimestre conta uma vez por mês, então o número é um teto de clientes distintos. As somas de receita são exatas.
CMV real e blendedContribution
Quando a plataforma de e-commerce informa o custo dos produtos, a API separa a receita em duas partes: com CMV real (revenueWithCmv) e sem CMV real (revenueWithoutCmv).
marginBasis | Situação | blendedContribution |
|---|---|---|
cmv_real | Todos os pedidos do período têm CMV real | revenueWithCmv − cogs |
mixed | Parte dos pedidos tem CMV real | (revenueWithCmv − cogs) + revenueWithoutCmv × margem; null se não houver margem configurada |
configured_percent | Nenhum pedido tem CMV real, mas há margem configurada | revenue × margem (igual a contribution) |
no_basis | Não há CMV real nem margem configurada | null |
Se a margem foi configurada item a item e está completa (marginCompleteness = complete), cada parte desconta seus próprios custos (gateway, imposto, frete e CMV) em vez do percentual único.
contribution continua sendo sempre revenue × margem, mesmo quando há CMV real. Quando marginBasis vem null, os dados de custo não estavam disponíveis no momento da consulta, o que é diferente de no_basis. Em /cmv-evolution, essa situação é sinalizada por degraded: true com data: [].
Base de cálculo dos clientes
newCustomerserecurringCustomersem/cardsrespeitam exatamente as datas pedidas.recurringCustomers(clientes que já tinham comprado antes do início do período) erecurringOrders(pedidos de quem já tinha comprado antes daquele pedido) medem coisas diferentes. Não divida um pelo outro.cacusa o investimento total em mídia.campaignCacusa só campanhas de aquisição, mas divide por todos os clientes novos.acquisitionCacrestringe os dois lados às campanhas de aquisição. São três CACs diferentes, de propósito.- As quatro fatias de investimento por estratégia (
acquisitionInvestment + brandInvestment + monetizationInvestment + unclassifiedInvestment) somam o investimento das campanhas da organização, mas podem diferir ligeiramente deinvestmentpor diferença de atualização e porque ajustes de gasto zerados ou negativos entram nas fatias e não eminvestment.
Erros
| Status | Quando acontece |
|---|---|
400 | organizationId ausente, parâmetro desconhecido ou valor inválido em view, groupBy ou breakBy. |
401 | Credenciais ausentes ou inválidas. Veja Autenticação. |