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

# Idempotentie & deduplicatie

> Verwerk dubbele webhook-bezorgingen veilig via de svix-id-header. Dedupliceer events en ontwerp idempotente handlers voor at-least-once-bezorging.

storekit-webhooks worden bezorgd met "at least once"-semantiek. Dit betekent dat een webhook af en toe meer dan één keer bezorgd kan worden bij bezorgproblemen (zoals netwerkproblemen).

## De svix-id-header

Elke webhook bevat een `svix-id`-header. Deze ID is:

* **Uniek per bericht** - Elk afzonderlijk event krijgt een unieke ID
* **Consistent tussen retries** - Bij het opnieuw bezorgen van een mislukte levering wordt dezelfde ID gebruikt

```
svix-id: msg_2KWPBCMzR5VXYW8xqGDKd0SLnHk
```

## Deduplicatie implementeren

Om er zeker van te zijn dat je elk event maar één keer verwerkt, sla je de `svix-id` op en controleer je deze vóór verwerking:

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

## Wanneer deduplicatie gebruiken

Deduplicatie is vooral belangrijk bij:

* **Betalingsverwerking** - Voorkom dat klanten dubbel worden belast
* **Bestellingen aanmaken** - Voorkom dubbele bestellingen
* **Voorraadupdates** - Zorg voor kloppende voorraadstanden
* **Notificaties versturen** - Spam gebruikers niet met dubbele berichten

## Opslagopties

Je kunt verwerkte webhook-ID's opslaan in:

| Opslag    | Voordelen            | Nadelen                                                             |
| --------- | -------------------- | ------------------------------------------------------------------- |
| Redis     | Snel, ingebouwde TTL | Vereist Redis-instantie                                             |
| Database  | Al beschikbaar       | Trager, opschoontaak nodig                                          |
| In-memory | Eenvoudigst          | Verdwijnt bij herstart, niet geschikt voor gedistribueerde systemen |

<Tip>
  Stel een houdbaarheidstijd van minstens 72 uur (3 dagen) in op opgeslagen webhook-ID's. Retries kunnen ongeveer 3 dagen aanhouden volgens het [retry-schema](/docs/nl/developers/webhooks/retry-policy).
</Tip>

<Info>
  Ook zonder deduplicatie is het een goede gewoonte om je webhook-handlers idempotent te ontwerpen (zodat ze bij meerdere aanroepen hetzelfde resultaat opleveren).
</Info>
