Send signed order data from a storefront, ERP, automation tool, script, or custom checkout into the same Gantry fulfillment queue used by native sales channels.
Send orders from a homegrown checkout without waiting for a native integration.
Let middleware push paid orders into Gantry after your own validation or transformation step.
Keep payment or storefront credentials outside Gantry and send only the fulfillment data Gantry needs.
POST request with Content-Type: application/json.X-Gantry-Timestamp: current Unix timestamp in seconds.X-Gantry-Signature: sha256=<hex digest>.X-Gantry-Event-Id: optional stable id for dedupe. If omitted, Gantry uses the order id.
The signature is HMAC-SHA256 of timestamp.raw_body using the
channel signing secret. The raw body means the exact bytes sent in the
request, before formatting or parsing changes.
Gantry normalizes accepted payloads into orders, order items, fulfillment records, and inventory auto-learning when that workspace feature is enabled.
{
"order_id": "ORDER-1001",
"customer": {
"name": "Nova Lane",
"email": "nova@example.com",
"phone": "+15555550123"
},
"shipping_address": {
"line1": "17 Pixel Court",
"line2": "",
"city": "Demo City",
"state": "CA",
"postal_code": "90210",
"country": "US"
},
"items": [
{
"id": "line-1",
"sku": "DEMO-BLUE",
"name": "Demo MK.I Blue",
"quantity": 1,
"price": "29.99"
}
],
"amount_total": "29.99",
"currency": "USD",
"payment_status": "paid",
"status": "open",
"created_at": "2026-07-06T12:00:00Z"
}
import hashlib
import hmac
import json
import time
import requests
secret = "channel-signing-secret"
url = "https://fsr-labs.com/webhooks/custom/your-channel-id"
payload = {
"order_id": "ORDER-1001",
"customer": {"name": "Nova Lane", "email": "nova@example.com"},
"shipping_address": {
"line1": "17 Pixel Court",
"city": "Demo City",
"state": "CA",
"postal_code": "90210",
"country": "US",
},
"items": [{"sku": "DEMO-BLUE", "name": "Demo MK.I Blue", "quantity": 1}],
}
body = json.dumps(payload, separators=(",", ":")).encode("utf-8")
timestamp = str(int(time.time()))
message = timestamp.encode("utf-8") + b"." + body
signature = hmac.new(secret.encode("utf-8"), message, hashlib.sha256).hexdigest()
requests.post(
url,
data=body,
headers={
"Content-Type": "application/json",
"X-Gantry-Timestamp": timestamp,
"X-Gantry-Signature": f"sha256={signature}",
"X-Gantry-Event-Id": "ORDER-1001-created",
},
timeout=10,
)