Perilaku pengiriman
Diambil dari dokumentasi resmi vendor, terakhir diperiksa 2026-08-06. Jika vendor tidak menyebut angka, tabel ini juga tidak mencantumkannya.
| Batas waktu respons | 5 detik 1 detik untuk terhubung, 5 detik untuk seluruh permintaan |
|---|---|
| Percobaan ulang | 8 percobaan ulang selama 4 jam |
| Berhenti mencoba | Langganan yang dibuat lewat Admin API dihapus setelah 8 kegagalan berturut-turut, disertai email peringatan ke kontak developer darurat aplikasi tersebut |
| Sumber | https://shopify.dev/docs/apps/build/webhooks/subscribe/https |
Tanda tangan
Diverifikasi dengan verifier yang berfungsi dan dibuktikan oleh test suite, bukan dibaca dari dokumentasi. Terakhir diverifikasi 2026-08-20.
| Algoritma | HMAC-SHA256 |
|---|---|
| Payload bertanda tangan | raw body |
| Encoding | base64 |
| Header | x-shopify-hmac-sha256 |
| Toleransi | tidak diberlakukan |
Verifikasi
Raw body dari permintaan, byte demi byte, sebelum parsing JSON apa pun. Setiap skema di halaman ini rusak begitu framework melakukan serialisasi ulang pada payload.
const crypto = require("node:crypto");
// base64(HMAC-SHA256(secret, raw body))
const expected = crypto
.createHmac("sha256", hmacSecret) // admin webhooks: Settings → Notifications
.update(rawBody)
.digest("base64");
const received = Buffer.from(req.headers["x-shopify-hmac-sha256"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
received.length === wanted.length && crypto.timingSafeEqual(received, wanted);Ada dua secret yang berbeda: webhook yang dibuat dari admin ditandatangani dengan shared secret di Settings → Notifications, sedangkan yang dibuat oleh aplikasi memakai client secret aplikasi tersebut. Sesuaikan dengan cara webhook itu dibuat.
Yang sering menjebak
Shopify tidak menonaktifkan langganan, melainkan menghapusnya. Langganan yang dibuat lewat Admin API dihapus setelah 8 kegagalan berturut-turut, dengan hanya email peringatan ke kontak developer darurat aplikasi tersebut; tidak ada error yang muncul, dan pesanan begitu saja berhenti datang. Pemulihannya berupa job rekonsiliasi lewat Admin API, karena event yang terlewat tidak pernah dikirim.
Baca juga
AnyHook berada di depan endpoint yang menerima webhook dari Shopify: AnyHook menjawab dalam sekitar satu detik, mencoba ulang sesuai jadwalnya sendiri saat server Anda mati, dan menyimpan setiap event agar dapat diputar ulang (replay). Ganti satu URL, kode Anda tetap.