Importing Inventory
The Inventory import sets stock quantities in your Shopify store from a spreadsheet. It's built for two everyday jobs: stock-takes (a scanner or warehouse export with one row per SKU) and re-importing an edited inventory export (wide-format files with one column per location).
For the wizard itself — uploading, mapping, dry runs, schedules — see
Importing into EcomSolo. Setting stock while importing
products (a Variant Inventory Qty or per-location column on the Products
sheet) is also supported — see
Importing Products → Inventory columns.
Two file shapes (mix them freely)
1. Stock-take rows — one row per SKU and location
| SKU | Location | Quantity |
|---|---|---|
| WATCH-001 | Main Warehouse | 25 |
| KEYBOARD-002 | Main Warehouse | 0 |
- SKU identifies the item (see How items are found).
- Location is the location's name exactly as it appears in Shopify (or its numeric ID). If your store has exactly one location you can leave this column out — it's resolved automatically.
- Quantity is the absolute value to set. A
0really sets zero — it is not "skip". - Optional Quantity Type column:
available(default) oron_hand.
2. Per-location columns — one row per SKU (wide format)
| SKU | Inventory Available: Main Warehouse | Inventory Available: Berlin |
|---|---|---|
| WATCH-001 | 25 | 10 |
| KEYBOARD-002 | 0 |
The location lives in the column header. Recognized patterns (the
Inventory prefix is optional, so common wide-format exports work as-is):
| Header pattern | Meaning |
|---|---|
Inventory Available: <Location> | Set the available quantity |
Inventory On Hand: <Location> | Set the on-hand quantity |
Inventory Available Adjust: <Location> | Adjust available by a delta (e.g. -3, +5) |
Inventory On Hand Adjust: <Location> | Adjust on-hand by a delta |
Rules worth knowing:
- Blank cells are skipped — that location's stock is left untouched. Only
a value (including
0) writes anything. - You can't use an absolute value and an adjust for the same quantity type and location on the same row — the row is rejected with a clear error so an ambiguous file can't half-apply.
- Adjust values can be negative; absolute values can't.
Operations
Inventory rows only ever set or adjust quantities on items that already exist — nothing is created and nothing is deleted. So Create is rejected (a row error tells you to use Upsert or Update), and Delete isn't offered. Upsert, Update, and Merge all behave identically: they write the quantities in your file. See Choosing the operation.
How items are found
Rows are matched to Shopify inventory items by SKU, using EcomSolo's synced inventory data for the target store. That means:
- The SKU must already exist in the store (check the Inventory dashboard in EcomSolo — anything listed there will resolve).
- The item should have inventory tracking enabled in Shopify ("Track quantity" on the variant); Shopify rejects quantity writes on untracked items and you'll see that as a row error in the report.
- If you have the numeric Inventory Item ID (from an export), an
InventoryItemIdcolumn bypasses the SKU lookup entirely.
Importing from another store
On the wizard's Source step, pick From another store to copy stock levels from a connected store — no file needed.
- Each SKU's total on-hand is copied as one row, matched by SKU. On-hand is the physical count; available can read 0 while stock is on-hand but committed, so copying on-hand keeps the target's real quantities. (Available is used only when a source item tracks available but not on-hand.)
- The target must have a single location. Store locations rarely share names across stores, so the copied stock is placed at the target's own location automatically. If the target has more than one location, rows report "row requires a Location" — use a file import with explicit per-location columns to place stock across multiple locations.
- Only tracked items with a SKU are copied. SKU is the only identity that works across stores, and the target must already have a product with that SKU (inventory imports set quantities on existing items — they don't create products). SKUs the target doesn't have report "SKU not found".
- Combined with a schedule this becomes a recurring one-way stock mirror. The rows come from EcomSolo's synced data for the source store; sync it first if it hasn't run recently.
Dry run, results, and freshness
- The dry run validates every row — unknown SKUs, unknown locations, and conflicting columns are reported per row before anything is written.
- After the run, the error report lists every row with its outcome.
- Quantities you set are visible in Shopify admin immediately, and EcomSolo's Inventory dashboard refreshes within seconds of the run finishing — no need to wait for the next sync.
Sample file
A ready-to-run stock-take sample lives at
features/importing/examples/inventory-sample.csv:
SKU,Location,Quantity
WATCH-001,Main Warehouse,25
KEYBOARD-002,Main Warehouse,0
Troubleshooting
| Error in the report | What it means / what to do |
|---|---|
SKU 'X' was not found in the store's inventory | The SKU doesn't exist in the target store (or hasn't synced yet). Check it on the Inventory dashboard first. |
Location 'X' was not found for this store | The location name must match Shopify exactly (or use the numeric location ID). |
row requires a Location (name or id) | Your store has more than one location, so stock-take rows must say which one. |
has both an absolute value and an adjust | Pick one: set the value, or adjust it — not both for the same location. |
| Tracking-related Shopify errors | Enable "Track quantity" on the variant in Shopify, then re-run the failed rows. |
FAQ
Does this create products or variants? No — Inventory imports only write stock quantities to items that already exist.
Can I schedule it? Yes. A scheduled inventory import re-reads the saved file (or Google Sheet — ideal, since its content can change between runs) on your chosen cadence.
What's the difference between available and on-hand? Available is what can be sold; on-hand also includes committed and unavailable stock. Most stock-takes set on-hand; most storefront corrections set available.