Your New Assortment Plan can be built from files instead of by hand. Two imports do that work together: a choice file, which owns the choices and offerings in your plan, and the Variant Location Plan Metrics file, which fills those offerings with plan numbers at SKU × location × date.
These used to be one job. The metrics file created a choice whenever it met a SKU whose choice was not in the plan yet, and decided on its own which choice each row belonged to. Splitting the work in two means you decide which choices exist, and any metrics row that cannot be placed is reported with a reason instead of disappearing.
💡 The new metrics behavior is gated by the variantLocationImportExistingOfferingsOnly feature flag, which is off by default. Reach out to your Customer Success Manager to have it enabled for your organization, and see Feature Flags in Toolio for how flags work. The choice file does not depend on the flag — you can start sending it before the switch.
Use Cases
You plan at SKU × store × week in another system and want those numbers to land in
New Assortment Plan.You want to control which choices exist in the plan, instead of letting an import create them as a side effect.
You plan the same style in two seasons and need it to stay two separate choices.
You want to know why a row did not land, rather than reconciling totals to find out.
You maintain launch and end dates, unit economics, or store exclusions for many choices at once.
What Each File Owns
Responsibility | Choice file | Variant Location Plan Metrics file |
Creating and updating choices | Yes | No (new workflow) |
Creating offerings, one per cluster | Yes | No (new workflow) |
Launch Date and End Date | Yes | No |
Unit Cost, Unit Retail, Unit Ticket | Yes | No |
Choice attributes, curves, profiles, size range | Yes | No (new workflow) |
Excluded and manually included stores | Yes | No |
Plan metrics at offering level | No | Yes |
Plan metrics at size level | No | Yes |
The grain is different in each file. The choice file is one row per choice. The metrics file is one row per SKU × location × date, exactly as it is today — see Importing Variant Location Plan Metrics into Assortment Plan for how those rows roll up to choice and cluster.
How the Two Workflows Differ
Legacy workflow (flag off) | New workflow (flag on) | |
Who creates choices | The metrics import, for every new | The choice file only |
Who creates offerings | The metrics import, using the earliest and latest date in your file | The choice file, one offering per cluster, using the dates on the row |
Choice attributes | Mapped on the metrics file, plus | Set on the choice file; choice columns are no longer offered when you map the metrics file |
Placing a row on an offering | The closest matching window | A single matching offering takes the row; when several match, the one whose window covers the row's retail week |
Rows that cannot be placed | Dropped, visible only as a difference in totals | Counted by reason on the import |
When the plan is written | A separate background task, queued after the import finishes | Inside the same import job, before it completes |
Turning On the New Workflow
Build and send your choice file for every choice that should exist in the plan. You can do this while the flag is still off — the choice file works either way.
Confirm in
New Assortment Planthat the choices and offerings you expect are there, with the launch and end dates you sent.Ask your Customer Success Manager to enable
variantLocationImportExistingOfferingsOnly.Keep sending both files. Send the choice file first whenever a planning period introduces new choices.
❗ Once the flag is on, the metrics import creates nothing. A metrics row for a choice that does not exist yet is skipped and reported, not planned. If you send a metrics file for a new season before its choice file, every row for the new choices is skipped.
The Choice File
One row describes one choice, keyed on a Choice External Id that you control. An unknown id creates a choice, a known id updates it, and re-sending the same file changes nothing — so a full file is always safe to resend.
Toolio creates one offering per cluster in the Automated Cluster Group you name, and applies the row's dates and unit economics to each of them. Ids and names are matched ignoring case, accents, and surrounding spaces.
In Import History this import appears with the type Choice. If you deliver files over SFTP or another automated feed, the file name must contain choice or offering, and must not contain plm.
Required Columns
Column | What it does |
| Your key for the choice. An unknown value creates a choice, a known one updates it. |
| The cluster group by name, exactly as it appears in the app. Toolio creates one offering per cluster in it. |
| Applied to every offering created for the row. |
| Applied to every offering created for the row. Must not be before the launch date. |
What Else You Can Set
Column | Notes |
| Links the choice to its |
| Derived from the cluster group. If you send it, it must agree with the group, or the row is rejected. |
| Descriptive fields on the choice. |
| Same field planners edit in the grid. |
| By name. |
| By name. |
| By name. |
| Written to every offering on the row. A missing unit retail defaults to the unit ticket, as it does in the app. |
Custom choice attributes | Any custom attribute column, except ones that are hidden, read-only, long text, or part of the choice definition. |
A blank cell leaves the stored value as it is. To clear a value, change it in the app — the file only writes what it carries.
Choices created by the import do not pick up New Assortment Plan defaults, so send the attributes you want on them in the file.
Excluded and Manual Included Locations
Excluded Locations and Manual Included Locations take store ids separated by a pipe (|), for example STORE-01|STORE-02|STORE-07.
Each store is written to the offering of the cluster it belongs to, so a list spanning two clusters lands on two offerings. A manually included store only restores one that a rule or a location list had removed.
A filled column replaces that list on every offering of the group's clusters. A blank column leaves the existing lists untouched. Offerings kept for clusters that have since left the group are not changed.
The lists are never written partly. If a store on the row has no offering to land on, or the write fails, the choice itself is still saved and the row reports that its lists were not.
How Toolio Matches a Row to an Existing Choice
If the Choice External Id already exists, that choice is updated. If it does not, Toolio looks for a choice to adopt before creating a new one — a choice that was created without an external id, by the legacy metrics flow or in the app.
A choice is adopted when the Actual Choice and Automated Cluster Group on your row identify exactly one of them. If more than one candidate remains, the row is rejected and the candidates are listed, so you can resolve it rather than end up with a duplicate.
Rows the Choice File Rejects
Every rejected row is reported with a reason you can act on. The rest of the file still loads.
Reason | What to fix |
| Check the name against the app. Only published cluster groups match — a draft sharing the name is not a match. |
| Two groups share that name. Rename one, or ask your Customer Success Manager which to use. |
| Add clusters to the group before importing choices against it. |
| A choice cannot move between cluster groups. Use a new |
| Relinking is not allowed. Correct the file, or fix the link in the app. |
| The actual choice has to reach Toolio on your product feed first. |
| One row per choice. Merge the duplicates. |
| Correct the dates. |
| Remove the column, or send the group that the cluster group derives. |
| Fix the store list on the row. Stores must exist and sit in a cluster the group offers. |
| A curve, profile, or size range name does not resolve to exactly one record. |
How Plan Metrics Reach an Offering
With the flag on, every metrics row is placed through its variant's Actual Choice. For each choice of that actual choice, Toolio looks up the row's store in that choice's own cluster group and partition, and the choice's offering for the store's cluster becomes a candidate.
One candidate. It takes the row, whatever the row's date. A single offering is unambiguous, so a date outside its window is not a reason to drop the number.
Several candidates. The one whose window covers the row's retail week takes it. Windows are compared by retail week, so an offering launching mid-week still covers that week's rows.
No candidate covers the date, or several do. The row is skipped and counted, because the date is the only thing that tells those offerings apart.
Rows that land on the same offering and date are summed, and the result is written to the plan scenario — the same scenario that powers the Plan columns in New Assortment Plan. Size-level metrics are written the same way, at choice × size × date.
Why a Metrics Row Was Skipped
Skipped rows are counted by reason on the import, and the total appears in the import's skipped line count.
Reason on the import | What it means |
The variant does not exist or has no actual choice | The SKU is missing from Toolio, or its variant carries no |
No choice exists for the variant's actual choice | Nothing in the plan to write to. Send the choice file for it. |
The choice has no Automated Cluster Group | The choice was created without one. Fix it in the app or through the choice file. |
The choice's partition in its Automated Cluster Group could not be resolved | The choice's cluster configuration is incomplete. Raise it with support. |
The location is in no cluster of the choice's Automated Cluster Group | The store is not clustered in the group the choice plans against. |
The choice has no offering for the location's cluster | The cluster exists but the choice has no offering for it. |
Several offerings match the location and none of them covers the date | Your dates fall outside every offering window. Extend a window, or correct the dates. |
Several offerings match the location and cover the date | Two offerings overlap for that store. Separate their windows. |
Size metrics not written: the variant has no size, or its size or inventory group is not set up | The offering-level numbers did land. Only the size breakdown is missing, so this is reported but not counted as skipped. |
Reviewing an Import
Open Import History and select the run to see its details page, where the skipped counts above appear alongside the row counts and any rejected rows. See Viewing & Managing Data Imports for the grid, the details page, and how to share a link to a specific run.
[Screenshot: Import Details page for a Variant Location Plan Metrics run, showing skipped reasons with their line counts]
Choices and offerings the choice file writes carry the import job that last changed them, so you can trace any row in the plan back to the file it came from.
FAQs
Do I have to send a choice file?
Only if the flag is on — and then yes, for every choice you expect to plan. With the flag off, the metrics import still creates choices as it always has.
What happens to the choices the old flow already created?
They stay and keep their plan. The first time your choice file names one of them, Toolio adopts it rather than creating a duplicate, as long as the actual choice and cluster group identify exactly one.
Can I still map choice attributes on the metrics file?
With the flag off, yes — the mapper still offers importable choice attribute columns. With the flag on, those columns are no longer offered, because the new flow writes nothing to the choice. Send them in the choice file instead.
Why does my Automated Cluster Group name not match?
Names are matched against published cluster group snapshots, the same list the grid's dropdown shows. A draft with the same name is not a match, and a name shared by two snapshots is rejected rather than guessed.
Does the choice file ever delete anything?
No. It creates and updates choices and offerings, and replaces store lists on the clusters of the group it names. It never deletes a choice or an offering, and it leaves offerings for clusters that have left the group alone.
What does a blank cell do?
Nothing. A blank leaves the stored value as it is, which is what makes a full resend safe. Change a value by sending the new value, or edit it in the app.
Why did every row in my metrics file get skipped?
Usually because the choices do not exist yet. Check the skipped reason on the import — "No choice exists for the variant's actual choice" means the choice file has not run for those products.
Can a choice move to a different Automated Cluster Group?
No. That change is rejected, because the cluster group is part of the choice's identity. Use a new Choice External Id to plan the same product against a different group.
