How webhook delivery works
Shopify fires an ORDERS_PAID event the moment payment captures. The event lands in a Google Cloud Pub/Sub topic, Alva's worker pulls the message, writes the Customer and Purchase rows in PostgreSQL, then sends the delivery email through Postmark or MailerToGo. The Pub/Sub buffer is what makes this reliable: if a deploy is mid-rollout or the database is briefly slow, the message waits in the queue and is redelivered until the worker acknowledges success.
Simple horizontal pipeline diagram with five labelled stages: Shopify ORDERS_PAID → Google Cloud Pub/Sub topic → Alva worker → PostgreSQL (Customer + Purchase) → Email send (Postmark / MailerToGo). Use Alva brand teal/blue. No real customer data.
Common reasons for delay
Heavy load on the Pub/Sub queue
During flash sales the topic can hold thousands of pending messages. Alva's worker drains them in order, so an order at the back of a 5,000-message queue waits its turn. Latency here is usually under two minutes.
Fraud check holding the email
When fraud checks are enabled, the worker writes the order to FraudCheckQueue and pauses delivery until Shopify's Risk API responds. Most checks resolve in seconds; orders routed to manual review wait until you approve them. License keys are never assigned before fraud approval.
Large ZIP pack regeneration
If the product is a pack and one of its files changed since the last cached ZIP was built, Alva regenerates the archive in R2 before sending the email. Multi-gigabyte packs can take minutes.
Per-product email setting changed mid-flight
If you toggle a per-product email template or disable emails for a product while an order is in flight, the worker re-reads ProductEmailSettings on the next attempt. The order still completes — the email simply uses the new rule.
Webhook retries from Shopify
Shopify retries a failed webhook up to 19 times over roughly 48 hours, backing off between attempts. If the first delivery hit Alva during a deploy, the order may not appear until the next retry succeeds — usually within 5–10 minutes.
What to do if it's been more than 5 minutes
Five minutes covers the vast majority of cases. Past that window, work this checklist:
- Confirm the order is paid in Shopify — pending or authorised orders never fire
ORDERS_PAID. - Open the Alva admin orders list. Held means fraud is gating delivery; Processing means the worker is still on it.
- Check Settings → Email to confirm email delivery is enabled and a verified sender is configured.
- If the order is missing entirely, fall back to Find a customer's download link to re-trigger delivery manually.
Frequently asked questions
Pub/Sub buffers webhooks during deploys, outages, and traffic spikes so a paid order is never dropped. The worker only acknowledges the message after the Purchase row is written.
No. The thank-you page uses a provisional download token from the checkout extension, so files appear instantly even when the ORDERS_PAID webhook is still in flight.
Up to 19 times over roughly 48 hours, with exponential backoff. As long as Alva eventually returns success, the order processes normally.
See also
Was this helpful?
Last updated 2026-05-06