Back to Blog
Engineering14 May 20267 min read · 1,550 words

Shopify GraphQL Admin API: Production Rate Limit Strategy (2026)

N7

No7 Engineering Team

Growth Architecture Unit

Engineering — Shopify GraphQL Admin API: Production Rate Limit Strategy (2026) — illustration

The Shopify Admin GraphQL API does not rate-limit by request count; it limits by calculated query cost. If you treat it like a REST endpoint and fire concurrent paginated requests, your application will hit a wall of 429 errors. Managing this API in production requires extracting the throttle status from every response, queueing mutations based on point availability, and knowing exactly when to abandon synchronous queries for the Bulk Operations API.

How calculated query cost replaces REST rate limits

In the legacy REST API, rate limits were straightforward: a standard store allowed two requests per second, with a burst bucket of 40. The GraphQL Admin API discards request counting entirely in favour of a complexity-based model. Every requested field, connection, and pagination argument carries a point value.

A simple query fetching a product ID and title costs 1 point. A query fetching a product, its first 50 variants, and the first 10 metafields for each variant costs significantly more. Shopify calculates this cost before execution. If the requested query cost exceeds your available bucket, the request is rejected immediately.

The trade-off here is network overhead versus point consumption. While GraphQL allows you to fetch a product, its inventory, and its metafields in a single HTTP request, doing so aggressively across a large catalogue will rapidly drain your API capacity. We typically see engineering teams over-fetch data in their initial GraphQL migrations, leading to brittle integrations that fail during peak sync periods.

Extracting throttleStatus for production retry logic

You cannot blindly retry a throttled GraphQL request using a standard exponential backoff. Because the API tells you exactly how much capacity you have left and how fast it regenerates, your retry logic should be deterministic.

Every successful and throttled response from the Shopify Admin GraphQL API includes an extensions.cost.throttleStatus object. This object contains three critical integers: maximumAvailable, currentlyAvailable, and restoreRate.

Production integrations must parse this object on every network call. If currentlyAvailable drops below a safe threshold — usually around 200 points — your application should pause the queue. The pause duration is not a guess; it is calculated by dividing the deficit by the restoreRate.

This fails when you have multiple independent workers querying the same store. The throttleStatus represents the global state of the store's API bucket, not the state of your specific app. If a third-party inventory app is aggressively consuming points, your currentlyAvailable value will drop unexpectedly between requests. In our experience, highly concurrent architectures require a centralised rate-limit coordinator (often backed by Redis) to prevent worker collisions.

Shopify Plus vs Standard GraphQL rate limits in 2026

The ceiling for query execution depends directly on the merchant's subscription tier. For standard Shopify plans, the API bucket holds a maximum of 1,000 points and restores at 50 points per second. This means the absolute maximum cost of a single query cannot exceed 1,000 points, regardless of how long you wait.

Shopify Plus merchants receive double the capacity. The Plus bucket holds 2,000 points and restores at 100 points per second. This higher ceiling allows for deeper pagination and more complex nested connections, which is critical when dealing with B2B company locations or extensive metafield architectures.

However, relying on the Plus limit creates a portability risk. If you build a custom app that routinely executes 1,500-point queries, it will instantly fail if installed on a standard store. If you are building public apps or integrations that span multiple merchant tiers, you must cap your maximum query cost at 1,000 points and rely on pagination, even if the target store is currently on Plus.

Decision Matrix: Synchronous Query vs Bulk Operation

Use this rule set to determine when to stop paginating and switch to the Bulk Operations API.

  • Total records under 1,000: Use synchronous paginated GraphQL queries. The network overhead is minimal, and the cost will not deplete a standard bucket.
  • Total records 1,000 to 10,000: Use synchronous queries only if the data is required immediately for a user-facing interaction. Otherwise, queue a background job.
  • Deeply nested connections: Switch to Bulk Operations if you need more than 500 products with variants and metafields. The nested cost multipliers will trigger throttling.
  • Historical data extraction: Always use Bulk Operations. Synchronous pagination will fail due to cursor expiration or rate limiting during long-running extractions.

When to abandon throttled queries for the Bulk Operations API

The most common mistake we see in Shopify GraphQL implementations is attempting to sync an entire product catalogue using standard paginated queries. Even with perfect throttleStatus management, fetching 50,000 products will take hours and constantly block other API consumers.

When you need to extract large datasets, you must switch to the Bulk Operations API. This API allows you to submit a single GraphQL query that Shopify executes asynchronously. The results are written to a JSONL file, and Shopify provides a secure URL to download the file once the operation completes.

The primary advantage is that Bulk Operations do not consume points from your standard API bucket. You can extract 100,000 orders without impacting the store's live integration capacity.

