Etsy Listings with Variations

:bullseye: What is your goal?

I want to create draft listings in Etsy for physical products with variations (1. Design and 2. Size). In total there are 56 variation, each has it’s own SKU and Price. All the remaining info like title, desc, tags and listing pictures will come from a google sheet.

:thinking: What is the problem?

I don’t know which Etsy Module to choose. The ones I checked seem not give me the ability to create those variations. Is there one that does this? If so, which one and is there a video?

:test_tube: What have you tried so far?

Checked various Etsy modules.

Hi @CameoAB

There isn’t a single Etsy module that creates a full listing with variations in one step. The native “Create a Listing” module handles the basic stuffs like title, description, tags, images, price, etc. but if you want variations/inventory you need separate steps

You can use Google Sheets, Etsy create a listing, then Etsy update a listing.

From the Google Sheets you can pull title, desc, tags, pictures, category/taxonomy, etc. from your sheet to the Etsy create a listing module. This creates the base listing without variations. Then you use the “Update a Listing Inventory” or “Make an API call” if the Update module is limited. This is where you can define your two properties (Design + Size), generate all 56 combinations, and set individual SKU + Price for each.

You’ll probably need an Iterator + Array Aggregator or Create JSON module in order to build the proper products array for your inventory because each combination of Design + Size needs its own entry with price, sku, quantity, etc… In case you’re going with the API call please don’t forget to check Etsy’s documentations to make sure your JSONs are on point.

Regards.

@CameoAB

That breakdown from Daraima is spot on. One thing worth adding since you mentioned “Design” as one of your two variation properties: Etsy only lets you use two variation properties per listing, and they have to come from a specific list (Size, Color, Material, Scent, etc) unless you use their custom property slots. Since “Design” isn’t a standard Etsy property, you’ll likely need to map it to one of Etsy’s custom property IDs (513 or 514) rather than trying to create your own property name from scratch. The native module probably won’t expose this cleanly, so you may end up doing it through Make an API call to the Update Listing Inventory endpoint.

For the JSON structure itself, each of your 56 combinations becomes one entry in the products array, and each entry needs its own property_values block listing both Design and Size, plus an offerings array with the price, quantity and sku for that specific combination. If your Google Sheet already has one row per combination, you can use an Array Aggregator after your Iterator to build that products array directly from the sheet rows, which saves you from hardcoding anything.

It’s a bit of setup work the first time, but once the JSON structure is right you can reuse the same scenario for every new product, just point it at a different sheet or filtered range.

The two replies above already have the right ingredients. Custom property 513 for Design, the two-property limit, and the Iterator plus Array Aggregator pattern for building the products array are all correct. What none of them shows is the actual request body, so here’s the shape that works.

Etsy only lets a listing carry two variation properties, and “Design” isn’t one of its standard ones, so it goes on custom property 513. For Size you’ve got a choice. You can put it on the second custom slot, 514, which validates as-is, or map it to the real Size property for your taxonomy, which you look up with getPropertiesByTaxonomyId. The second is a bit more work, but it’s the one that turns on Etsy’s native size filter for buyers.

Each of your 56 sheet rows becomes one entry in the products array. A single product looks like this:

{
  "products": [
    {
      "sku": "FOX-M",
      "property_values": [
        {"property_id": 513, "value_ids": [1], "property_name": "Design", "values": ["Sunset Fox"]},
        {"property_id": 514, "value_ids": [2], "property_name": "Size", "values": ["M"]}
      ],
      "offerings": [
        {"price": 24.90, "quantity": 10, "is_enabled": true, "readiness_state_id": 1}
      ]
    }
  ],
  "price_on_property": [513, 514],
  "quantity_on_property": [513, 514],
  "sku_on_property": [513, 514]
}

The things that’ll bite you, roughly in order of how much time each one costs to figure out:

  • price_on_property, sku_on_property and quantity_on_property all have to list both property IDs, so [513, 514]. If you leave them off or only set one, Etsy quietly ignores the per-product prices and SKUs and flattens everything to the listing default. A different price per combination is the whole point for you, so this is the one to get right first.
    • Every offering needs a readiness_state_id. It’s a processing-profile ID from your shop, and it’s required in v3, so the call fails without it.
    • The sku sits on the product, not inside the offering. It’s easy to put in the wrong place, because the offering feels like where the per-item data should live.
    • value_ids are client-assigned for custom properties. You just pick your own integers, unique per value within the listing, and Etsy reconciles them on the first write. They don’t have to mean anything.
      On the Make side, the flow is Google Sheets “Search Rows” so you get one bundle per combination, then an Iterator, then an Array Aggregator where you assemble each row into the property_values and offerings structure above. That aggregated array feeds a “Make an API call” module doing PUT /v3/application/listings/{listing_id}/inventory. Create the draft listing first with the shared title, description and tags from the sheet, send the inventory call second, then attach the images last.

The Array Aggregator mapping is the part that takes some fiddling. Getting each row’s fields into the right nested spot is where I spent the most time. I built the whole thing on a sample 56-row sheet to check the details, and the assembled body validates against Etsy’s own v3 API schema.

If you get stuck on the aggregator mapping, I’d be happy to share how I set mine up!

Thank you all for your kindness to jump in give me a great starting point and even point out what/where to watch out.
Please apologize my late answer, life just happend…
I will need to built up my skill and see how far I come.
@Christo_Wilken you added the data in rows as a drill down using less columns. Would it work also if I add all data in one row? I thinks so.