Trackeado · integração de parceiros

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

  1. 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.
  2. 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.
  3. No /start do bot você manda o lead com as UTMs e o clique (POST /leads).
  4. A cada mudança da venda (PIX gerado, pago, reembolsado…) você manda o pedido (POST /orders), com o lead_id.
  5. 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):

Base
https://api.shopixpay.app/functions/v1/tracker

O 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 painelO que fazer
CardTítulo "Trackeado", subtítulo "Tracking de vendas". Logo oficial: trackeado.com/marca/trackeado/trackeado-icone.svg (quadrado) ou trackeado-horizontal.svg.
Status da configDesligado = você para de mandar eventos daquela config.
Nome da configLivre, só no seu painel (ex.: "Tracker Funil Vick").
Fluxos vinculadosOs eventos dos fluxos marcados vão com o token desta config. Mande o fluxo no campo flow (id e name).
Token APIPlaceholder "sxt_xxxxxxxxxxxx". Valide o formato: sxt_ + 48 caracteres hexadecimais minúsculos (52 no total).
Botão TestarGET /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.
Na prática: copie a integração da UTMify, troque a URL pra 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.

Bot de Telegram não precisa do script: a página de redirect é sua, e os dados do clique chegam pelo bloco 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.

Header
x-api-token: sxt_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Guarde o token do seller no seu servidor, criptografado. Ele só serve pra mandar vendas e leads pra conta do seller (não lê nada nem mexe em dinheiro). Se o seller gerar outro, o antigo para de funcionar na hora e você recebe 401: avise o seller pra colar o novo. O seller pega o token em Tracker › Conectar vendas.

GET /ping: testar conexão

GEThttps://api.shopixpay.app/functions/v1/tracker/ping

Use no botão "Testar" do seu painel. Devolve o nome da conta, pra mostrar ao seller que o token está certo.

Exemplo
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

POSThttps://api.shopixpay.app/functions/v1/tracker/leads

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.

CampoTipoDescrição
lead_idobrigatóriotextoId do lead no seu sistema. Se faltar, usamos telegram.user_id (um dos dois é obrigatório).
eventtextoclick, start, message, plan_view, checkout, pix_generated, member_joined, member_left, blocked, unsubscribed. Outro valor vira "lead".
platformtextoNome da sua plataforma.
telegramobjetoMesmo bloco do pedido. start_param é o mais importante.
trackingParametersobjetoUTMs do clique do anúncio (mesmo formato do pedido).
clickobjetoip (IPv4 ou IPv6; prefira IPv6), user_agent, fbclid, fbc, fbp, ttclid, ttp, gclid, click_id (Kwai), landing_page. Sem hash.
created_atdata UTCQuando aconteceu. Se faltar, usamos a hora em que chegou.
isTestbooleanotrue 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"
  }
}'
Resposta
{ "ok": true, "lead_id": "987654321", "evento": "start", "novo": true }

POST /orders: a venda

POSThttps://api.shopixpay.app/functions/v1/tracker/orders

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)

CampoTipoDescrição
orderIdobrigatóriotextoId 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óriotextowaiting_payment, paid, refused, refunded ou chargedback (os da UTMify). Também aceitamos pending, approved, canceled, expired.
products[]obrigatóriolistaid, name, planId, planName, quantity, priceInCents. O valor da venda é commission.totalPriceInCents ou a soma de priceInCents × quantity.
paymentMethodtextopix, credit_card, boleto, paypal ou free_price.
createdAtdata 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 / refundedAtdata UTCQuando pagou / quando reembolsou.
customerobjetoname, email, phone (com DDI), document (CPF), country, ip. Tudo opcional: bot sem e-mail pode mandar vazio (não precisa inventar e-mail).
trackingParametersobjetoutm_source, utm_medium, utm_campaign, utm_content, utm_term, src, sck. Formato da casa: "Nome|id" (o id da Meta depois do |).
commissionobjetototalPriceInCents, gatewayFeeInCents, userCommissionInCents, currency (BRL, USD…).
isTestbooleanotrue valida o corpo e grava como venda de teste (fora dos relatórios e sem notificação).