But here is when this fails: you can only run one Bulk Operation at a time per store. If your application triggers a bulk product export, and a separate service attempts to trigger a bulk order export before the first one finishes, the second request will be rejected. Furthermore, polling the operation status requires careful state management. If your worker dies while waiting for the webhook or polling the status, the JSONL file might expire before you download it.

How to manage high-volume mutations in 4 steps

Mutations are inherently more expensive than queries. Standard mutations like productUpdate or metafieldsSet carry a base cost of 10 points. If you need to update inventory levels across 5,000 variants, you cannot send them all in a single payload.

Shopify limits input arrays to 250 items per request, but you will often hit the query cost limit before you hit the array limit. To manage high-volume mutations, you must batch your payloads based on the calculated cost, not just the array size.

  1. Calculate the mutation cost per item. Multiply the base cost by your batch size to ensure the total stays safely under 800 points.
  2. Monitor the restoreRate during execution. Track the regeneration speed to prevent throttling when consuming capacity at exactly 50 points per second.
  3. Implement a token bucket queue locally. Check your local Redis bucket before dispatching to sleep the worker instead of relying on a 429 error.
  4. Process the userErrors array. Iterate over the response array to catch validation failures that return a deceptive HTTP 200 status.

Testing query efficiency with the Shopify Dev MCP Server

Validating query cost during development has historically required executing the query against a live staging store and inspecting the response headers. This slows down the feedback loop and makes local testing difficult.

In 2026, the standard approach is to use the Shopify Dev MCP Server. This Model Context Protocol server exposes the Shopify Admin GraphQL schema directly to your local development environment and AI coding assistants. By introspecting the schema locally, you can validate query structures and identify expensive nested connections before they hit a real API bucket.

This is particularly useful when designing complex queries that involve both standard Admin data and storefront-specific configurations. However, the MCP server does not simulate live API consumption. It will tell you if a query is syntactically valid, but it will not warn you if multiple concurrent queries will exhaust the 50 points/second restore rate. You still need robust integration tests that mock the throttleStatus behaviour.

The migration cost: moving from REST endpoints

Shopify has been deprecating REST endpoints in favour of GraphQL for several years. Features like Product Bundles, complex B2B pricing, and advanced metafield definitions are exclusively available via GraphQL. If you are maintaining a legacy REST integration, the migration is no longer optional.

The migration cost is typically £15,000-£40,000 for a medium-complexity custom app, depending on how deeply the app relies on REST's call-counting limits. The engineering effort is rarely in rewriting the queries; it is in re-architecting the queueing system.

If your app updates prices based on external ERP triggers, your legacy REST queue likely dispatches two requests per second. Migrating this requires replacing the simple rate limiter with a cost-aware batching engine. If you also use Shopify Functions to handle custom cart logic, you must ensure your Admin API mutations do not conflict with the data structures expected by your WebAssembly modules.

What to do next

If your custom applications are still relying on Shopify's REST endpoints, or if your GraphQL implementation lacks a cost-aware retry mechanism, your integration is fragile. The first step is to audit your existing network calls and log the requestedQueryCost and actualQueryCost for every request.

Identify the queries that routinely consume more than 500 points. These are your bottlenecks. Refactor them to use shallower pagination, or move them entirely to the Bulk Operations API if they are not serving real-time user requests. If you are operating on a standard plan and consistently hitting the 1,000-point ceiling, evaluate whether the cost of optimising the queries outweighs the cost of upgrading to Shopify Plus for the 2,000-point bucket. We typically find that spending weeks re-architecting a heavily constrained app is more expensive than the platform upgrade.

Frequently Asked Questions

The questions buyers and engineers ask us most about this topic.

How much does it cost to migrate from Shopify REST to GraphQL in 2026?

Migrating a legacy custom app from REST to GraphQL typically costs between £15,000 and £40,000, depending on complexity. The primary engineering expense is not rewriting the queries, but re-architecting your queueing system to handle calculated query costs instead of simple request counting.

What is the difference between standard and Shopify Plus GraphQL rate limits?

Standard Shopify plans cap the Admin GraphQL API at a 1,000-point bucket that restores at 50 points per second. Shopify Plus doubles this capacity, providing a 2,000-point maximum bucket with a 100 points per second restore rate, allowing for significantly deeper pagination.

When does the Bulk Operations API make sense vs standard queries?

The Bulk Operations API is required when extracting large datasets (over 1,000 records) or deeply nested connections that would exhaust your standard point bucket. It processes asynchronously and outputs a JSONL file, completely bypassing your live application's GraphQL rate limits.

Working on this? Send us the details — we'll take a look.