How to reorder csv columns to match the shopify import format
- Step 1Get Shopify's expected column order — In Shopify admin go to Products → Import → Add file and use the sample template link, or export one existing product to see the exact header sequence. The core order is
Handle,Title,Body (HTML),Vendor,Product Category,Type,Tags,Published, then theOption1/2/3andVariant *columns, thenImage Srcand metafield columns. - Step 2Confirm your headers match Shopify's field names first — Shopify maps by header name, so
Body HTMLmust readBody (HTML)andpricemust readVariant Price. If yours differ, run csv-header-rename before reordering — reordering a column does not change its name. - Step 3Drop your product CSV onto the tool — Accepted inputs are
.csv,.tsv, and.txt. PapaParse auto-detects the delimiter, so a tab-separated supplier feed works without a setting. The tool reads the first row as headers and lists each column as a numbered row. - Step 4Reorder columns with the arrow buttons — Each header shows its current position (1, 2, 3 …). Use the up and down arrows to move a column one step at a time until the list mirrors Shopify's template — start by lifting
Handleto position 1, thenTitle,Body (HTML), andVendorbeneath it. - Step 5Apply the order and check the preview — Click Apply order. The preview shows the first 10 rows in the new column order so you can confirm
HandleandVariant Pricelanded where you expect before exporting. Re-drop the original file if you want to start over — the source is never modified. - Step 6Download and import into Shopify — Click Download CSV to save the reordered file, then upload it via Products → Import. Run a small test import (or use Shopify's import preview) before committing a large catalogue, so a header-name mismatch surfaces on a handful of rows rather than thousands.
Shopify product CSV — the column order to target
Shopify matches by header name, but reordering to this sequence makes the file auditable and matches the order Shopify's own export produces. Field names must be spelled exactly as shown for the importer to recognise them.
| Position | Header (exact) | Role | Reorder note |
|---|---|---|---|
| 1 | Handle | Unique product key; ties all variant + image rows of one product together | Lift to position 1 first — variants and images that share a Handle must group under one Handle value |
| 2-4 | Title, Body (HTML), Vendor | Core product identity and description | Body (HTML) often contains commas and markup — values are preserved exactly, only the column moves |
| 5-9 | Product Category, Type, Tags, Published, Status | Classification + publish state | Optional fields; if absent in your feed they simply will not appear — the tool never invents columns |
| 10-15 | Option1 Name, Option1 Value, Option2 Name, Option2 Value, Option3 Name, Option3 Value | Variant axes (size, colour, etc.) | Keep each Name next to its Value so the variant matrix reads cleanly |
| 16+ | Variant SKU, Variant Price, Variant Inventory Qty, Variant Inventory Tracker, Image Src, Image Position | Per-variant commerce + media data | Move Variant Price and Variant SKU near the front of this block for a faster manual price/SKU audit |
What the reorder tool changes vs. what it leaves alone
The tool repositions columns only. For anything in the right-hand column, use the linked sibling tool.
| Operation | Handled here? | Where to do it instead |
|---|---|---|
| Move a column to a new position | Yes — arrow buttons, all columns kept | This tool |
Drop a column you do not need (e.g. supplier Cost) | No — every column is preserved on output | csv-column-remover |
Rename a header to Shopify's exact name (Body HTML → Body (HTML)) | No — column names are unchanged | csv-header-rename |
| Combine two feeds (catalogue + new arrivals) into one import file | No — single file in, single file out | csv-merger |
| Edit / clean a cell value (trim spaces, fix prices) | No — cell values are byte-for-byte identical | csv-find-replace |
Free vs Pro limits for this tool
Limits are enforced on the processed result. A file or row count over the free ceiling shows an upgrade prompt rather than a partial export.
| Constraint | Free | Pro |
|---|---|---|
| Input file size | 2 MB per file | 100 MB per file |
| Result row cap | 500 rows | 100,000 rows |
| Preview shown | First 10 rows | First 10 rows |
| Output line endings | LF (\n), minimal quoting | LF (\n), minimal quoting |
Cookbook
Real before/after layouts from supplier and ERP product feeds. Headers shown as a single CSV line; SKUs and prices are illustrative.
Supplier feed with Handle buried in the middle
ExampleA dropship supplier exports product data with descriptive fields first and the Shopify Handle deep in the file. Shopify still matches by name, but a buried Handle makes it hard to confirm that variant rows group correctly. Lift Handle to position 1.
Before (supplier order): Title,Vendor,Body (HTML),Variant Price,Handle,Variant SKU Nitro Mug,Acme,"<p>12oz steel</p>",14.99,nitro-mug,ACM-NM-12 After (Apply order = Handle, Title, Body (HTML), Vendor, Variant SKU, Variant Price): Handle,Title,Body (HTML),Vendor,Variant SKU,Variant Price nitro-mug,Nitro Mug,"<p>12oz steel</p>",Acme,ACM-NM-12,14.99 Cell values unchanged — only column positions moved.
Variant option columns scattered across the file
ExampleAn ERP exports Option1 Name and Option1 Value columns separated by unrelated fields, so the variant matrix is hard to read. Group each Name beside its Value.
Before: Handle,Option1 Name,Variant Price,Option1 Value,Option2 Name,Variant SKU,Option2 Value tee,Size,19.99,M,Colour,TEE-M-BLK,Black After (Option Names grouped with their Values): Handle,Option1 Name,Option1 Value,Option2 Name,Option2 Value,Variant SKU,Variant Price tee,Size,M,Colour,Black,TEE-M-BLK,19.99
Tab-separated feed auto-detected
ExampleSome PIM exports are tab-separated with a .txt extension. PapaParse auto-detects the tab delimiter — no setting needed. Reorder works the same and the output is written as comma-separated CSV.
Before (product-feed.txt, tab-separated): Vendor<TAB>Handle<TAB>Title<TAB>Variant Price Acme<TAB>nitro-mug<TAB>Nitro Mug<TAB>14.99 After (Apply order = Handle, Title, Vendor, Variant Price), exported as CSV: Handle,Title,Vendor,Variant Price nitro-mug,Nitro Mug,Acme,14.99
Reorder, then remove the supplier cost column
ExampleSupplier feeds often carry an internal Cost column you do not want uploaded to Shopify. Reorder for readability here, then strip Cost in csv-column-remover — this tool keeps every column on purpose.
Step 1 — reorder here (Cost kept, moved to the end): Handle,Title,Variant Price,Variant SKU,Cost nitro-mug,Nitro Mug,14.99,ACM-NM-12,6.20 Step 2 — csv-column-remover drops Cost: Handle,Title,Variant Price,Variant SKU nitro-mug,Nitro Mug,14.99,ACM-NM-12
Header name mismatch that reorder cannot fix
ExampleReordering puts Body HTML in the right spot but Shopify will still ignore it because the field must be Body (HTML). Rename first, then reorder.
Problem feed (wrong header names): Handle,Title,Body HTML,price nitro-mug,Nitro Mug,<p>12oz</p>,14.99 Shopify import: Body HTML and price columns are unmatched (descriptions + prices dropped). Fix: csv-header-rename → Body HTML to Body (HTML), price to Variant Price, then reorder here into template order.
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Reorder does not rename — Shopify still ignores wrong header names
By designShopify matches columns by header text. Moving Body HTML into position 3 does nothing if Shopify expects Body (HTML) — the column is simply unmatched and that data is dropped on import. Reorder fixes layout, not naming. Run csv-header-rename to set the exact field names first, then reorder.
Every column is kept — unwanted supplier columns survive the reorder
By designThe browser tool never drops a column; an internal Cost or Margin field stays in the file (you can move it to the end). Shopify ignores columns whose headers it does not recognise, so a stray field is usually harmless — but if you must remove it before sharing the file, use csv-column-remover.
Variant rows share a Handle — order within the file matters to you, not the column order
PreservedShopify groups variants and images by the Handle value across multiple rows. This tool reorders columns, never rows, so variant/image grouping is preserved exactly. If you also need to sort rows so all rows of one Handle are adjacent, use csv-sorter on the Handle column afterward.
Free tier blocks files over 2 MB
Upgrade requiredA product feed larger than 2 MB shows an upgrade prompt on free instead of processing. Large catalogue exports cross this quickly. Pro raises the file limit to 100 MB. There is no partial export — the file is processed in full or not at all.
Result over 500 rows blocks on free
Upgrade requiredThe free tier caps the processed result at 500 rows. A catalogue with thousands of variant rows exceeds this and shows the upgrade prompt. Pro lifts the cap to 100,000 rows. To stay on free, split the catalogue first with csv-row-splitter and reorder each chunk.
Body (HTML) contains commas and quotes
PreservedProduct descriptions in Body (HTML) routinely contain commas, quotes, and markup. The parser is quote-aware and re-quotes any field on output that contains the delimiter, a quote, or a newline, so the HTML round-trips intact even when its column is moved to a new position.
Duplicate header names in the feed
ExpectedIf a feed has two columns literally named the same (e.g. two Tags columns), each is listed and moved independently by position in the UI — both are preserved. Shopify itself may behave unpredictably with duplicate headers, so consider renaming one with csv-header-rename before importing.
First row is not a header
Check inputThe tool treats the first row as the header row and lists those values as the reorderable columns. If your feed starts with a title or metadata line instead of headers, that line becomes the 'headers' and your real headers become row 1. Remove the stray top line before uploading so the column list reflects true field names.
Empty trailing column from a trailing delimiter
PreservedA feed exported with a trailing comma produces an empty final column. The tool lists it (often as Col N) and keeps it on output. Move it to the end and ignore it, or drop it with csv-column-remover — Shopify ignores empty unnamed columns on import.
Frequently asked questions
Does Shopify actually require a specific column order?
No — Shopify's product importer matches by header name, so a column can be anywhere as long as its header is spelled exactly right (Handle, Title, Body (HTML), Variant Price, etc.). Reordering matters for human auditing: a file in template order is far easier to scan for missing required fields, and some third-party import apps and review workflows expect the canonical layout. This tool fixes layout; it does not change names.
Will reordering change any of my cell values?
No. The tool only changes which position each column occupies. Every cell — SKUs, prices, inventory counts, and the HTML inside Body (HTML) — is preserved exactly. Fields that contain commas or quotes are automatically re-quoted on output so they parse correctly, but the content is byte-for-byte identical.
How do I reorder — is it drag and drop?
You reorder with up/down arrow buttons. Each column is listed with its current position number, and the arrows move a column one step up or down. It works the same on desktop, trackpad, and touch, and there is no drag-and-drop plugin to fail. To move a column several positions, click the arrow repeatedly.
Can I drop columns I do not want in the Shopify import?
Not in this tool — it keeps every column by design so you cannot accidentally lose data. To remove a column (for example an internal Cost field), use csv-column-remover. A common workflow is to reorder here for readability, then remove the unwanted columns as a second step.
My headers do not match Shopify's field names. What do I do?
Rename them first with csv-header-rename so they read exactly as Shopify expects (Body (HTML), Variant Price, Variant SKU, etc.), then reorder here. Reordering a column never renames it, so a mismatched name stays mismatched and Shopify will drop that column's data on import.
Can I reorder a file with 100+ columns?
Yes. The column list is scrollable and supports any number of columns; each is moved independently with the arrows. For very wide files, lift the few columns that must be first (Handle, then Title, Body (HTML), Vendor) and leave the rest in place — Shopify matches the remainder by name regardless of their order.
What file types can I upload?
.csv, .tsv, and .txt. PapaParse auto-detects the delimiter, so a tab-separated .txt feed from a PIM or supplier works without changing a setting. The output is always written as comma-separated CSV ready for Shopify's importer.
How big a product feed can I process?
Free handles files up to 2 MB and caps the result at 500 rows; over either limit you get an upgrade prompt. Pro raises this to 100 MB and 100,000 rows. For a large catalogue on the free tier, split it into chunks with csv-row-splitter and reorder each chunk.
Does the tool sort my rows or group variants?
No. It reorders columns only; row order is never touched, so variant and image rows stay grouped exactly as they were. If you want all rows that share a Handle to sit together, sort on the Handle column with csv-sorter after reordering.
Is my product data uploaded anywhere?
No. Parsing and reordering run entirely in your browser via PapaParse. Product titles, descriptions, SKUs, and supplier costs never reach a JAD server. The only thing recorded server-side, when you are signed in, is a single usage counter (no file content), which you can opt out of in account settings.
Can I save a Shopify column layout to reuse next month?
Not currently — there are no saved templates or presets. You set the order each time you process a file. If your supplier feed always arrives in the same shape, the reorder is identical each run; for fully unattended runs, the automation path below applies a fixed order in one call.
Can I run this in an automated pipeline?
Yes, via the public CSV API / @jadapps/runner. Pass order as an array of header names or 0-based indices; header names are matched case-insensitively. One important difference from the browser tool: in the API path, columns not listed in order are dropped from the output, whereas the browser UI keeps every column. So list every column you want to keep, in the order you want, when automating a Shopify import-prep step.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.