We recently moved our app’s webhook subscriptions from HTTPS to Google Cloud Pub/Sub (uri = "pubsub://{project-id}:{topic-id}", API version 2026-04).
The docs state that “HMAC verification applies to HTTPS deliveries only. Google Cloud Pub/Sub and Amazon EventBridge deliveries don’t require it.” (strong statement btw but lets continue…)
However, every Pub/Sub message we received (so far during our testing) carries the signature as a message attribute:
{
"X-Shopify-Topic": "products/update",
"X-Shopify-Shop-Domain": "example.myshopify.com",
"X-Shopify-Webhook-Id": "…",
"X-Shopify-Event-Id": "…",
"X-Shopify-Triggered-At": "…",
"X-Shopify-API-Version": "2026-04",
"X-Shopify-Hmac-SHA256": "…",
"Content-Type": "application/json"
}
Three questions:
- Is this attribute a supported part of Pub/Sub delivery, or incidental and liable to be removed without notice?
- If supported, what exactly is signed? We assume the raw message
databytes as published, before any decoding, but this is not documented for this transport. - Are the Pub/Sub message attribute names documented anywhere? We could only find the HTTP header table.
The reason it matters: with Pub/Sub delivery, the only thing authenticating a message is the IAM policy on the topic, and delivery@shopify-pubsub-webhooks.iam.gserviceaccount.com is a single publisher identity shared across all apps using this transport. The per-app HMAC is the only signal that distinguishes a message generated for our app from any other message published by that identity, including one misrouted from a different app. We would like to verify it, but not build on an undocumented attribute without knowing whether it is guaranteed and maintained.
Thank you All
Luca