Campos extras do Trackeado (opcionais)

CampoTipoDescrição
platformtextoNome da sua plataforma (ex.: SharkBot). Mostramos no Tracker de onde veio a venda.
lead_idtextoId 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.
telegramobjetouser_id, username, first_name, last_name, language_code, is_premium, start_param, bot_username.
clickobjetoip (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.
subscriptionobjetosubscription_id, renewal_index (0 = primeira cobrança), period_days, expires_at.
parent_order_idtextoorderId do pedido principal, em upsell, downsell ou order bump.
flowobjetoid e name do fluxo/funil do seu bot que gerou a venda. Mostramos no Tracker.
sale_typetextofront, 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"
  }
}'
Respostas
{ "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 orderId próprio. A renovação leva o mesmo lead_id e subscription_id, com renewal_index 1, 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 = o orderId do pedido principal.
Renovação do mês 2
{
  "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ê mandaNo Tracker vira
waiting_payment, pending, pix_generatedAguardando pagamento (conta como PIX gerado)
paid, approvedPago (venda: entra no faturamento e no ROAS)
refused, canceled, expiredRecusado / cancelado
refundedReembolsado (sai do faturamento)
chargedbackReembolsado 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 orderId com o mesmo status de novo não duplica nada. Pode reenviar sem medo.
  • Reenvie em 409 e 5xx (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ódigoHTTPQuandoReenviar?
NAO_AUTORIZADO401Token ausente, errado ou revogado.Não. Avise o seller pra colar o token novo.
CORPO_INVALIDO400Não é JSON ou passou de 64 KB.Não. Corrija o corpo.
SEM_ID400Pedido sem orderId.Não.
SEM_LEAD400Lead sem lead_id nem telegram.user_id.Não.
ROTA_INEXISTENTE404Rota errada. Use /ping, /leads ou /orders.Não.
METODO_INVALIDO405POST em /orders e /leads, GET em /ping.Não.
TENTE_DE_NOVO409A mesma venda está sendo gravada agora por outro aviso.Sim, em alguns segundos.
FALHA_TEMPORARIA500Falha 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_idId numérico do usuário (até 52 bits). Fixo pra sempre: é a melhor chave do lead.
first_name / last_nameNome que a pessoa escolheu no Telegram (pode ser apelido ou emoji).
username@ público, opcional e trocável. Não use como chave.
language_codeIdioma do app (ex.: pt-br). Ajuda a separar Brasil de fora.
is_premiumSe assina o Telegram Premium.
start_paramO 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.
telefoneSó 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.
Não vem do Telegram:
  • 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.
Por isso a página de redirect é ouro. É o único momento em que existem IP, user agent, 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.fbc e click.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 primeiroA 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.
fbcfb.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).
fbpO cookie _fbp como está (fb.1.<ms>.<aleatório>). Não invente; se não houver, não mande.
user_agentO do navegador que clicou no anúncio, igual, sem cortar. Junto do IP, sempre.
Dados pessoais em hashPras 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 origemEvento em até 7 dias da ação. action_source "chat" (bot) ou "website" (página). Nunca CPF nem nome do produto pras redes.
Purchase no CAPI da Meta, deduplicado com o pixel
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 }
  }]
}
No navegador, o pixel da mesma compra leva o mesmo id: 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

  1. Campo "Token do Trackeado" no painel do seller, do lado da UTMify, com botão "Testar" (GET /ping).
  2. 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.
  3. 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.
  4. PIX gerado: POST /orders com status waiting_payment. Pago: o mesmo orderId com status paid.
  5. Reembolso, chargeback, recusado: o mesmo orderId com o status novo.
  6. Renovação de assinatura: orderId novo, mesmo lead_id e subscription_id, renewal_index + 1.
  7. Upsell/downsell: orderId novo com parent_order_id do pedido principal.
  8. Fila com reenvio (backoff exponencial, até 24 h) pra 409 e 5xx. Outros 4xx não reenviam: corrija o corpo.
  9. Nunca travar o bot nem o PIX esperando a nossa resposta: envio assíncrono, timeout 10 s.
  10. 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.
Teste ponta a ponta com 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.