Developers

Developers

Checkout, digital delivery and store APIs.

Webhooks

Configure a webhook URL in your store settings to receive real-time order status notifications. Events are sent as POST requests with an HMAC signature for verification.

Available Events

EventDescription
payment.succeededPayment succeeded; inspect the order status for fulfilment.
payment.failedStripe payment failed.
refund.succeededA refund succeeded.
subscription.startedA Stripe subscription started.

Webhook payload (selected fields)

{
  "event": "payment.succeeded",
  "order": {
    "public_id": "ORD-ABC123",
    "external_reference": "your-ref-123",
    "status": "fulfilled",
    "total_minor": 2999,
    "currency": "GBP"
  },
  "customer": {"email": "buyer@example.com"},
  "items": []
}

Signature Verification (Python)

import hmac, hashlib

# Standard store webhooks sign the raw request body.
header = request.headers.get("X-Creativemark-Signature", "")
signature = header.removeprefix("sha256=")
expected = hmac.new(
    webhook_secret.encode(),
    request.body,
    hashlib.sha256
).hexdigest()
if not header.startswith("sha256=") or not hmac.compare_digest(expected, signature):
    return HttpResponse(status=401)

The native WordPress connector uses a timestamp-prefixed signature and its own verification flow. Use the connector plugin for those deliveries.

Setup

  1. Go to Partner Portal → Store Settings → Payments & Commerce
  2. Enter your webhook URL (must be HTTPS in production)
  3. Set a webhook secret for signature verification
  4. Your server should respond with HTTP 200 within 10 seconds

Stripe Webhooks (Self-hosted / LAN)

If your instance is on a private network, use the Stripe CLI to forward events:

stripe listen --forward-to http://<your-host>:8000/stripe/webhook/ \
  --events payment_intent.succeeded,charge.dispute.created,\
    charge.dispute.updated,charge.dispute.closed,\
    charge.dispute.funds_withdrawn,charge.dispute.funds_reinstated,\
    charge.refunded