Developer · FREE

Idempotencja webhooka

Provider dostarcza at-least-once. Skill projektuje bramkę: klucz zdarzenia, atomiczny claim, 200 OK od razu, duplikat bez drugiego skutku. Żeby Stripe nie ściągnął dwa razy. Spec węzłów, nie JSON całego flow.

reviewed:

Jak zainstalować

  1. Uzupełnij pola poniżej (albo zostaw nazwy zmiennych i dopisz w czacie). Wartości z Skill creatora na liście podstawiają się same.
  2. Kopiuj, potem wklej w Claude.ai (instrukcje projektu) albo ChatGPT (Custom Instructions).
  3. Albo pobierz SKILL.md i połóż w folderze skilli Claude Code.
SKILL
Provider: [PROVIDER]. Pole klucza (id zdarzenia): [KLUCZ]. Store (Redis / Postgres / n8n Remove Duplicates): [STORE].

NIE zrzucaj JSON-a workflow. NIE każ wyłączać retry u providera. NIE używaj `$execution.id` jako klucza (przy retry to nowe id).
Jeśli [PROVIDER] albo [KLUCZ] albo [STORE] puste - zapytaj kto woła, które pole jest stabilnym id zdarzenia i gdzie claim (Redis/Postgres/Remove Duplicates), stop.
Jeśli trigger jest ręczny albo cron bez skutku ubocznego - ten skill nie jest potrzebny, stop.

Zwracasz spec węzłów, w tej kolejności:

1. Webhook odbiera. Weryfikacja podpisu [PROVIDER] (Stripe `t=`/`v1`, GitHub `X-Hub-Signature-256`) ZANIM 200 i ZANIM claim. Zły podpis = 4xx, bez claimu, bez skutku.
2. Po dobrym podpisie: 200 OK szybko, zanim wolny skutek (charge/mail). Provider nie pętli na timeout naszej roboty.
3. Extract key: tylko [KLUCZ] (np. `evt_...`, delivery guid). Stabilny między retry. Nie `$execution.id`. Nie hash całego body, jeśli provider daje id.
4. Claim atomowy w [STORE] PRZED skutkiem ubocznym:
   - Redis: `SET key NX EX ttl`
   - Postgres: `INSERT ... ON CONFLICT DO NOTHING` i sprawdzony `row count`
   - n8n Remove Duplicates: value = [KLUCZ], okno = TTL
   IF allow -> idź. IF block -> stop (200 już poszło), log "duplicate".
5. Skutek (charge, mail, CRM) tylko na allow.
6. Zapisz wynik przy kluczu (status, id skutku), żeby replay po TTL był świadomy.

TTL: nazwij liczbę (np. 24h/72h) i decyzję po wygaśnięciu: replay (idempotentny skutek) albo twardy block. Nie milcz.

Testy (3 curl, ten sam [KLUCZ]):
- pierwszy: skutek 1 raz, claim zapisany
- duplikat w oknie TTL: block, skutek 0 razy
- po TTL: zachowanie zgodne z decyzją wyżej, nie zgadywane

Dywiz "-".

Zanim wkleisz

Skill vs zły prompt

Zły prompt

Wylacz retry u Stripe, uzyj execution id jako klucza, zrzuc JSON workflow.

Skill

Provider: [PROVIDER]. Pole klucza (id zdarzenia): [KLUCZ]. Store (Redis / Postgres / n8n Remove Duplicates): [STORE].

NIE zrzucaj JSON-a workflow. NIE każ wyłączać retry u providera. NIE używaj `$execution.id` jako klucza (przy retry to nowe id).
Jeśli [PROVIDER] albo [KLUCZ] albo [STORE] puste - zapytaj kto woła, które pole jest stabilnym id zdarzenia i gdzie claim (Redis/Postgres/Remove Duplicates), stop.
Jeśli trigger jest ręczny albo cron bez skutku ubocznego - ten skill nie jest potrzebny, stop.

Zwracasz spec węzłów, w tej kolejności:

Użyj z tym narzędziem

Lekcja: fundament-07-pierwszy-workflow

Pytania

Jak użyć skilla "Idempotencja webhooka" w Claude?

Uzupełnij pola w nawiasach (albo weź je z profilu Skill creator na /skille), kliknij Kopiuj i wklej treść do instrukcji projektu w Claude.ai. W Claude Code kliknij Pobierz SKILL.md i połóż plik w folderze skilli. Skill działa też w ChatGPT (Custom Instructions). Nie chowa się za paywallem: kopia jest darmowa.

Kiedy tego skilla NIE używać?

Nie gdy trigger jest reczny albo cron bez skutku ubocznego. Nie do wylaczania retry po stronie providera bo tak. Nie JSON calego flow.