See all services Shopify Plus Partner
Action Required Developer

Move off automaticDiscounts before it is removed in 2027-01

Shopify removes the automaticDiscounts query in Admin API 2027-01. Apps that read automatic discounts need to move to discountNodes with a method:automatic filter, and regenerate their types, before they upgrade.

Executive summary

What changed

As of API version 2027-01, automaticDiscounts no longer exists on QueryRoot. A request that includes it does not quietly return empty data: it fails validation, so the entire operation errors out. The two types that only that query returned, DiscountAutomaticConnection and DiscountAutomaticEdge, are removed alongside it.

The replacement is discountNodes with query: "method:automatic". It returns DiscountNode objects, each exposing the discount itself on a discount field. The filters you already rely on carry over, including status, discount_type, discount_class, created_at, and starts_at. The practical difference is nesting. Inline fragments that used to sit directly on nodes now sit one level deeper, on discount.

One trap worth flagging: automaticDiscountNodes is also deprecated in favour of discountNodes. Migrating there buys you a second migration later. Go straight to discountNodes.

Why it matters

On the storefront, this change is invisible. It matters because of what sits on top of it. Promotional logic on enterprise stores rarely lives in one place: a custom app writes campaign discounts, a middleware job reconciles them against an ERP promotions table, and a reporting pipeline reads them for margin analysis. Each of those is a separate codebase with its own API version pin, and each one fails independently.

The consolidation is a real improvement for teams running layered promotions. Reading automatic and code-based discounts through a single paginated list removes the merge step most teams wrote by hand, and new automatic discount types will not require new query fields. If you are already managing complex discount logic at enterprise scale, that is one less branch to maintain.

Role-specific impact

Use-case example

Real-world scenario

A Plus merchant running roughly 40 concurrent automatic discounts across four markets has a nightly job that pulls every active automatic discount and reconciles it against the promotions calendar in NetSuite. The job is pinned to 2026-10. The team upgrades the app to 2027-01 without auditing the query, so it fails validation, the job records zero active discounts, and the reconciliation report flags all 40 campaigns as unbudgeted. Nothing breaks at checkout, so nobody notices until finance queries the variance three weeks later. The migration itself is about an hour of work. Cleaning up after a silent failure is a week.

Implementation checklist

  1. Search every repository, including generated GraphQL types, for automaticDiscounts, DiscountAutomaticConnection, and DiscountAutomaticEdge.
  2. Replace the query with discountNodes and pass query: "method:automatic".
  3. Move existing inline fragments one level deeper, onto the discount field of DiscountNode, adding one fragment per automatic discount type you read.
  4. Regenerate your GraphQL types or schema snapshot against 2027-01 so the shapes match.
  5. Run the updated queries against a development store on 2027-01 and diff the results against what 2026-10 returned.
  6. Confirm pagination and filter behaviour hold, then raise the version pin.

FAQ

Q: Do we have to act before 2027-01 ships?

A: Only if you intend to upgrade. Apps requesting 2026-10 or earlier keep working for as long as those versions are supported, and Shopify overlaps stable versions by at least nine months. Treat this as scheduled work in a sprint, not an emergency.

Q: Will this change the discounts our customers actually receive?

A: No. This is a read-path change in the Admin API. Discount behaviour at checkout is unaffected. The exposure is in the systems that read discount data, not in the discounts themselves.

Resources

discountNodes query reference in the GraphQL Admin API

Need guidance? Talk to Makro.