Shopify Rate Limits and How Luminous Manages Them

Shopify enforces a limit on how quickly external systems can update inventory via its REST API. When too many calls are sent too fast, Shopify rejects them with a "too many requests" response and tells the caller to wait before trying again.

What Luminous does

Luminous automatically paces outgoing inventory updates to stay within Shopify's per-store limit. Specifically:

  • Throughput cap: Luminous sends at most 2 inventory update calls per second per Shopify store, regardless of how many sync jobs are running in parallel. This is coordinated across all concurrent jobs, so a store with hundreds of SKUs updating at the same time stays within the limit.
  • Backoff on rejection: If Shopify does reject a call and specifies how long to wait (via its Retry-After header), Luminous honors that wait time before retrying — and always waits at least one second, even if no wait time was specified.
  • Deferral instead of failure: If a slot cannot be acquired quickly enough (for example, during an unusually large batch), the affected SKU is deferred to the next sync cycle rather than counted as a failure. It will be picked up and retried automatically.

Why a sync cycle may take longer

Because updates are now paced rather than fired all at once, a store with a large catalog may take longer to complete a full sync cycle than it did previously. This is expected and is a trade-off for reliability: a paced sync that completes successfully is better than a burst that gets partially rejected and leaves inventory out of sync.

As a rough guide: at 2 updates per second, 200 changed SKUs take approximately 100 seconds to push.

SKUs are not penalized for rate-limit deferrals

Luminous tracks consecutive push failures per SKU and can temporarily suppress a SKU that repeatedly fails. Rate-limit deferrals (the "too many requests" case) are excluded from this failure count — a SKU deferred due to Shopify rate limiting will never be suppressed on that basis alone. Only genuine, unrecoverable errors (such as the product no longer existing in Shopify) count toward the failure threshold.

This applies to the REST sync path only

This pacing applies to Shopify's legacy REST inventory endpoint. If your integration account is configured to use the GraphQL-based adjustment method (for negative-quantity support or on-hand syncing), Shopify's own GraphQL rate limiter governs those calls and is unaffected by this change.

Nothing to configure

This behavior is on by default for all Shopify integrations. No settings changes are required. If you believe your store is experiencing sync delays unrelated to rate limiting, contact support and mention your channel name and the approximate time the delay was observed.