Skip to main content
— Concept walkthrough

Why an order takes a few minutes to appear in Alva

Alva Digital Downloads processes Shopify ORDERS_PAID webhooks through Google Cloud Pub/Sub for reliability — typical end-to-end latency is 1–30 seconds. Heavy traffic, fraud holds, ZIP regeneration, or webhook retries can extend that to several minutes.

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.

Screenshot needed

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.

The ORDERS_PAID pipeline from Shopify to the customer's inbox.

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

Why route through Pub/Sub at all?

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.

Does the customer wait for the webhook?

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.

How long does Shopify keep retrying?

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?

Still stuck? Email us.

Last updated 2026-05-06