Incorrect compareAtPrice on Admin GraphQL

We’re seeing inconsistent data for a handful of products. For example product gid://shopify/Product/15459955114371

The product has a compare at price on the frontend (/product/product-handle.json screenshot below)

However, we’ve queried the product with the below query on the Admin GraphQL 2025-10 version:


query getProduct($id: ID!) {
    product(id: $id) {
        id
        variants(first: 10) {   
            edges {
                node {
                    id
                    price
                    compareAtPrice
                }
            }
        }
        compareAtPriceRange {
            minVariantCompareAtPrice {
                currencyCode
                amount
            }
            maxVariantCompareAtPrice {
                currencyCode
                amount
            }
        }
    }
}

And it result in:


{
  "data": {
    "product": {
      "id": "gid://shopify/Product/15459955114371",
      "variants": {
        "edges": [
          {
            "node": {
              "id": "gid://shopify/ProductVariant/56799075926403",
              "price": "185.00",
              "compareAtPrice": null
            }
          },...
      "compareAtPriceRange": null
...

This doesn’t seem to change no matter the market the user is in.

Any insights here?

Hi @BeefyNachos! I was able to replicate this on my test store and think figured out what’s happening. The discrepancy you’re seeing is related to how the Admin API handles compareAtPrice when you have price lists configured with the compareAtMode setting.

When a price list has compareAtMode set to NULLIFY, the Admin API will return null for compareAtPrice in that market context, even though the base variant has a compareAtPrice value. This is actually documented behavior - when compareAtMode is NULLIFY, the price list intentionally returns null for compareAtPrice.

Here’s what I tested:

  • Base variant query (no market context): compareAtPrice shows the value

  • Query with market context where price list has compareAtMode: NULLIFY: compareAtPrice returns null

The /product/product-handle.json endpoint you’re seeing the compareAtPrice on might be using a different market or falling back to base pricing. To check what’s actually configured for your markets, you can query:

query checkPriceListSettings {
  markets(first: 10) {
    edges {
      node {
        id
        name
        catalogs(first: 1) {
          edges {
            node {
              priceList {
                id
                name
                parent {
                  settings {
                    compareAtMode
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

If you need the compareAtPrice to show up in the Admin API for specific markets, you’d need to either change the compareAtMode from NULLIFY to ADJUSTED on those price lists, or query without market context if you just need the base variant values.

Does that help explain what you’re seeing? If not, share the response to the above query and I can dig in further for you!

Hi @Donal-Shopify,

Thanks for the reply.

That does make sense, however, the original Admin GraphQL query was without a market context (I was under the impression only the Storefront API could have a market context).

So shouldn’t only the base variant compareAtPrice values have shown in that query response?

This is also intermittent, on the Admin query we use (where multiple products were returned) some products had a compareAtPrice, while others didn’t (despite them all having a visible frontend compareAtPrice).

As a sidenote, as this is a app user of our app and we don’t have access to their admin, we’re asking if they may have left the compareAtPrice null in the Admin, but set one in every Market catalog - which I’m assuming is possible and could cause the above behaviour?

@BeefyNachos Great shout - I tested your hypothesis and it’s very likely what’s happening.

I created a product with null base compareAtPrice, then added a fixed compareAtPrice to a market price list using priceListFixedPricesAdd. This resulted in:

  • Base variant query (no context): compareAtPrice: null

  • Same query after adding market price: compareAtPrice: null (unchanged)

  • Query with contextualPricing(context: {country: JP}): compareAtPrice: "67.67"

So the merchant likely has base variant compareAtPrice set to null, but market catalogs have compareAtPrice values. This is a valid configuration and could well explain the intermittent behavior - some products have base values set, others don’t, but they all have market-specific values.

To get the market-specific compareAtPrice values via API, use contextualPricing with the appropriate market context, or query the price lists directly.

Hope this helps!

Hi @Donal-Shopify,

Thanks for the info. We’ll wait on the merchant to confirm this is the case. If they do have a base variant compareAtPrice set and something else is going on, I’ll reply here. Otherwise, I’ll mark this as solved.

Thanks a lot.

1 Like

Hey @BeefyNachos , Happy New Year! Just following up to see if the Merchant has been able to confirm their setup matches what I outlined above?

If it differs, let me know and I’ll be happy to take a closer look for you!

Thanks for following up.

No reply from the merchant yet, I’ve chased them again.

1 Like

No word from the merchant, I’m going to mark this as solved with the assumed cause being the reason for the mismatch.

1 Like