Unable to provide weight & weight_unit in ProductSet variations payload

Topic summary

Main issue: Moving from REST to Admin GraphQL, developers can’t set variant weight and weight_unit in the ProductSet mutation. Attempting to include weight on variants returns an error (field not defined on ProductVariantSetInput). In GraphQL, weight is part of the InventoryItem associated with a variant, not the ProductSet input.

Current guidance: A Shopify staff member confirms ProductSet no longer supports setting variant weight. Suggested alternatives:

  • Use productVariantsBulkCreate/productVariantsBulkUpdate to manage variants and their inventory items.
  • Proposed multi-step workflow: productSet (create/update product) → productOperation (retrieve results) → productDeleteMedia (cleanup) → productCreateMedia (add media) → productVariantsBulkUpdate (configure InventoryItem) → inventorySetQuantities (enable fulfillment inventory) → publishablePublish (publish product).

Developer feedback: Multiple calls and rate limits make large-scale syncs difficult and unstable; desire a single bulk operation like REST/ProductSet. Requests for a roadmap and feature parity; a linked AMA indicates Shopify is aware of the gap.

Status: No direct way to set variant weight via ProductSet. Workarounds exist but are complex. Discussion remains open with unresolved requests for ProductSet to support measurements.

Summarized with AI on December 10. AI used: gpt-5.

Since we are forced to migrate from an easy-to-understand REST API to the new GraphQL API, I could not figure out how to achieve the same product synchronization logic from “our” system into the Shopify store.

In the REST API, we could provide weight & weight_unit in the variations array along with a product. If I try to do the same with GraphQL’s ProductSet mutation, I get the following error:

Variable $entity11846 of type ProductSetInput! was provided invalid value for variants.0.weight (Field is not defined on ProductVariantSetInput)

(which makes sense, as the property is not available) https://shopify.dev/docs/api/admin-graphql/2024-10/mutations/productSet#argument-input => variations.

I have the following input payload:

{
  "title": "Lorem Ipsum Dolor Sit",
  "handle": "lorem-ipsum-dolor-sit",
  "descriptionHtml": "

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

",
  "productType": "Lorem, Ipsum, Dolor & Sit Amet",
  "files": [
    {
      "originalSource": "https://example.com/lorem-image-1.jpg",
      "contentType": "IMAGE"
    },
    {
      "originalSource": "https://example.com/lorem-image-2.jpg",
      "contentType": "IMAGE"
    }
  ],
  "variants": [
    {
      "price": 10.50,
      "optionValues": [
        {
          "optionName": "Lorem",
          "name": "Ipsum"
        }
      ]
    },
    {
      "price": 13.99,
      "optionValues": [
        {
          "optionName": "Dolor",
          "name": "Sit"
        }
      ]
    }
  ],
  "productOptions": [
    {
      "name": "Lorem",
      "position": 1,
      "values": [
        {
          "name": "Ipsum"
        }
      ]
    }
  ]
}

So how to achieve to add the weight and weight unit values into the variations payload?

Do you mean variants? You should update your post since variations doesn’t exists.

However I checked the documentation and the measurement field which contains the weight is associated with the InventoryItem type.
Since the InventoryItem type isn’t in ProductSetInput type i don’t think you can update the weight using the ProductSet mutation.

Is this a bug? Idk, lemme know if you find a solution

Thanks for the Reply. Indeed its “variants” not “variations”, sadly i am unable to update the post.

@nadario

This operation is no longer supported in productSet. You can use productVariantsBulkCreate to implement your business

Thanks, @Kyle_liu , for the answer. At least now I am aware that I cannot use the ProductSet.

My two cents on this (knowing this is not your fault, @Kyle_liu , of course)

We have a sync process from our system into Shopify, and now using different strategies with different endpoints is a huge mess. The ProductSet was meant for migration (as far as I know). The ProductSet option is perfect for handling all these processes in bulk with similar behavior. Now, I have to manually update all variants for each product, just because of this. On a huge dataset, this is a real mess.

So if Shopify is forcing us to use the new GraphQL endpoints (I can understand such decisions technically), it should at least provide a similarly good experience for developers and not the opposite.

Yes, I agree with your point of view. Many people have complained about it.

is there a road map for features? or is there any thread or feature request from other developers, without this feature we won’t be able to migrate to the new graphql system. with all the rate limits and splitting up things in different requests, its almost impossible to correctly sync hundreds of products into shopify.

Shopify seems to be aware of the problem: https://community.shopify.com/post/2722289

You can try the steps:

productSet mutation to create or update the product

productOperation query to get the set operation and the product

productDeleteMedia to clean up old media (if it’s an update)

productCreateMedia to aappend the new media

productVariantsBulkUpdate to set up inventory item for product variants

inventorySetQuantities to enable fulfillment inventory

publishablePublish to publish the product to the online store

Thanks @Kyle_liu for taking time, i appreciate that a lot, very kind of you!

That’s insane, its not possible to manage all those calls, there are also api rate limits to consider, this will never run stable when you have 100 of products. Sometimes your calls get rate limited then maybe an update call won’t run anymore etc. Its a shame they don’t provide a good migration path. We will wait until the hopefully add measurements to the ProductSet call - everything else is a mess.

I concur, a mess it certainly is, I have been working on API consumption code for 20 years and Shopify is painful to work with….