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 modtaget
  • orders/cancelled: ordre annulleret
  • orders/updated: ordre ændret
  • fulfillments/create: forsendelse oprettet
  • inventory_levels/update: lagertal opdateret
  • products/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?

FejltypeTotal årlig
Timeout (>30 sek svartid), webhook deaktiveres40.000 kr. per episode
Ingen HMAC-validering, svindel-ordre96.000 kr./aar
Webhook-tab uden retry-logik12.605.625 kr./aar
Ikke-idempotent handler, duplikat-ordrer1.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

SituationBrug webhookBrug API polling
Ny ordre modtagetJaFor langsomt
Lagertal synkroniseringFor mange eventsJa
ændring i kundeprofilJaJa, begge virker
Batch-import af produkterNejJa

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

  1. Returner 200 straks, behandl asynkront: Webhook-handler gemmer event i koe og returnerer 200. Baggrundsjob behandler fra koen.
  2. Log raat payload ved modtagelse: Gem det raa JSON-payload ved modtagelse inden det behandles. Hvis behandling fejler, har du payloaden til re-behandling.
  3. 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.