Shopify integration

Shopify Webhook Monitoring that catches dropped orders.

Every orders/create, customers/update, and app/uninstalled tracked, with HMAC verification and dedup-by-webhook-id built in. Wrap your handler once — get a real-time dashboard, alerts, and replay protection.

Why monitor Shopify webhooks specifically?

Shopify retries failed webhooks for up to 48 hours and removes the topic from your subscription after enough consecutive failures — meaning silent regressions can cost you orders, fulfilments, and inventory sync. Bad HMAC, slow handlers, and 5xx responses go unnoticed in your app logs but show up immediately here.

HMAC verification

Built-in HMAC-SHA256 with timing-safe comparison. Invalid requests get 401 before your handler runs.

Idempotency

Dedupe on x-shopify-webhook-id. Retries return the cached response — no double-fulfilment.

Latency tracking

P50/P95/P99 per topic. Spot regressions before Shopify auto-unsubscribes you for slow responses.

Real-time alerts

Slack, Discord, or email when a topic starts failing or your error rate spikes.

60-second install

Wrap your existing Shopify webhook handler. The SDK auto-verifies HMAC, handles dedup, and ships telemetry to your dashboard. Your handler runs unchanged.

Next.js (App Router)

app/api/webhooks/shopify/route.ts
// app/api/webhooks/shopify/route.ts
import { init } from '@outworx/hooks';
import { withWebhookMonitoring } from '@outworx/hooks/nextjs';

init({ apiKey: process.env.OUTWORX_HOOKS_API_KEY! });

export const POST = withWebhookMonitoring(
  {
    provider: 'shopify',
    signatureSecret: process.env.SHOPIFY_WEBHOOK_SECRET!,
    // Shopify's webhook ID header — perfect for deduping retries.
    idempotencyKey: (_req, _body, headers) => headers['x-shopify-webhook-id'],
  },
  async (req) => {
    const body = await req.json();
    // Signature verified, duplicates filtered — handle the event.
    return Response.json({ received: true });
  }
);

Express

server.ts
import express from 'express';
import { init } from '@outworx/hooks';
import { withWebhookMonitoring } from '@outworx/hooks/express';

init({ apiKey: process.env.OUTWORX_HOOKS_API_KEY });

const app = express();

// Stash raw body so signature verification works.
app.use(express.json({
  verify: (req, _res, buf) => {
    (req as any).rawBody = buf.toString('utf8');
  },
}));

app.post(
  '/webhooks/shopify',
  withWebhookMonitoring({
    provider: 'shopify',
    signatureSecret: process.env.SHOPIFY_WEBHOOK_SECRET!,
    idempotencyKey: (_req, _body, headers) => headers['x-shopify-webhook-id'],
  }),
  (req, res) => res.json({ received: true })
);

Fastify, FastAPI, Flask, and Django adapters available — see the full SDK reference.

v1.5 · silent drops

Catch handlers that returned 200 OK but never actually processed the order. Especially nasty for Shopify — once the response is acknowledged, the event is gone. Guide →

v1.5 · signature diagnostics

When X-Shopify-Hmac-Sha256 verification fails, the dashboard surfaces the specific reason (wrong secret, body re-parsed before verification) and the likely fix.

Ship it before Shopify unsubscribes you.

Free forever for 1,000 events/month. No credit card. Install in 60 seconds.

Start Free