Lucro real
Relatório de lucro por pedido, produto, categoria, seller ou dia, com exportação em CSV e carga do histórico.
Receita não é lucro. Este relatório desconta da receita o custo do produto, a comissão, a taxa do meio de pagamento, a diferença de frete, impostos e descontos, e mostra o lucro e a margem. Os custos são gravados como uma fotografia no momento em que cada pedido é criado e nunca mudam depois, então relatórios de meses atrás continuam batendo. Pedidos antigos, anteriores ao recurso, não têm fotografia: a rota backfill cria essas fotografias em lotes.
Relatório de lucro
/api/v1/admin/analytics/profitAdminRelatório de lucro
Parâmetros de consulta
fromstringPrimeiro dia,
YYYY-MM-DD. Padrão: 30 dias atrás. Valor inválido é ignorado em silêncio.tostringÚltimo dia,
YYYY-MM-DD, inclusive. Padrão: agora. Valor inválido é ignorado em silêncio.group_bystringpadrão: orderorderproductcategoryvendordayComo agrupar as linhas. Valor desconhecido vira
order.Exemplo de requisição (profit)
bash
curl "$BASE_URL/api/v1/admin/analytics/profit?group_by=day&from=2026-10-01&to=2026-10-10" \
-H "Authorization: Bearer $TOKEN"Resposta (profit)
200Relatório retornado
json
{
"rows": [
{
"key": "2026-10-10",
"label": "2026-10-10",
"revenue_cents": 22500,
"cogs_cents": 0,
"commission_cents": 0,
"gateway_fee_cents": 0,
"shipping_gap_cents": 0,
"tax_cents": 0,
"discount_cents": 7500,
"net_profit_cents": 15000,
"margin_bps": 6666,
"orders_count": 1
}
],
"totals": {
"key": "total",
"label": "Total",
"revenue_cents": 22500,
"cogs_cents": 0,
"commission_cents": 0,
"gateway_fee_cents": 0,
"shipping_gap_cents": 0,
"tax_cents": 0,
"discount_cents": 7500,
"net_profit_cents": 15000,
"margin_bps": 6666,
"orders_count": 1
},
"cogs_missing_pct": 16.67,
"has_fee_config": true
}Campos da resposta
rowsarrayLinhas do grupo escolhido, da maior receita para a menor.
rows[].keystringChave do grupo (id, dia ou
total).rows[].labelstringNome do grupo (número do pedido, nome do produto, categoria, seller ou o dia).
rows[].revenue_centsintegerReceita dos itens, em centavos.
rows[].cogs_centsintegerCusto dos produtos vendidos (preço de custo do cadastro), em centavos.
rows[].commission_centsintegerComissão da loja sobre o seller, em centavos.
rows[].gateway_fee_centsintegerTaxa do meio de pagamento, em centavos. Fica em zero se a loja não configurou taxas por meio de pagamento.
rows[].shipping_gap_centsintegerReservado para a diferença de frete. Hoje é sempre
0.rows[].tax_centsintegerImpostos, em centavos.
rows[].discount_centsintegerDescontos concedidos, em centavos.
rows[].net_profit_centsintegerLucro: receita menos todos os custos acima, em centavos.
rows[].margin_bpsintegerMargem em pontos-base (
6666 = 66,66%). 0 se a receita for zero.rows[].orders_countintegerPedidos no grupo.
totalsobjectSoma de todas as linhas, com os mesmos campos de
rows[].cogs_missing_pctnumberPorcentagem (0 a 100) dos itens do período sem preço de custo cadastrado. Quanto maior, menos confiável o lucro.
has_fee_configbooleantrue se a loja já configurou taxas por meio de pagamento. Sem isso gateway_fee_cents fica zerado.Erros (profit)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"view_reports"} |
| 403 | O módulo está desligado na loja. | {"error":"module_disabled","module":"analytics"} |
| 500 | Falha ao consultar os dados. | {"error":"failed to ..."} |
Exportar CSV
/api/v1/admin/analytics/profit/export.csvAdminExportar o lucro em CSV
Parâmetros de consulta
fromstringPrimeiro dia,
YYYY-MM-DD. Padrão: 30 dias atrás. Valor inválido é ignorado em silêncio.tostringÚltimo dia,
YYYY-MM-DD, inclusive. Padrão: agora. Valor inválido é ignorado em silêncio.group_bystringpadrão: categoryorderproductcategoryvendordayComo agrupar as linhas. Aqui o padrão é
category, diferente da rota JSON.Exemplo de requisição (export)
bash
curl "$BASE_URL/api/v1/admin/analytics/profit/export.csv?group_by=day&from=2026-10-01&to=2026-10-10" \
-H "Authorization: Bearer $TOKEN"Resposta (export)
200Arquivo CSV
text
key;label;revenue_brl;cogs_brl;commission_brl;gateway_fee_brl;shipping_gap_brl;tax_brl;discount_brl;net_profit_brl;margin_pct;orders
2026-10-10;2026-10-10;450,00;0,00;0,00;0,00;0,00;0,00;150,00;300,00;66.66%;2
total;TOTAL;450,00;0,00;0,00;0,00;0,00;0,00;150,00;300,00;66.66%;2Campos da resposta
(corpo)text/csvArquivo
text/csv; charset=utf-8 com BOM UTF-8, separador ; e valores em reais com vírgula decimal (450,00). A margem sai em porcentagem com ponto (66.66%). A última linha é o total. O nome do arquivo vem em Content-Disposition e muda com o idioma enviado em Accept-Language (português por padrão).Erros (export)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"view_reports"} |
| 403 | O módulo está desligado na loja. | {"error":"module_disabled","module":"analytics"} |
| 500 | Falha ao consultar os dados. | {"error":"failed to ..."} |
Carga do histórico
/api/v1/admin/analytics/profit/backfillAdminCalcular o lucro de pedidos antigos, em lotes
Exemplo de requisição (backfill)
bash
curl -X POST "$BASE_URL/api/v1/admin/analytics/profit/backfill" \
-H "Authorization: Bearer $TOKEN"Resposta (backfill)
200Lote processado
json
{
"processed": 500,
"remaining": 1830
}Campos da resposta
processedintegerPedidos processados nesta chamada (no máximo 500).
remainingintegerPedidos que ainda não têm fotografia de custos. Repita a chamada até chegar a
0.Erros (backfill)
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem o privilégio exigido. | {"error":"insufficient privileges","required":"view_reports"} |
| 403 | O módulo está desligado na loja. | {"error":"module_disabled","module":"analytics"} |
| 500 | Falha ao consultar os dados. | {"error":"failed to ..."} |