When Shopify Oxygen Hits the Limits: Lessons from Quota Failures

Introduction

Shopify Oxygen is powerful, but it isn’t unlimited. Developers who ignore edge quotas risk failed deploys, broken storefronts, or slow holiday traffic.

This post explores common ways teams hit Oxygen limits — and how to design guardrails to avoid them.

The Limits in Oxygen

  • Subrequest budget → ~40 per route.
  • Worker bundle size → ~4–5MB compressed.
  • Memory quota → ~128MB (per edge worker).
  • CPU time → capped per request (~30s max).

👉 These aren’t “suggestions” — exceed them, and your store will fail.

Common Failure Scenarios

1. Too Many GraphQL Subrequests

  • ❌ Each PDP calls 50+ Storefront API queries.
  • Result: request fails.
  • Fix: batch queries, cache common data.

2. Oversized Bundles

  • ❌ 9MB bundle → deploy rejected.
  • Fix: tree-shaking, dynamic imports, CDN for assets.

3. Memory Overload

  • ❌ Attempting large in-memory joins in Oxygen worker.
  • Fix: push heavy joins to serverless function, not edge.

4. CPU Exhaustion

  • ❌ Slow external API calls block loaders.
  • Fix: SSR product data, stream external CMS/reviews later.

Guardrails

Subrequest Budget Middleware

export function enforceSubrequestBudget(count) { if (count > 40) throw new Error("Exceeded Oxygen subrequest limit"); }

Bundle Analyzer in CI/CD

  • Fail build if bundle >5MB.

Secret Management

  • Never load Admin API from Oxygen. Use serverless proxies instead.

Streaming Best Practice

  • Always defer() external/secondary data.

Case Example: Black Friday Failure

  • Brand deployed 12MB worker with >70 subrequests per PDP.
  • Black Friday traffic = site failures, lost revenue.
  • Postmortem: rebuilt with batched queries + CDN assets.
  • Relaunch = <4MB worker, <35 subrequests.
  • Next BFCM → flawless scale.

Developer Checklist

  • ✅ Keep worker bundles <5MB compressed.
  • ✅ Cap subrequests <40.
  • ✅ Move heavy data ops to serverless functions.
  • ✅ SSR critical data, stream secondary.
  • ✅ Monitor memory/CPU usage in profiler.

Conclusion

Oxygen is fast and global — but only within limits. Developers must treat quotas as hard guardrails, not guidelines.

Respect the limits, and Oxygen will scale. Ignore them, and it will fail you when you need it most.