Skip to main content

Importing Location Capacity

Bulk-load unit capacity for every location, and every capacity partition, by uploading a location capacity file.

Location capacity import lets you set the unit capacity of many locations at once by uploading a file, instead of typing values into the Location Capacity tab one cell at a time.

The values it writes are exactly the ones a user can enter by hand, and they drive the same capacity check: after a run, Toolio trims recommended transfers that would push a location past its capacity. See Location Capacity in Allocation for how capacity, the check window, the threshold, and the cuts work.

The importer is the practical way to maintain capacity at scale. When capacity is partitioned by product hierarchy, a single store can have thousands of combinations — the tab is for spot edits, and the file is how capacity actually gets loaded and kept current.

Use Cases

Use the location capacity import when:

  • You are turning capacity on for the first time and need a value on every store before the first run

  • You maintain capacity in a space-planning or planogram system and want Toolio to follow it

  • Floor sets or a remodel have changed what a group of stores can hold

  • You partition capacity by Division or Department and the number of combinations makes cell-by-cell editing impractical

  • You need to remove capacity from a set of stores or partitions in bulk

Before You Import

Two things must be settled before the first file, because both decide what the file has to look like.

Location Capacity must be enabled for your organization. Without it, the Location Capacity tab is hidden and no capacity run happens. Contact your customer success manager to turn it on.

The capacity partition grain must be set first. The Capacity Partition Grain in Settings > Module Settings > Allocation > Allocation Configuration decides whether capacity is one number per store or one number per store and hierarchy combination — and therefore which columns your file needs. The importer never changes the grain; it only reads it.

❗ Changing the grain deletes every capacity value that no longer matches it. Settle the grain before you load capacity — if you change it afterwards, you will need to re-import.

Running the Import

  1. Go to Settings > Imports

  2. Click New Import

  3. Select Location Capacity as the model

  4. Choose System as the mapper, unless you have defined a custom mapper for your own headers — see Using Mappers to Map Data to Toolio Attributes

  5. Select your CSV file and upload it

The file is processed in the background and appears in the import list with its row and error counts, like any other import — see Manual Imports and Import Status and Error Diagnostics.

You can also drop the file on your SFTP for an automated feed. Toolio routes it to the location capacity importer when the filename contains any of the following (case-insensitive):

  • location_capacity

  • location-capacity

  • locationcapacity

Examples: location_capacity_2026_spring.csv, nightly-location-capacity.csv

File Format

Each row is one capacity value: a location, one value for each level of the capacity partition grain, and the unit capacity.

Toolio matches your headers to the columns below by name, so a file that uses these names as headers imports without any setup. A column is recognized either by its attribute name or by its display name — location_external_id and Location External Id both resolve. Column order does not matter, and any column Toolio does not recognize is ignored, though it is kept with the row for error reporting.

Supported Fields

Attribute

CSV Type

DB Type

Required

Example

Description

location_external_id

String

varchar(255)

Yes

1042

External ID of the location as it appears on your location feed. A location alias also resolves. Matched case-insensitively, whitespace trimmed. A blank cell, or a value that matches no location, rejects the row.

<hierarchy level>

String

json

Conditional

Mens

One column per level in your capacity partition grain, headed by that level's name — Division, Department, Class. Values are the level's names, not codes; an alias also resolves, matched case-insensitively and trimmed. Every level of the grain must be present as a column, or the whole file is rejected. Omit these columns entirely when no grain is configured. Not stored as its own column — resolved to an option value ID and staged in levelValues.

capacity_units

Integer

varchar(255)

Yes

1200

How many units the location can hold for that combination. A whole number from 1 to 2,147,483,647. A blank cell deletes the value for that combination. 0, negative numbers, fractional values, text, and numbers carrying a thousands separator reject the row. A trailing zero decimal is tolerated — 1200.0 imports as 1200.

The capacity_units column must be present in the file even when you are only clearing values — a blank cell is the instruction to delete, so the column has to be there to carry it.

Sample Import File

Copy one of the samples below into a spreadsheet, replace the values with your own, and save it as a CSV whose name contains location_capacity.

Sample 1: A Division and Department Grain

This is a file for an organization whose Capacity Partition Grain is Division then Department. Every row carries a value for both levels.

Location External Id

Division

Department

Capacity Units

1042

Mens

Accessories

1200

1042

Mens

Footwear

3400

1042

Womens

Footwear

2800

1043

Mens

Accessories

900

1043

Mens

Footwear

Location External Id,Division,Department,Capacity Units
1042,Mens,Accessories,1200
1042,Mens,Footwear,3400
1042,Womens,Footwear,2800
1043,Mens,Accessories,900
1043,Mens,Footwear,

Reading the sample:

  • Store 1042 gets three capacity values, one per division and department combination it stocks

  • Store 1043 gets a capacity for Mens Accessories, and its Mens Footwear capacity is deleted by the blank cell

  • Any combination not listed — Womens Footwear at store 1043, for example — keeps whatever value it already has

Sample 2: No Partition Grain

When no partition grain is configured, capacity is a single number for the whole location and the file carries only two columns.

Location External Id

Capacity Units

1042

7400

1043

5100

1044

6250

Location External Id,Capacity Units
1042,7400
1043,5100
1044,6250

How Values Are Applied

Each row resolves to one cell — one location and one combination — and the value in capacity_units decides what happens to it.

