Forestil dig at du hele dagen ringer til postvaesenet og spoerger: "Er der breve til mig?" Det er API-polling. En webhook er det modsatte: postvaesenet ringer til dig, når der er et brev. Det er ikke en lille forskel, det er fundamentalt anderledes i e-handelssammenhaeng.
Her er alt du skal vide om webhooks: tekniske krav, hvad de koster når de fejler, og hvordan du bygger en robust webhook-modtager.
Hvad er en webhook?
En webhook er en HTTP-anmodning, som et eksternt system (Shopify, WooCommerce, e-conomic) sender til dit system, når en bestemt hændelse sker. Det er push-notifikationer til software.
Typiske webhook-events i e-handel:
orders/create: ny ordre modtagetorders/cancelled: ordre annulleretorders/updated: ordre ændretfulfillments/create: forsendelse oprettetinventory_levels/update: lagertal opdateretproducts/create: nyt produkt oprettet
Tekniske krav til en webhook-modtager
👉 SmartPack modtager webhooks med fuld HMAC-SHA256 validering og asynkron behandling. Se SmartPacks webhook-håndtering
For at modtage webhooks korrekt er der tre ufravigelige krav:
1. HTTPS er obligatorisk
Shopify og alle andre moderne platforme afviser HTTP-endpoints. Du skal have et gyldigt SSL-certifikat. Self-signed certifikater accepteres ikke i produktionsmiljoeer.
2. Svartid under 30 sekunder
Shopify forventer HTTP 200 inden for 30 sekunder. Overskrides det, anses leveringen som mislykket, og Shopify forsøger retry. Tunge processer bør aldrig ske synkront i webhook-handleren, put jobbet i en koe og returner 200 straks.
3. HMAC-SHA256 signaturvalidering
Shopify inkluderer en header X-Shopify-Hmac-Sha256 med en hash af payload, signeret med dit webhook secret. Du skal validere denne signatur foer du behandler payload. Gør du det ikke, accepterer du potentielt falske requests.
Hvad koster webhook-fejl?
| Fejltype | Total årlig |
|---|---|
| Timeout (>30 sek svartid), webhook deaktiveres | 40.000 kr. per episode |
| Ingen HMAC-validering, svindel-ordre | 96.000 kr./aar |
| Webhook-tab uden retry-logik | 12.605.625 kr./aar |
| Ikke-idempotent handler, duplikat-ordrer | 1.825.000 kr./aar |
Konklusion: Webhook-tab uden retry er den dyreste fejl. HMAC-skip er den farligste. Begge er 100% forebyggelige.
Webhook retry-mekanisme
Shopify sender webhooks i realtid. Hvis leveringen fejler, forsøger Shopify igen:
- Retry 1: efter ca. 1 minut
- Retry 2-N: med eksponentiel backoff
- Total periode: op til 5 dage
- Efter 5 dage: webhook-abonnementet deaktiveres og du modtager en notifikation
Idempotency, den usynlige fejlkilde
Fordi Shopify kan sende samme webhook flere gange, skal din handler være idempotent: behandling af samme event to gange maa ikke resultere i to ordrer, to fragtlabels eller to lagerafjusteringer.
Implementering: Gem webhook_id eller ordre-ID i en processed_events-tabel. Tjek ved modtagelse: er dette event allerede behandlet? Returner 200 OK, ikke 409 eller fejl, så Shopify stopper med at gensende.
Webhooks vs. API polling
| Situation | Brug webhook | Brug API polling |
|---|---|---|
| Ny ordre modtaget | Ja | For langsomt |
| Lagertal synkronisering | For mange events | Ja |
| ændring i kundeprofil | Ja | Ja, begge virker |
| Batch-import af produkter | Nej | Ja |
Det opdager de fleste for sent
- At Shopify deaktiverer webhook-abonnement efter 5 dage med fejl: Dit system er nede i 12 timer. Shopify proever retry. Efter 5 dage: webhook deaktiveret. Ingen alarm blev sendt.
- At en webhook kan sendes FLERE gange: I bygger ikke idempotent handler. Shopify sender samme ordre to gange. I opretter to ordrer, sender to pakker.
- At HTTPS ikke er det samme som HMAC-validering: I har HTTPS men validerer ikke HMAC. Enhver kan sende falske webhooks til jeres endpoint.
Typiske fejl
- Behandle tunge opgaver synkront i webhook-handler: Svartid overskrider 30 sekunder. Shopify anser leveringen som fejlet og sender retry. Ordren behandles to gange.
- Skippe HMAC-validering midlertidigt: Under udvikling springes validering over. Det glider ind i produktion. Resultatet: enhver kan sende fabricerede ordre-events.
- Ikke håndtere webhook-deaktivering: Systemet kører videre men modtager ingen events. Ordrer behandles ikke.
Sådan gør du det rigtigt
- Returner 200 straks, behandl asynkront: Webhook-handler gemmer event i koe og returnerer 200. Baggrundsjob behandler fra koen.
- Log raat payload ved modtagelse: Gem det raa JSON-payload ved modtagelse inden det behandles. Hvis behandling fejler, har du payloaden til re-behandling.
- Monitorer webhook-abonnementsstatus: Tjek regelmæssigt at dine webhook-abonnementer er aktive hos Shopify.
SmartPack
SmartPack modtager webhooks fra Shopify, WooCommerce og andre platforme med fuld HMAC-SHA256 validering. Alle webhooks puttes i en intern event-koe og behandles asynkront. Svartid til platform er typisk under 200ms. Systemet er fuldt idempotent på ordre-ID-niveau. Webhook-aktivitet vises i SmartPack administrationspanel med status, tidsstempler og eventuelle fejl.