API do Trackeado
Pra bots de venda no Telegram, checkouts, gateways e plataformas. Se você já manda vendas pra UTMify, já fez 90% do trabalho: o mesmo JSON funciona aqui, só troca a URL e o token. Por cima dele aceitamos o que a UTMify não tem: o usuário do Telegram, o lead do /start, os dados do clique pros pixels e as renovações de assinatura.
Como funciona
- O seller gera o token do Trackeado (começa com
sxt_) no painel dele e cola no seu painel, num card "Trackeado" do lado da UTMify. - O link do anúncio continua sendo o seu (redirect, presell,
t.me/bot?start=). A gente não cria link nenhum, então nada conflita com o seu rastreio. - No /start do bot você manda o lead com as UTMs e o clique (
POST /leads). - A cada mudança da venda (PIX gerado, pago, reembolsado…) você manda o pedido (
POST /orders), com olead_id. - A venda aparece no Tracker do seller atribuída a campanha, conjunto e anúncio, com o lucro e o ROAS do dia, e o celular dele toca na venda paga.
URL base (versão 2026-11-01):
https://api.shopixpay.app/functions/v1/trackerO card no seu painel (do lado da UTMify)
Se o seu painel já tem a tela de Trackeamento com cards (Facebook, UTMify, TikTok, Kwai), o Trackeado é mais um card, com a mesma tela de config da UTMify:
| No seu painel | O que fazer |
|---|---|
| Card | Título "Trackeado", subtítulo "Tracking de vendas". Logo oficial: trackeado.com/marca/trackeado/trackeado-icone.svg (quadrado) ou trackeado-horizontal.svg. |
| Status da config | Desligado = você para de mandar eventos daquela config. |
| Nome da config | Livre, só no seu painel (ex.: "Tracker Funil Vick"). |
| Fluxos vinculados | Os eventos dos fluxos marcados vão com o token desta config. Mande o fluxo no campo flow (id e name). |
| Token API | Placeholder "sxt_xxxxxxxxxxxx". Valide o formato: sxt_ + 48 caracteres hexadecimais minúsculos (52 no total). |
| Botão Testar | GET /ping com o token. 200 = mostre "Conectado à conta <loja.nome>". 401 = "Token inválido ou revogado". Diferente da UTMify, a gente tem teste de credencial. |
| Contadores (eventos, R$ trackeados) | Conte do seu lado as respostas 200 de /leads e /orders. |
https://api.shopixpay.app/functions/v1/tracker/orders, o header continua x-api-token, e some os blocos telegram, lead_id, click e flow no corpo. Depois ligue o /leads no /start.Seller com página própria (script)
Esta API é pra plataformas que mandam os eventos do servidor (bots, checkouts, gateways). O seller que tem página de vendas própria instala também o script do Trackeado: uma linha só, colada no <head> da página, que guarda as UTMs e os ids de clique e leva tudo até a venda. O seller copia o script pronto, já com a conta dele, em trackeado.com/comecar.
click do /leads.Token e autenticação
Igual UTMify: o token vai no header x-api-token. Também aceitamos Authorization: Bearer. Um token por conta. Ele diz de qual seller é a venda.
x-api-token: sxt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx401: avise o seller pra colar o novo. O seller pega o token em Tracker › Conectar vendas.GET /ping: testar conexão
Use no botão "Testar" do seu painel. Devolve o nome da conta, pra mostrar ao seller que o token está certo.
curl https://api.shopixpay.app/functions/v1/tracker/ping -H "x-api-token: sxt_..."
{ "ok": true, "loja": { "id": "1d7e...", "nome": "Conta da Maria" }, "versao": "2026-11-01" }POST /leads: o /start do bot
Mande quando a pessoa chega no bot (ou entra no canal/grupo). Guardamos a campanha do lead: o pedido que vier depois só com o lead_id já sai atribuído, inclusive as renovações de assinatura meses depois. Se o mesmo lead clicar em outro anúncio, o último clique com campanha vence.
| Campo | Tipo | Descrição |
|---|---|---|
| lead_idobrigatório | texto | Id do lead no seu sistema. Se faltar, usamos telegram.user_id (um dos dois é obrigatório). |
| event | texto | click, start, message, plan_view, checkout, pix_generated, member_joined, member_left, blocked, unsubscribed. Outro valor vira "lead". |
| platform | texto | Nome da sua plataforma. |
| telegram | objeto | Mesmo bloco do pedido. start_param é o mais importante. |
| trackingParameters | objeto | UTMs do clique do anúncio (mesmo formato do pedido). |
| click | objeto | ip (IPv4 ou IPv6; prefira IPv6), user_agent, fbclid, fbc, fbp, ttclid, ttp, gclid, click_id (Kwai), landing_page. Sem hash. |
| created_at | data UTC | Quando aconteceu. Se faltar, usamos a hora em que chegou. |
| isTest | booleano | true só valida, não grava. |
curl -X POST https://api.shopixpay.app/functions/v1/tracker/leads \
-H "x-api-token: $TRACKEADO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"event": "start",
"platform": "SeuBot",
"lead_id": "987654321",
"created_at": "2026-11-01 14:30:05",
"telegram": {
"user_id": 987654321,
"username": "maria_souza",
"first_name": "Maria",
"last_name": "Souza",
"language_code": "pt-br",
"is_premium": false,
"start_param": "c_8f3a91b2",
"bot_username": "lojadamaria_bot"
},
"trackingParameters": {
"utm_source": "FB",
"utm_medium": "cpc",
"utm_campaign": "Campanha X|120210000000000001",
"utm_content": "Criativo 07|120210000000000003",
"utm_term": "Conjunto A|120210000000000002",
"src": null,
"sck": null
},
"click": {
"ip": "177.10.20.30",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) ...",
"fbclid": "IwAR2xY...",
"fbc": "fb.1.1761999000000.IwAR2xY...",
"fbp": "fb.1.1761998990000.1234567890",
"landing_page": "https://seubot.com.br/l/abc123"
}
}'{ "ok": true, "lead_id": "987654321", "evento": "start", "novo": true }POST /orders: a venda
Mesmo formato da API da UTMify (api-credentials/orders). Mande uma vez por mudança de status, sempre com o mesmo orderId.
Campos da UTMify (iguais)
| Campo | Tipo | Descrição |
|---|---|---|
| orderIdobrigatório | texto | Id da venda no seu sistema (até 120). Chave da venda: mandar de novo com outro status atualiza a mesma venda. Também aceitamos transaction_id ou order_id. |
| statusobrigatório | texto | waiting_payment, paid, refused, refunded ou chargedback (os da UTMify). Também aceitamos pending, approved, canceled, expired. |
| products[]obrigatório | lista | id, name, planId, planName, quantity, priceInCents. O valor da venda é commission.totalPriceInCents ou a soma de priceInCents × quantity. |
| paymentMethod | texto | pix, credit_card, boleto, paypal ou free_price. |
| createdAt | data UTC | "AAAA-MM-DD HH:MM:SS" em UTC (igual UTMify) ou ISO 8601 com fuso. Mande sempre o mesmo createdAt pra mesma venda. |
| approvedDate / refundedAt | data UTC | Quando pagou / quando reembolsou. |
| customer | objeto | name, email, phone (com DDI), document (CPF), country, ip. Tudo opcional: bot sem e-mail pode mandar vazio (não precisa inventar e-mail). |
| trackingParameters | objeto | utm_source, utm_medium, utm_campaign, utm_content, utm_term, src, sck. Formato da casa: "Nome|id" (o id da Meta depois do |). |
| commission | objeto | totalPriceInCents, gatewayFeeInCents, userCommissionInCents, currency (BRL, USD…). |
| isTest | booleano | true valida o corpo e grava como venda de teste (fora dos relatórios e sem notificação). |
Campos extras do Trackeado (opcionais)
| Campo | Tipo | Descrição |
|---|---|---|
| platform | texto | Nome da sua plataforma (ex.: SharkBot). Mostramos no Tracker de onde veio a venda. |
| lead_id | texto | Id do lead que você mandou em /leads (padrão: o telegram.user_id). Pedido sem UTM herda a campanha do lead: é assim que a renovação de assinatura continua atribuída ao anúncio. |
| telegram | objeto | user_id, username, first_name, last_name, language_code, is_premium, start_param, bot_username. |
| click | objeto | ip (IPv4 ou IPv6; prefira IPv6), user_agent, fbclid, fbc, fbp, ttclid, ttp, gclid, click_id (Kwai), landing_page: o que a sua página de redirect capturou antes do Telegram. Sem hash. |
| subscription | objeto | subscription_id, renewal_index (0 = primeira cobrança), period_days, expires_at. |
| parent_order_id | texto | orderId do pedido principal, em upsell, downsell ou order bump. |
| flow | objeto | id e name do fluxo/funil do seu bot que gerou a venda. Mostramos no Tracker. |
| sale_type | texto | front, upsell, downsell, order_bump ou renewal. Se faltar, deduzimos por parent_order_id e renewal_index. |
curl -X POST https://api.shopixpay.app/functions/v1/tracker/orders \
-H "x-api-token: $TRACKEADO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"orderId": "ped_7f3a2c",
"platform": "SeuBot",
"paymentMethod": "pix",
"status": "paid",
"createdAt": "2026-11-01 14:31:10",
"approvedDate": "2026-11-01 14:33:42",
"refundedAt": null,
"customer": {
"name": "Maria Souza",
"email": "maria@email.com",
"phone": "5511987654321",
"document": "12345678909",
"country": "BR",
"ip": "177.10.20.30"
},
"products": [
{
"id": "vip-mensal",
"name": "Grupo VIP mensal",
"planId": "mensal",
"planName": "Mensal",
"quantity": 1,
"priceInCents": 2990
}
],
"trackingParameters": {
"utm_source": "FB",
"utm_medium": "cpc",
"utm_campaign": "Campanha X|120210000000000001",
"utm_content": "Criativo 07|120210000000000003",
"utm_term": "Conjunto A|120210000000000002",
"src": null,
"sck": null
},
"commission": {
"totalPriceInCents": 2990,
"gatewayFeeInCents": 150,
"userCommissionInCents": 2840,
"currency": "BRL"
},
"isTest": false,
"lead_id": "987654321",
"flow": {
"id": "fx_12",
"name": "Funil VIP"
},
"telegram": {
"user_id": 987654321,
"username": "maria_souza",
"start_param": "c_8f3a91b2",
"bot_username": "lojadamaria_bot"
},
"subscription": {
"subscription_id": "sub_91aa",
"renewal_index": 0,
"period_days": 30,
"expires_at": "2026-12-01 14:33:42"
}
}'{ "ok": true, "order_id": "b51f0e1c-...", "numero": 10452, "criado": true, "status": "pago" }
// mesmo orderId de novo, com outro status:
{ "ok": true, "order_id": "b51f0e1c-...", "de": "aguardando_pagamento", "para": "pago" }
// mesmo orderId e mesmo status (reenvio):
{ "ok": true, "noop": "mesmo status", "order_id": "b51f0e1c-..." }Assinatura, renovação e upsell
- Cada cobrança é um pedido com
orderIdpróprio. A renovação leva o mesmolead_idesubscription_id, comrenewal_index1, 2, 3… - A renovação não precisa de UTM: herda a campanha do lead. O anúncio que trouxe o assinante ganha o LTV.
- Upsell, downsell e order bump: pedido próprio com
parent_order_id= oorderIddo pedido principal.
{
"orderId": "ped_7f3a2c_r1",
"platform": "SeuBot",
"paymentMethod": "pix",
"status": "paid",
"createdAt": "2026-12-01 14:30:00",
"approvedDate": "2026-12-01 14:31:15",
"customer": {
"name": "Maria Souza",
"email": "maria@email.com"
},
"products": [
{
"id": "vip-mensal",
"name": "Grupo VIP mensal",
"quantity": 1,
"priceInCents": 2990
}
],
"lead_id": "987654321",
"subscription": {
"subscription_id": "sub_91aa",
"renewal_index": 1,
"period_days": 30,
"expires_at": "2027-01-01 14:31:15"
}
}Status e datas
| Você manda | No Tracker vira |
|---|---|
| waiting_payment, pending, pix_generated | Aguardando pagamento (conta como PIX gerado) |
| paid, approved | Pago (venda: entra no faturamento e no ROAS) |
| refused, canceled, expired | Recusado / cancelado |
| refunded | Reembolsado (sai do faturamento) |
| chargedback | Reembolsado por chargeback |
- Datas sem fuso (
"2026-11-01 14:30:00") são lidas como UTC, igual UTMify. Com fuso (ISO 8601), respeitamos o fuso. - Venda paga não volta pra "aguardando" nem "recusado": esse aviso fora de ordem é ignorado.
- Valor em centavos, inteiro. Moeda em
commission.currency(padrão BRL).
Reenvio, idempotência e volume
- Idempotente: o mesmo
orderIdcom o mesmo status de novo não duplica nada. Pode reenviar sem medo. - Reenvie em
409e5xx(ou timeout), com backoff exponencial: 10 s, 30 s, 2 min, 10 min, 1 h… até 24 h. - Não trave o bot: mande em fila, assíncrono, timeout de 10 s. O PIX e a entrega do produto nunca dependem da nossa resposta.
- Volume: feito pra centenas de milhares de eventos por dia. Mande um evento por requisição, assim que acontecer (sem lote).
- Corpo até 64 KB. Campos que não conhecemos são ignorados, então pode mandar o seu JSON inteiro.
Erros
Erro vem com "ok": false, "codigo" e "erro" (texto).
| Código | HTTP | Quando | Reenviar? |
|---|---|---|---|
| NAO_AUTORIZADO | 401 | Token ausente, errado ou revogado. | Não. Avise o seller pra colar o token novo. |
| CORPO_INVALIDO | 400 | Não é JSON ou passou de 64 KB. | Não. Corrija o corpo. |
| SEM_ID | 400 | Pedido sem orderId. | Não. |
| SEM_LEAD | 400 | Lead sem lead_id nem telegram.user_id. | Não. |
| ROTA_INEXISTENTE | 404 | Rota errada. Use /ping, /leads ou /orders. | Não. |
| METODO_INVALIDO | 405 | POST em /orders e /leads, GET em /ping. | Não. |
| TENTE_DE_NOVO | 409 | A mesma venda está sendo gravada agora por outro aviso. | Sim, em alguns segundos. |
| FALHA_TEMPORARIA | 500 | Falha nossa. | Sim, com backoff (até 24 h). |
O que o Telegram entrega (e o que não)
Pra ninguém prometer dado que não existe: isto é tudo o que a Bot API do Telegram dá a um bot.
| user_id | Id numérico do usuário (até 52 bits). Fixo pra sempre: é a melhor chave do lead. |
| first_name / last_name | Nome que a pessoa escolheu no Telegram (pode ser apelido ou emoji). |
| username | @ público, opcional e trocável. Não use como chave. |
| language_code | Idioma do app (ex.: pt-br). Ajuda a separar Brasil de fora. |
| is_premium | Se assina o Telegram Premium. |
| start_param | O texto depois de ?start= do deep link (até 64 caracteres A-Z a-z 0-9 _ -). É por ele que o clique do anúncio chega ao bot. |
| telefone | Só se a pessoa tocar em "Compartilhar contato" (botão request_contact). Nunca automático. |
| convite (invite_link) | Em canal/grupo: qual link de convite a pessoa usou pra entrar (ChatMemberUpdated). Dá pra ter um link por campanha. |
- E-mail, CPF, idade, gênero ou cidade: o Telegram não tem. Só se o bot perguntar e a pessoa responder.
- IP, user agent, cookie _fbp/_fbc e fbclid: o Telegram nunca repassa. Só existem na página de redirect/presell ANTES de abrir o Telegram. Capture lá e guarde junto do start_param.
- Data de nascimento e bio: só via getChat e só se a pessoa deixou público (raro). Não conte com isso.
fbclid e os cookies _fbp/_fbc. Capture lá, guarde amarrado ao start_param (até 64 caracteres) e mande no /leads. Sem isso, a Meta recebe a compra quase sem dado pra casar com o clique.Pixels e API de Conversões
- Hoje o Trackeado não dispara pixel nem CAPI com as vendas que você manda. Se você já dispara Purchase pra Meta/TikTok/Kwai, continue: mandar dos dois lados duplicaria a compra.
- Mesmo assim, mande
click.ip,click.user_agent,click.fbceclick.fbp: ajudam na atribuição e deixam o seller pronto pra ligar o envio pelo Trackeado no futuro sem você mudar nada. - Pro Trackeado os dados do cliente vão em texto, sem hash: a gente não repassa nada pras redes. O hash é só no que você manda pra Meta/TikTok (abaixo).
Qualidade do sinal (pra quem dispara pixel e CAPI)
O mesmo padrão que o nosso checkout usa pra subir a qualidade da correspondência dos eventos na Meta. Vale pro seu pixel e pro seu CAPI:
| event_id (deduplicação) | O mesmo event_id no pixel do navegador e no CAPI do servidor, com o mesmo event_name. Na compra use o orderId. A Meta guarda o que chega primeiro e descarta o outro (não soma os dados), então mande o mais completo o quanto antes. |
| IP: IPv6 primeiro | A Meta prefere IPv6. Na página de redirect, pegue o IP do visitante (o servidor costuma ver só IPv4; o navegador descobre o IPv6 chamando https://api64.ipify.org?format=json). Mande em click.ip, sem hash. Nunca o IP do seu servidor. |
| fbc | fb.1.<timestamp em ms do clique>.<fbclid>. Use o cookie _fbc se existir; se não, monte UMA vez no primeiro clique e guarde (não gere de novo a cada evento com o horário atual). |
| fbp | O cookie _fbp como está (fb.1.<ms>.<aleatório>). Não invente; se não houver, não mande. |
| user_agent | O do navegador que clicou no anúncio, igual, sem cortar. Junto do IP, sempre. |
| Dados pessoais em hash | Pras redes: e-mail em minúsculas e sem espaços; telefone só dígitos com DDI (5511987654321); nome em minúsculas sem acento; depois SHA-256 em hexadecimal. external_id = SHA-256 do telegram.user_id. IP, user agent, fbc e fbp vão sem hash. Pro Trackeado mande os dados em texto: a gente não repassa pras redes. |
| Janela e origem | Evento em até 7 dias da ação. action_source "chat" (bot) ou "website" (página). Nunca CPF nem nome do produto pras redes. |
POST https://graph.facebook.com/v21.0/<PIXEL_ID>/events?access_token=<TOKEN_CAPI>
{
"data": [{
"event_name": "Purchase",
"event_time": 1761999222,
"event_id": "ped_7f3a2c",
"action_source": "chat",
"user_data": {
"em": ["<sha256 de maria@email.com>"],
"ph": ["<sha256 de 5511987654321>"],
"fn": ["<sha256 de maria>"],
"ln": ["<sha256 de souza>"],
"external_id": ["<sha256 de 987654321>"],
"client_ip_address": "2804:14c:5b80:8a5c::1",
"client_user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) ...",
"fbc": "fb.1.1761999000000.IwAR2xY...",
"fbp": "fb.1.1761998990000.1234567890"
},
"custom_data": { "currency": "BRL", "value": 29.90 }
}]
}fbq("track", "Purchase", {...}, { eventID: "ped_7f3a2c" }). Não ligue o "Conectar CAPI" automático da Meta nem eventos automáticos/sem código no pixel: eles duplicam o que você já manda.LGPD
- Mande só o que você tem e precisa. Nada de pedir CPF, e-mail ou telefone no bot só pra preencher a gente: nenhum campo de cliente é obrigatório.
- Avise no /start que o bot registra dados de navegação e compra pra medir anúncios (link da sua política de privacidade). Pra pixel/CAPI, quem coleta (o seller e você) precisa da base legal certa.
- Hash não é anonimização: e-mail ou telefone em SHA-256 continua sendo dado pessoal.
- Aqui o lead sem atividade há 180 dias é apagado. A venda guarda só o necessário pra relatório do seller.
- Pedido de exclusão de um titular: o seller pede pelo suporte do Trackeado e a gente apaga.
- Nicho sensível (saúde, adulto, apostas): o nome do produto nunca vai pras redes de anúncio.
Checklist do parceiro
- Campo "Token do Trackeado" no painel do seller, do lado da UTMify, com botão "Testar" (GET /ping).
- Na página de redirect (antes do t.me): guardar UTMs, fbclid/ttclid/gclid/kwai click_id, _fbp/_fbc, IP, user agent e a URL, amarrados ao start_param.
- No /start: POST /leads com telegram.user_id, start_param e o clique guardado. Mande o start_param inteiro, exatamente como chegou, também em todo /orders: é ele que liga o clique do anúncio à venda.
- PIX gerado: POST /orders com status waiting_payment. Pago: o mesmo orderId com status paid.
- Reembolso, chargeback, recusado: o mesmo orderId com o status novo.
- Renovação de assinatura: orderId novo, mesmo lead_id e subscription_id, renewal_index + 1.
- Upsell/downsell: orderId novo com parent_order_id do pedido principal.
- Fila com reenvio (backoff exponencial, até 24 h) pra 409 e 5xx. Outros 4xx não reenviam: corrija o corpo.
- Nunca travar o bot nem o PIX esperando a nossa resposta: envio assíncrono, timeout 10 s.
- Se você dispara pixel/CAPI: event_id = orderId (Purchase) nos dois lados, IPv6 quando houver, fbc/fbp da página de redirect, e-mail e telefone normalizados em SHA-256.
isTest: true e um token de conta de teste. Depois, uma venda real de R$ 1 tem que aparecer no Tracker do seller com campanha, conjunto e anúncio.