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!