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

# Idempotenza e deduplicazione

> Gestisci in modo sicuro le consegne duplicate dei webhook usando l'header svix-id. Deduplica gli eventi e progetta handler idempotenti per la consegna at-least-once.

I webhook storekit vengono consegnati con semantica «at least once». Ciò significa che, in caso di problemi durante la consegna (ad es. problemi di rete), un webhook può essere occasionalmente consegnato più di una volta.

## L'header svix-id

Ogni richiesta webhook include un header `svix-id`. Questo ID è:

* **Unico per messaggio** — Ogni evento distinto riceve un ID univoco
* **Coerente tra i tentativi** — Lo stesso ID viene utilizzato quando si ritenta una consegna fallita

```
svix-id: msg_2KWPBCMzR5VXYW8xqGDKd0SLnHk
```

## Implementare la deduplicazione

Per assicurarti di elaborare ogni evento una sola volta, memorizza lo `svix-id` e controllalo prima di procedere:

```javascript theme={null}
app.post('/webhooks', async (req, res) => {
  const svixId = req.headers['svix-id'];
  
  // Check if we've already processed this webhook
  const alreadyProcessed = await redis.get(`webhook:${svixId}`);
  if (alreadyProcessed) {
    return res.status(200).send('Already processed');
  }
  
  // Mark as processed (with 72-hour expiry)
  await redis.set(`webhook:${svixId}`, '1', 'EX', 259200);
  
  // Process the webhook
  await processWebhook(req.body);
  
  res.status(200).send('OK');
});
```

```python theme={null}
@app.route('/webhooks', methods=['POST'])
def handle_webhook():
    svix_id = request.headers.get('svix-id')
    
    # Check if already processed
    if redis_client.get(f'webhook:{svix_id}'):
        return 'Already processed', 200
    
    # Mark as processed (72-hour expiry)
    redis_client.setex(f'webhook:{svix_id}', 259200, '1')
    
    # Process the webhook
    process_webhook(request.json)
    
    return 'OK', 200
```

## Quando usare la deduplicazione

La deduplicazione è particolarmente importante per:

* **Elaborazione dei pagamenti** — Evita di addebitare due volte i clienti
* **Creazione degli ordini** — Previene ordini duplicati
* **Aggiornamenti dell'inventario** — Garantisce conteggi delle scorte accurati
* **Invio di notifiche** — Non inviare messaggi duplicati agli utenti

## Opzioni di archiviazione

Puoi memorizzare gli ID dei webhook elaborati in:

| Archiviazione | Pro                   | Contro                                             |
| ------------- | --------------------- | -------------------------------------------------- |
| Redis         | Veloce, TTL integrato | Richiede un'istanza Redis                          |
| Database      | Già disponibile       | Più lento, richiede un job di pulizia              |
| In-memory     | Il più semplice       | Perso al riavvio, non adatto a sistemi distribuiti |

<Tip>
  Imposta una scadenza di almeno 72 ore (3 giorni) sugli ID dei webhook memorizzati. I tentativi possono verificarsi in un arco di circa 3 giorni, secondo la [pianificazione dei tentativi](/docs/it/developers/webhooks/retry-policy).
</Tip>

<Info>
  Anche senza deduplicazione, progettare i tuoi handler webhook affinché siano idempotenti (producano lo stesso risultato se chiamati più volte) è una buona pratica.
</Info>


## Related topics

- [Verifica dello stato di pagamento Pay at Table da POS o dashboard](/docs/it/guides/pay-at-table/checking-payments.md)
