Easy Stock Buffer docs

Thresholds

Import thresholds from a CSV

Upload a CSV to set safety stock on up to 5,000 variants at once: one threshold per product, one row per location, or a wide sheet with one column for each location. Empty cells in the wide format leave a location untouched, and big files import in the background.

Updated August 4, 2026

CSV import (Pro) sets thresholds on many variants at once from a spreadsheet. It matches rows by SKU, so it is the fastest way to apply exact numbers you already keep in your own stock file.

Prepare the file

The CSV needs two columns: variant_sku and threshold. Each threshold is a whole number, 0 or higher. You can download a ready-made example from the import page to copy the layout. Comma and semicolon separators are both detected automatically, so files exported by Excel on European locales work too.

There are three layouts in all, and the import works out which one you used from the header row, so there is nothing to choose before you upload: the two-column file above, one row per SKU and location, or one row per variant with a column for each location.

A threshold for each location

To set a different threshold at each of your locations, add a third column and name it exactly location. Each row then holds one SKU, one location name and the threshold to keep there. The location name has to match the name in your Shopify locations list, spelling and all.

Use Download location example on the import page to start from a file that already carries your own location names, so there is nothing to retype. Its SKUs are made up on purpose: if you upload it without changing them, every row comes back as "SKU not found" and nothing in your store is touched. Replace the SKUs with real ones and you are ready to go.

The threshold cell takes three kinds of value: a number, the word all to hold back everything at that location, and an empty cell to remove that location's threshold. Locations you do not mention keep whatever they already had.

One row per variant, one column per location

If your own stock sheet already has one row per product and one column for each place you store it, upload it in that shape. Name the SKU column variant_sku, then name every other column after one of your locations, spelled exactly as it is in your Shopify locations list. A file for two locations starts with the header variant_sku,Gates Oakham,Oakham Warehouse, and the row PBM-1055687-9,2,4 keeps 2 of that SKU at Gates Oakham and 4 at Oakham Warehouse. Leave out the threshold column and the location column: either of them tells the import you meant one of the other two layouts.

Each cell takes one of four values:

  • A whole number is the stock to hold back at that location.
  • The word all holds back everything at that location, so none of it can be sold.
  • 0 removes that location's threshold, so nothing is held back there any more.
  • An empty cell leaves that location exactly as it is, threshold and all.

An empty cell here does the opposite of an empty cell in the location format. In a file with a location column, an empty threshold removes that location's threshold. In a file with one column per location, an empty cell changes nothing at all, and 0 is what removes a threshold. It works this way so a sheet where you filled in only the few cells you meant to change cannot wipe the rest of your thresholds, and because Excel and Google Sheets drop the empty cells at the end of a row. A row where every location cell is empty is reported back as skipped, so you can see it was read and did nothing.

Every column name has to match one of your locations, and match only one. If a single column does not, the whole file is refused before anything is saved, and the message lists the columns it could not place next to the location names in your store, so you can copy the spelling across.

Use Download matrix example on the import page to start from a file that already carries your own location names and shows each kind of cell. Its SKUs are made up on purpose, so replace them with real ones before you upload.

Six words are reserved by the import itself and cannot be used as a location column: threshold, safety_level, floor, location, sku and variant_sku. If one of your locations is named exactly one of those words, upload that file with a location column instead.

The 5,000 row limit counts rows in the file, and this layout uses one row per variant however many locations you have, so a store with 20,000 variants splits into four files.

When a file is rejected

The import refuses the whole file, and changes nothing, rather than guess at a column it does not recognize. It happens when:

  • The same column name appears twice.
  • A column looks like it is meant to be the location column but is not named exactly location - things like locations, location_name, lokation, ubicación, emplacement, standort or localização. The message names your column, so you can see which one to rename.
  • A three-column file has one column the import does not know at all, whatever it is called.
  • The SKU column or the threshold column is missing.
  • A file with one column per location has a column that matches no location in your store, or matches more than one. The message lists every column it could not place, together with your own location names, and not a single row is saved until the spelling matches.
  • A file with one column per location names both variant_sku and sku. Keep the one that holds your SKUs and rename or remove the other.

In all of these, nothing is imported. Rename the column and upload again. Files in the plain two-column format still import even if they carry extra columns your own spreadsheet needs, such as a product title or a notes column.

Steps

  1. Open Import thresholds from CSV.
  2. Drop your CSV onto the upload area, or click to choose it.
  3. Click Start import.

What you should see

Files under 500 rows import right away and show a result with counts for saved, SKU not found, invalid, plan limit, and errors. The result also says which layout was read, such as "Imported as: whole-product thresholds" or "Imported as: thresholds by location", and a file with one column per location reports that too, so you can tell at a glance that it was understood the way you meant it. If any rows failed you can download a failures CSV to fix and re-upload.

Files above 500 rows, up to a maximum of 5,000, import in the background. While one is running, the import page shows how far it has got, counting the rows it has been through out of the rows in your file, and the new thresholds appear on the Thresholds page as they are processed. Every run is listed under Recent imports.

Good to know

A file in the plain two-column format sets one threshold for the whole product, so it replaces any per-location thresholds that product had. When that happens the result row says so: "location thresholds removed - this file sets one threshold for the whole product". If you meant to keep them, use the location format instead, or set them again from per-location thresholds.

A row is skipped as "SKU not found" if no variant in your store has that exact SKU. To set thresholds by group instead of by SKU, use bulk thresholds by collection, tag, or type. To let the app propose numbers from your sales rate, try suggested thresholds.