> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xtracky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Deduplicação

> Como a xTracky evita disparar Purchase duas vezes pra mesma venda — mesmo que o webhook do gateway dispare 3× por retry.

Gateways de pagamento tem o hábito ruim de reenviar o mesmo webhook várias vezes (retries por timeout, tentativas de "garantia"). Se a xTracky simplesmente processasse todos, você teria `Purchase` duplicado no painel da Meta — e ROAS inflado artificialmente.

A xTracky bloqueia isso em duas camadas.

## Camada 1 — Dedup por LeadId + orderId (V2)

Na integração V2, cada evento é identificado por:

```
LeadId + orderId
```

Ao chegar um `POST` na `/api/integrations/api`, a xTracky verifica se já processou esse par nas últimas horas. Se sim, retorna `200 OK` mas **não dispara** nada.

<Check>
  **Você pode reenviar à vontade** — retries do seu backend, replays de fila, testes manuais. Só o primeiro conta.
</Check>

## Camada 2 — Hash SHA-256 do payload (V1)

Na integração V1 (webhooks legados de gateways), a xTracky gera um hash SHA-256 do payload inteiro do webhook e compara com hashes recentes:

```
sha256({"orderId":"...","amount":9990,...})
```

Mesmo dedup: se o hash bate, o evento é descartado.

## O que conta como "mesma venda"?

<AccordionGroup>
  <Accordion title="Mesmo orderId, mesmo LeadId">
    Duplicata — descartado.
  </Accordion>

  <Accordion title="Mesmo orderId, LeadId diferente">
    Processado. Isso pode acontecer se o mesmo pedido for reportado por dois caminhos (webhook + API manual), ou se você reutilizou o `orderId` pra outra venda (o que você não deveria fazer).
  </Accordion>

  <Accordion title="orderId diferente, mesmo LeadId, mesmo produto">
    Processado. É um cliente comprando duas vezes — deve mesmo virar dois `Purchase`.
  </Accordion>

  <Accordion title="Sem orderId (V1 UTM handler puro)">
    A dedup cai no hash do payload. Se o payload inteiro for byte-a-byte igual → dedup. Se mudar um único caractere (timestamp, ID de transação, etc.), passa.
  </Accordion>
</AccordionGroup>

## Janela de dedup

A janela é curta (horas, não dias). Se você reprocessar um webhook antigo semanas depois, ele **vai passar** de novo — o que raramente é o comportamento desejado.

<Tip>
  Se você faz replay em massa de webhooks antigos (por exemplo, restaurando um backup), abra um ticket com a gente antes: podemos flaggar o replay como não-produtivo pra evitar poluir os painéis de anúncio.
</Tip>
