> ## 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.

# Idempotence et déduplication

> Gérez en toute sécurité les livraisons de webhook en doublon à l'aide de l'en-tête svix-id. Dédupliquez les événements et concevez des gestionnaires idempotents pour une livraison au moins une fois.

Les webhooks storekit sont livrés avec une sémantique « au moins une fois ». Cela signifie qu'en cas de problèmes de livraison (par ex. problèmes réseau), un webhook peut occasionnellement être livré plusieurs fois.

## L'en-tête svix-id

Chaque requête webhook inclut un en-tête `svix-id`. Cet ID est :

* **Unique par message** - Chaque événement distinct reçoit un ID unique
* **Cohérent lors des nouvelles tentatives** - Le même ID est utilisé lorsqu'on retente une livraison échouée

```
svix-id: msg_2KWPBCMzR5VXYW8xqGDKd0SLnHk
```

## Implémenter la déduplication

Pour vous assurer de ne traiter chaque événement qu'une seule fois, stockez le `svix-id` et vérifiez-le avant traitement :

```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
```

## Quand utiliser la déduplication

La déduplication est particulièrement importante pour :

* **Le traitement des paiements** - Éviter de facturer les clients deux fois
* **La création de commandes** - Empêcher les commandes en doublon
* **Les mises à jour d'inventaire** - Garantir des niveaux de stock précis
* **L'envoi de notifications** - Ne pas spammer les utilisateurs avec des messages en doublon

## Options de stockage

Vous pouvez stocker les IDs de webhooks traités dans :

| Stockage        | Avantages           | Inconvénients                                          |
| --------------- | ------------------- | ------------------------------------------------------ |
| Redis           | Rapide, TTL intégré | Nécessite une instance Redis                           |
| Base de données | Déjà disponible     | Plus lent, nécessite une tâche de nettoyage            |
| En mémoire      | Le plus simple      | Perdu au redémarrage, inadapté aux systèmes distribués |

<Tip>
  Définissez une expiration d'au moins 72 heures (3 jours) sur les IDs de webhook stockés. Les nouvelles tentatives peuvent se produire sur environ 3 jours selon le [calendrier de retry](/docs/fr/developers/webhooks/retry-policy).
</Tip>

<Info>
  Même sans déduplication, concevoir vos gestionnaires de webhooks pour qu'ils soient idempotents (produisant le même résultat lorsqu'ils sont appelés plusieurs fois) est une bonne pratique.
</Info>


## Related topics

- [Vérifier le statut de paiement Pay at Table depuis le POS ou le tableau de bord](/docs/fr/guides/pay-at-table/checking-payments.md)
- [Tags et allergènes](/docs/fr/guides/menu/tags-allergens.md)
- [Remboursements et versements](/docs/fr/guides/payments/refunds-payouts.md)
- [Traductions et langues](/docs/fr/guides/store-settings/translations.md)
- [API et webhooks](/docs/fr/guides/integrations/api-webhooks.md)
