Shopify products.json to CSV
Drop a Shopify products.json file and get one row per variant, with the product title, vendor and tags on every row.
Your catalog is converted on this device and is never uploaded. How your data stays local.
Problems
JSON Mill turns a Shopify products.json file into a CSV with one row per variant. Each row repeats the product's fields, such as title, handle, vendor, product type and tags, next to the variant's own SKU, price, options and availability.
This page opens the export already set up for Shopify: records at products, one row per nested item. The conversion runs in your browser, so your catalog is never uploaded.
How to convert Shopify products.json to CSV
-
Get the products.json file. Save the JSON your store, an app or the Shopify API gave you as a file. JSON Mill reads files shaped like
{"products": [...]}, each product with avariantsarray. - Open it in JSON Mill. Drop the file anywhere on the workspace or press Open file. Press Sample to see a small fictional catalog in the same shape first.
-
Check the variant rows. In the Table view, pick
products[].variantsin the Data list to see every variant across all products in one table. -
Review the export. Press Export. The summary line reads, for example,
8 products to 18 rows, and the columns list marksvariants (one row each). Leave out fields you do not need, such asbody_htmlorimages. - Download the CSV. Press Download. For Excel, press Excel preset under Cleaning first so long IDs and accented product names come through intact.
Example: two products, three variants
A trimmed products.json with a two-color apron and a mug that has a single default variant. The CSV has one row per variant.
{
"products": [
{
"id": 8412000000001,
"title": "Linen Apron",
"handle": "linen-apron",
"vendor": "Northfield Goods",
"product_type": "Kitchen",
"tags": ["Gift", "Linen"],
"variants": [
{ "id": 45120000000011, "title": "Natural", "option1": "Natural", "sku": "APR-NAT", "price": "38.00", "available": true },
{ "id": 45120000000012, "title": "Charcoal", "option1": "Charcoal", "sku": "APR-CHA", "price": "38.00", "available": false }
],
"options": [
{ "name": "Color", "position": 1, "values": ["Natural", "Charcoal"] }
]
},
{
"id": 8412000000002,
"title": "Stoneware Mug",
"handle": "stoneware-mug",
"vendor": "Northfield Goods",
"product_type": "Kitchen",
"tags": ["Ceramic"],
"variants": [
{ "id": 45120000000021, "title": "Default Title", "option1": "Default Title", "sku": "MUG-STN", "price": "16.50", "available": true }
],
"options": [
{ "name": "Title", "position": 1, "values": ["Default Title"] }
]
}
]
}
| id | title | handle | vendor | product_type | tags | options | variants.id | variants.title | variants.option1 | variants.sku | variants.price | variants.available |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 8412000000001 | Linen Apron | linen-apron | Northfield Goods | Kitchen | Gift; Linen | [{"name":"Color","position":1,"values":["Natural","Charcoal"]}] | 45120000000011 | Natural | Natural | APR-NAT | 38.00 | true |
| 8412000000001 | Linen Apron | linen-apron | Northfield Goods | Kitchen | Gift; Linen | [{"name":"Color","position":1,"values":["Natural","Charcoal"]}] | 45120000000012 | Charcoal | Charcoal | APR-CHA | 38.00 | false |
| 8412000000002 | Stoneware Mug | stoneware-mug | Northfield Goods | Kitchen | Ceramic | [{"name":"Title","position":1,"values":["Default Title"]}] | 45120000000021 | Default Title | Default Title | MUG-STN | 16.50 | true |
Two products with 2 and 1 variants become 3 rows. The product fields repeat on each variant row, tags are joined with a semicolon, and the options array is written as compact JSON in one cell. Prices stay exactly as Shopify sent them, as text such as 38.00, and the 14-digit variant IDs are copied digit for digit.
What the columns mean
Product fields keep their JSON names, such as title, handle, vendor and product_type. Variant fields are prefixed with variants., such as variants.sku, variants.price and variants.option1. Nested objects inside a variant become dotted columns, and nested arrays inside a variant are written as compact JSON.
Shopify product data usually has a few heavy fields. body_html holds the product description as HTML and repeats on every variant row, and images can hold many image objects. On a large catalog these two can make up most of the file. JSON Mill estimates the size before you download and, when a repeated column is heavy, offers buttons to drop it or strip the HTML.
This is not Shopify's import template
The CSV uses the field names from your JSON, such as variants.sku, not the headers of Shopify's product import CSV, such as Handle or Variant SKU. It is meant for spreadsheets, price checks, catalog audits and feeding other tools.
You can rename any header in the Columns list and JSON Mill remembers the names on this page in your browser, but JSON Mill does not build a file that Shopify's importer accepts as is. Check Shopify's own template before importing anything back into a store.
Options
| Option | What it does |
|---|---|
| Records at | Set to products on this page. If your file has no products key, JSON Mill falls back to detecting the main array of records. |
| Nested arrays | Set to One row per nested item on this page, which expands the variants. Switch to Join into one cell for one row per product. |
| Columns | Leave out heavy fields such as body_html and images, rename headers, and reorder columns. |
| Strip HTML from text | Turns body_html descriptions into plain text. |
| Excel preset | Byte order mark, CRLF line endings, HTML stripped and IDs kept as text, for opening the CSV in Excel. |
| Keep IDs as text | Writes product and variant IDs as ="8412000000001" so Excel shows every digit instead of scientific notation. |
Limits
- JSON Mill opens one file at a time. If your catalog came as several pages of JSON, convert each file separately; it does not merge them.
- Rows mode expands the nested array with the most cells, which for Shopify products is normally
variants. Check the columns list saysvariants (one row each); if a catalog has many images and very few variant fields,imagescould be picked instead. - Other nested arrays, such as
imagesandoptions, are written as compact JSON in one cell on each row. - Tags arrive either as a list, which JSON Mill joins as
Gift; Linen, or as one comma-separated string, which is kept as it is. - JSON Mill does not fetch products from your store. You give it a file you already have, and it never contacts Shopify.
Questions
- How do I turn Shopify products.json into a spreadsheet?
- Open the file on this page, press Export, and download. The export is already set to one row per variant with the product fields repeated, so the CSV opens in Excel, Google Sheets or Numbers as a flat variant list. For Excel, use the Excel preset under Cleaning first.
- Why does each product appear on several rows?
- Because each row is one variant. A product with three sizes has three variants, so it gets three rows, each with the product's title, vendor and tags repeated next to that variant's SKU and price. Switch Nested arrays to Join into one cell if you want one row per product instead.
- Will Excel break my product and variant IDs?
- It can. Shopify IDs are 13 to 14 digits long, and Excel shows numbers that long in scientific notation when it opens a CSV. Turn on Keep IDs as text or the Excel preset to keep them readable, or use JSON to Excel, which writes them with a plain number format.
- Why is my CSV so large?
- Usually because
body_htmlorimagesrepeats on every variant row. A long HTML description on a product with 20 variants is written 20 times. JSON Mill estimates the file size before you download and, when one column is heavy, offers to drop it or strip its HTML. - Can I see all variants in one table before exporting?
- Yes. In the Table view, choose
products[].variantsin the Data list. JSON Mill shows every variant from every product as one table you can sort, filter and summarize, for example to find variants with no SKU. - Does this work with the Shopify Admin API product export too?
- Yes, as long as the file has a
productsarray whose items have avariantsarray, which is the shape of both the storefront products.json and the Admin REST API products response. Field names differ a little between the two, and JSON Mill keeps whatever names your file uses.
Related tools
Last updated