capacity_units

Result

A whole number from 1 upward

The value is set, replacing whatever was there

Blank

The value is deleted; the location is no longer constrained for that combination

0, a negative number, a fractional value, or text

The row is rejected and the existing value is kept

The combination is not in the file at all

Unchanged

Two consequences are worth holding on to.

Absent is not deleted. A file only changes the cells it names. You can load one division's capacities without disturbing any other, and a new store entered by hand stays as entered until the file catches up with it.

Last write wins. An imported value replaces a value a user typed into the Location Capacity tab, and a value typed into the tab replaces an imported one. Neither is protected from the other.

Duplicate Rows

Two rows that name the same location and the same combination address the same cell:

  • If they carry the same capacity_units, the last one is used and the others are counted as skipped

  • If they carry different capacity_units, both rows are rejected and the existing value is kept

Unintended duplicates are usually a sign that the file carries a hierarchy column the grain does not partition by — for example a Class column in a file for a Division and Department grain. Those rows collapse onto each other, because the extra column is not part of the cell's identity. Remove the column, or add that level to the grain.

Errors and Rejected Rows

Invalid rows are reported individually with the uploaded row echoed back, so you can correct the file and re-import. The rest of the file still loads.

Row-Level Errors

Error

Cause

location_external_id is required on every row

The Location External Id cell is blank

location_external_id does not match location.externalId or an alias

The value matches no location External ID or alias in Toolio

capacity_units must be a whole number between 1 and 2147483647, or blank to delete the value

The cell holds 0, a negative number, a fractional value, text such as 1,200, or a number above the cap

<column> is blank; a capacity value is set against a full combination of the partition levels

A hierarchy level cell was left empty. Capacity is always set against a complete combination — there is no "all departments" row

<column> "<value>" does not match any value of that level

A typo, or a value that is not an option value of that level and has no alias

<column> "<value>" disagrees with another mapped column of the same level

Two mapped columns point at the same hierarchy level with different values

Lines X, Y set different capacity_units for the same store and combination

Conflicting duplicate rows, as described above

The store was deleted while the file was being imported

The location was removed mid-import. Re-import the affected rows

The combination could not be written: …

The grain was changed, or a level value deleted, while the file was being imported. Re-import once the configuration has settled

File-Level Errors

When one of these is hit, nothing is written and the whole file is skipped.

Error

Cause

Missing headers: location_external_id

The file has no location column

Missing headers: capacity_units

The file has no capacity column

Missing headers: <level>

A level of the capacity partition grain has no column in the file

The location and capacity columns are checked first, so a file missing both those and a grain level reports the location and capacity columns only; fix them and re-import to see the rest.

A missing level is a whole-file error on purpose. Every row in a partial file would be written at a shallower scope than the one configured, and each row would look perfectly correct on its own — so the file is refused rather than half-applied.

After the Import

Imported capacity behaves exactly like capacity entered by hand:

  • It appears as the Unit Capacity value on the Location Capacity tab of the location detail panel, under Settings > Organization Settings > Locations

  • It is picked up by the next capacity check, which runs automatically after the scheduled nightly allocation run

  • It constrains nothing until that check runs

To apply new capacities immediately, use Recalculate Capacity Constraints in the ⋮ menu on the Recommended Transfer Orders screen. The action is permissioned — if you do not see it, ask your administrator for the Recalculate Capacity Constraints permission on your role. Then open Capacity Summary from the same menu to see where the run landed: which locations and partitions are over, how many units were cut, and how much overage remains.

💡 A recalculation resets every transfer inside the window of every partition it evaluates back to system-recommended values, so manual edits on those transfers are replaced. Run it after a capacity load, not in the middle of reviewing transfers.

FAQs

Does the import delete capacity for locations that are not in the file?

No. Only the combinations the file names are touched, and everything else keeps its current value. Deleting is always explicit: list the location and combination with a blank capacity_units.

Can I set a capacity of 0?

No. 0 rejects the row, because zero reads as "no capacity defined" everywhere downstream rather than as a real limit. To remove a constraint, leave capacity_units blank, which deletes the value.

Does the order of the hierarchy columns matter?

No. A file with Division before Department writes to exactly the same combinations as one with them the other way round. Toolio matches on the header name, not the position.

Can one file cover only part of the grain?

No. Every level in the Capacity Partition Grain must appear as a column, and every row must carry a value for each of them. A file missing a level is rejected whole.

Will the import overwrite a value someone typed into the Location Capacity tab?

Yes. The most recent write wins, whether it came from the tab or from a file. There is no protection on manually entered values.

Do I need to re-import after a product hierarchy reclassification?

No. Capacity values are stored against the hierarchy values themselves, so renaming or reordering levels in the hierarchy leaves them in place. Only a change to the Capacity Partition Grain deletes values, and only the ones that no longer match it.

The import succeeded but nothing changed. What happened?

Check the import's error count first — a file whose location IDs or level values do not resolve can reject every row while still reporting as processed. If the rows were accepted, make sure the capacity check has actually run since: imported values only affect transfers after a nightly run or a Recalculate Capacity Constraints.

Can I use this to load capacity through an automated feed?

Yes. Drop the file on your SFTP with location_capacity in the filename and it routes to this importer on its own, on whatever cadence you send it.

Did this answer your question?