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

# Idempotenz und Deduplizierung

> Behandeln Sie doppelte Webhook-Zustellungen sicher mit dem svix-id-Header. Deduplizieren Sie Events und entwerfen Sie idempotente Handler für At-least-once-Zustellung.

storekit-Webhooks werden mit "At-least-once"-Semantik zugestellt. Das bedeutet: Kommt es bei der Zustellung zu Problemen (z. B. Netzwerkfehlern), kann ein Webhook gelegentlich mehrfach zugestellt werden.

## Der svix-id-Header

Jeder Webhook-Request enthält einen Header `svix-id`. Diese ID ist:

* **Pro Nachricht eindeutig** – Jedes eigenständige Event erhält eine eindeutige ID
* **Über Wiederholungen konstant** – Bei erneuten Zustellversuchen einer fehlgeschlagenen Nachricht wird dieselbe ID verwendet

```
svix-id: msg_2KWPBCMzR5VXYW8xqGDKd0SLnHk
```

## Deduplizierung implementieren

Um sicherzustellen, dass Sie jedes Event nur einmal verarbeiten, speichern Sie die `svix-id` und prüfen Sie sie vor der Verarbeitung:

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

## Wann Deduplizierung sinnvoll ist

Deduplizierung ist besonders wichtig für:

* **Zahlungsabwicklung** – Doppelte Belastungen von Kunden vermeiden
* **Bestellanlage** – Doppelbestellungen verhindern
* **Bestandsaktualisierungen** – Präzise Lagerbestände sicherstellen
* **Versand von Benachrichtigungen** – Nutzer nicht mit doppelten Nachrichten belasten

## Speicheroptionen

Sie können verarbeitete Webhook-IDs ablegen in:

| Speicher  | Vorteile                 | Nachteile                                                   |
| --------- | ------------------------ | ----------------------------------------------------------- |
| Redis     | Schnell, integrierte TTL | Erfordert Redis-Instanz                                     |
| Datenbank | Bereits vorhanden        | Langsamer, benötigt Cleanup-Job                             |
| In-Memory | Am einfachsten           | Bei Neustart verloren, nicht für verteilte Systeme geeignet |

<Tip>
  Setzen Sie für gespeicherte Webhook-IDs eine Ablaufzeit von mindestens 72 Stunden (3 Tagen). Wiederholungen können gemäß dem [Wiederholungsplan](/docs/de/developers/webhooks/retry-policy) über ca. 3 Tage auftreten.
</Tip>

<Info>
  Auch ohne Deduplizierung ist es eine gute Praxis, Ihre Webhook-Handler idempotent zu gestalten (bei mehrfachem Aufruf mit demselben Ergebnis).
</Info>


## Related topics

- [Rückerstattungen und Auszahlungen](/docs/de/guides/payments/refunds-payouts.md)
- [Übersetzungen und Sprachen](/docs/de/guides/store-settings/translations.md)
- [Gebührenbericht und Tageszusammenfassung](/docs/de/guides/reports/fee-report.md)
- [Trinkgeld und Servicegebühren](/docs/de/guides/payments/tips-service-charges.md)
- [Menüprodukte, Modifier und Tags anlegen und konfigurieren](/docs/de/guides/menu/products.md)
