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
| Event | Description |
|---|---|
payment.succeeded | Payment succeeded; inspect the order status for fulfilment. |
payment.failed | Stripe payment failed. |
refund.succeeded | A refund succeeded. |
subscription.started | A 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
- Go to Partner Portal → Store Settings → Payments & Commerce
- Enter your webhook URL (must be HTTPS in production)
- Set a webhook secret for signature verification
- 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