Pack Ordering lets you turn a Recommended Purchase Order's size-level demand into prepacks — pre-defined bundles of units across sizes — plus a singles remainder for whatever the packs can't cover cleanly. Instead of ordering loose units per size, you build a catalog of packs, tell Toolio which packs apply to each choice, and let the optimizer decide how many of each pack to buy.
❗ Pack Ordering is a gated feature, controlled by the isPackOrderingEnabled flag and rolled out per tenant. If you don't see the Packs settings page, the Packs tab on a choice, or the Pack Optimization step in the PO wizard, reach out to your Customer Success Manager to have it enabled.
Use Cases
Pack Ordering fits teams that buy and receive in packs rather than in loose units:
You order from vendors who ship case packs (a fixed size ratio per carton, often with a pack UPC).
You want to reduce warehouse handling by receiving pre-packed size assortments.
You want the system to fill packs optimally — meeting demand with the least over-buy — instead of eyeballing pack counts by hand.
You need a repeatable, explainable way to convert per-size receipts into a buy expressed in packs.
Key Concepts
There are two kinds of packs in Toolio:
A generic pack is a size-ratio bundle with no SKUs and no UPC — for example, a 4-pack of
S:1, M:2, L:1. It isn't tied to any product, so you attach it to choices manually.A SKU-bound pack carries a specific SKU for each size. Because those SKUs belong to one product, the pack is automatically tied to that product's choice. A SKU-bound pack may also carry a pack UPC (typical of vendor case packs), but a UPC is optional.
A pack's units per pack is the sum of its per-size units. When the optimizer runs, it produces pack rows (whole packs bought for a choice) and, where packs can't cover demand cleanly, singles rows (loose units of a single size).
Setting Up Your Pack Catalog
All packs live in one place: Settings → Configuration → Intelligence → Packs. This page is the central repository for every pack definition in your tenant.
The grid shows each pack with the following columns:
Column | What it shows |
Pack Name | The pack's name. |
Pack UPC | The pack barcode, if set. Blank for generic and SKU-bound packs with no UPC. |
Pack External ID | A stable identifier, generated automatically when the pack is created. Read-only. |
Actual Choice External ID | The product the pack is bound to, derived from its SKUs. Blank for generic packs. |
Pack Sizes | The sizes the pack carries, e.g. |
Pack Units | Total units in the pack (the sum of the per-size units). |
Pack Detail | The per-size breakdown, e.g. |
Status |
|
You can filter, sort, and search on Pack Name, Pack UPC, Pack External ID, Status, and any custom attributes. The derived columns (Actual Choice External ID, Pack Sizes, Pack Units, Pack Detail) are display-only and can't be sorted or filtered.
Creating a Pack
Click ADD in the top-right to open the pack editor. To edit an existing pack, right-click its row and choose Edit.
Fill in the pack:
Pack Name — required.
Pack External ID — generated automatically and read-only.
Pack UPC — optional. Setting a UPC requires every size row to carry a SKU.
Status —
ActiveorInactive; defaults toActive.Actual Choice — an optional picker that determines whether the pack is generic or SKU-bound (see below).
Sizes — a multi-select of your size values. Selecting a size adds a per-size row; you need at least one size before you can save.
Pack Detail rows — one row per size, each with a Units value greater than zero. A live Pack Units total updates as you type.
Click SAVE when the pack is valid. SAVE stays disabled until all required fields and unit values are valid.
Generic vs. Choice-Bound Packs
The Actual Choice picker in the editor decides the pack's type:
Leave it empty to create a generic pack. Its size rows show
—for SKU, and you attach the pack to choices yourself.Pick a choice to create a SKU-bound pack. Toolio pre-selects that choice's full size run and auto-fills each size's SKU (read-only, resolved from the choice's variants). Because the SKUs come from one product, the pack is bound to that choice and appears on its Packs tab automatically.
Picking the choice rather than typing SKUs by hand is both faster and safer — it prevents mismatched or "rainbow" packs that span more than one product.
Pack Custom Attributes
Packs support custom attributes — for example, a Case Pack type (Inner / Master), carton type, or supplier program. Declare them on the standard attributes page at Settings → Configuration → Organization Settings → Attributes by choosing Prepack as the model (that's the model name for packs), exactly like attributes on any other object.
Once declared, pack attributes show as columns you can pick, filter, sort, and save into views on the Packs grid. In this phase, attribute values are populated by CSV import only (see below) — there is no field for them in the pack editor yet.
Importing Packs from a CSV
For bulk setup, pack definitions are loaded through Toolio's standard CSV import, the same data-feed mechanism used for other Toolio data — not from the Packs page itself. The file is a single flat CSV — one row per size component, with the pack-level fields repeated on each of a pack's rows:
Column | Required | Notes |
| Yes | The pack's external identifier. Re-importing the same |
| No | The pack name; identical across a pack's rows. |
| No | The pack UPC; SKU packs only. |
| Conditional | The vendor/RMS SKU for the size. Provide it to create a SKU-bound pack. |
| Conditional | The size label, e.g. |
| Yes | Units of that size in the pack; a positive integer. |
(any other column) | No | Imported as a pack custom attribute (column name = attribute). |
Toolio deduces the pack kind from the rows: any row with a SKU makes it a SKU-bound pack; none makes it a size-ratio (generic) pack. A pack must be all-or-nothing on SKUs — if one size row has a SKU, they all must. If you provide only a SKU, Toolio fills in the size from the resolved product; if you provide both, it cross-checks them and rejects the row on a mismatch.
Each pack imports as a unit: if any one of its rows fails validation the whole pack is rejected, though the other packs in the file still import. Errors are reported per row and per pack. For how import files are delivered and run, see Manual Imports and Automated CSV Feeds.
Activating and Deactivating Packs
Edit a pack's Status inline on the grid or in the editor. Changes stage behind the standard You have unsaved changes banner and commit when you save. Only active packs appear when you assign packs to choices or run optimization, so deactivating a pack is the right way to retire it while preserving history.
Right-clicking a row and choosing Delete removes the pack from all grids and pickers. A pack that came from an import comes back if a later import sends the same pack_id. A pack you created in Settings cannot be brought back, because its Pack External ID is generated for you and there is nowhere to re-enter it. To stop using a pack without deleting it, set it Inactive.
Assigning Packs to a Choice
Before the optimizer can use a pack, the pack has to apply to the choice being ordered. That's managed on the Packs tab of a choice's detail panel in Assortment Plan. The tab lists every pack that applies to the choice and lets you turn each one on or off.
Automatically Matched vs. Manually Added Packs
Packs reach a choice two ways:
Automatically — a SKU-bound pack whose SKUs belong to this choice's product appears on its own. Auto-matched packs start Excluded, so a matching pack is never bought until you opt in.
Manually — a generic pack you attach with
Add Existing. Manually added packs start Included.
Only active packs appear. If a pack is deactivated in Settings, it drops off the tab on the next refresh — its include/exclude state is remembered, not lost.
Including and Excluding Packs
Each row has an Include checkbox: check it to include the pack, leave it unchecked to exclude. Only included packs are eligible for optimization; excluded packs are ignored. This lets you keep a library of packs matched to a choice while ordering only the ones you want this season.
Add Existing, Add New, and Remove
ADD EXISTINGopens a picker of generic packs whose sizes match the choice (each taggedExactorSubsetfor how it covers the size run). Select one or more and add them; they attach as included. If the choice has no size plan yet, the picker asks you to set one up first.ADD NEWopens the Packs settings page in a new browser tab (the button readsVIEW PACKSif you only have view access to Settings). After creating a pack there, use the tab's refresh button so the new pack — including a SKU-bound one that now auto-matches — shows up.Remove association(right-click) detaches a generic pack from the choice but leaves it in the catalog. For an auto-matched (SKU-bound) pack this action appears but is disabled, with a tooltip, because it would re-surface automatically — exclude it instead.
Optimizing Packs on a Purchase Order
Once packs are assigned, you convert demand into packs from inside the PO wizard. Create and review your Recommended Purchase Order as usual (see Creating a PO and Reviewing a PO). When Pack Ordering is enabled, a new Pack Optimization step appears after you've reviewed and, if applicable, split the PO, and before Approve.
The step starts empty, with the placeholder Click "Optimize Packs" to generate pack recommendations. — nothing runs on its own. The Optimize Packs button is grayed out (with a tooltip explaining why) when no choice in the document has an included pack, or when the document needs a refresh to build pack eligibility. It is also unavailable once the PO has been issued.
Running Optimize Packs
Click Optimize Packs to open the optimization dialog. It lists one row per PO Number × Choice combination in the document, each with a checkbox (checked by default, with a select-all) and these per-row settings:
Setting | What it does | Default |
| When on, any demand the packs can't cover is bought as loose single units, so full demand is always met. When off, Toolio orders whole packs only and the leftover is intentionally dropped (reported as underage). | On |
| The share of the row's demand the optimizer aims to fill with packs. It sets the perfect-fit target and the base for the overage budget, so a value below 100 leaves more of the demand to singles. | 100 |
| Caps how far the optimizer may over-buy across the row's whole demand to finish filling it. At | 55 |
| Read-only. The per-pack limit: a pack is never opened if more than this share of it would arrive empty, so every pack has to be at least half useful. | 50 (fixed) |
Select the rows you want, adjust the settings, and click Optimize.
💡 Each run is authoritative for the whole document. Toolio clears the previous pack results first, then re-packs only the rows you selected. Rows you leave unchecked keep their original demand lines untouched — that's how you leave part of a PO (say, an Ecommerce order) un-packed. Running with nothing selected clears the optimization entirely.
Your last run's selections and settings are remembered per document for the browser session, so re-opening the dialog pre-fills them.
Reading the Results
After a run, the grid shows the packed result at the size level:
Pack rows — one per size for each pack the optimizer chose. The pack columns (
Pack Name,Pack External ID,Pack UPC,Units Per Pack,Number of Packs) are read-only, and the row's receipt units work out toNumber of Packs × Units Per Pack.Singles rows — one per size where loose units were needed. The pack columns are blank and
Number of Packsis blank; the row's receipt units are the singles count for that size.
The original per-size demand lines aren't deleted — they're superseded by these derived rows. From this point on, the pack and singles rows are what feeds your PO totals, the export, and downstream allocation. The earlier Select and Split steps still show and edit the underlying demand.
Include In PO is read-only on this step. Excluding one size of a pack would break the pack, and hiding a whole pack would quietly under-order — so to drop a pack slice, re-run Optimize Packs with that row unchecked, which restores its demand as a normal order line.
Reviewing the Pack Optimization Summary
To see why a choice packed the way it did, right-click any row and choose View Summary. The Pack Optimization Summary reports, for the whole document and for each PO Number × Choice:
Total packs, optimized vs. initial receipt units, and a Pack Fit Accuracy score.
Overage and Underage for each slice.
Why a run stopped adding packs, for example Total Demand Overage limit reached or Pack Overage limit reached, so you can tell when the overage cap or the half-full rule is what sent the rest to singles.
It's the fastest way to answer "why did this choice come out this way?" without leaving the PO.
Adjusting Pack Counts
The only editable field on this step is Adjusted Number of Packs, and only on pack rows. Editing units directly isn't allowed, because a non-multiple of the pack size (say, 6 units of a 4-pack) is meaningless.
When you change Adjusted Number of Packs on any size row of a pack, the change syncs to every size row of that same pack (for the same receipt date) on save, and the units recompute. Singles rows can't be edited here. Your edits commit behind the standard You have unsaved changes banner. Once the PO has been issued, the whole step becomes read-only.
Re-running and the Stale Indicator
There's no refresh button on this step — to recompute, click Optimize Packs again, adjust your selections, and run. Any pending grid edits are discarded, because each run regenerates the derived rows.
Because optimization is manual, demand can change after a run (for example, if you go back and edit the earlier steps). When that happens, the Pack Optimization and Approve steps show a Demand changed — re-run Optimize Packs hint. It's a reminder, never a blocker — your packs simply reflect the demand as of the last run until you re-run. Changing the warehouse split profile clears the optimization outright, so you'll start it fresh.
How Pack Optimization Works
Optimization runs independently for each choice and receipt date on the PO (and separately per destination when a choice is split across warehouses). Overage or underage in one receipt week never carries into another — reaching across weeks to top up a pack is not part of this phase. The optimizer always uses your Adjusted Units as the demand and the Adjusted Receipt Date as the timing.
For each choice and date, it works in three stages:
Perfect Fit First
Toolio first fills as much demand as it can with packs that fit exactly — packs that add no units beyond what's demanded. It favors larger packs, then cascades into smaller packs of the same size family to clean up the remainder. Perfect-fit packs are always used before any over-buying happens.
Rounding Up to Meet Demand
Once nothing fits perfectly, Toolio rounds up to finish the order, always choosing the pack that adds the least overage. A pack is only considered if it's at least half full of useful units (this is the read-only Pack Overage Allowed %, fixed at 50) — it prevents a 1-unit shortfall from dragging in a whole pack. Total Demand Overage % caps how far this rounding can go; when the budget is reached, rounding stops and the rest falls to singles.
Singles Cover the Rest
Whatever the packs can't cover cleanly is bought as singles — loose units of a single size — as long as Allow Singles is on (the default). This is also what happens when demand is below the smallest pack, or when a residual doesn't clear the half-full rule: it becomes singles, with no error. With Allow Singles off, that leftover is dropped instead and reported as underage.
Overage and Underage
Overage is units bought beyond demand — it appears whenever the optimizer rounds up. Setting
Total Demand Overage %to0guarantees the order never exceeds demand.Underage is unmet demand. It's zero whenever singles are allowed (singles fill the gap), and only appears when you turn
Allow Singlesoff for a row.
A Worked Example
Say a choice has a single 4-pack S:1, M:1, L:1, XL:1 assigned, and demand of S:3, M:3, L:2, XL:2 (10 units) for one receipt date, at the default settings.
Perfect fit: Toolio buys 2 packs →
S:2, M:2, L:2, XL:2, leavingS:1, M:1. The pack no longer fits perfectly (it would add L and XL you don't need).Round up: the pack fills the two remaining S/M units — half of its four units, which clears the half-full rule — and over-buys 1 L and 1 XL. That's within the overage budget, so Toolio buys a 3rd pack.
Result: 3 packs = 12 units, with 2 units of overage (1 L, 1 XL) and no singles.
Now suppose instead the demand were just S:5 against that same 4-pack. Opening the pack would fill only 1 of its 4 units (25%), below the half-full rule — so Toolio buys no packs and orders 5 single S units instead.
FAQs
Why did my choice come out all singles, or get no packs?
A choice produces no packs (everything falls to singles) for one of a few reasons:
No packs are included for the choice on its Packs tab — auto-matched packs start excluded, so you have to opt them in.
The included packs carry a size the choice doesn't offer. A pack is skipped only when it includes a size the choice has no variant for. (A size the choice offers but you simply didn't plan is not a blocker — the pack can still be used, with that size filled as overage.)
Demand is below the smallest pack, or the leftover doesn't clear the half-full rule, so it rounds down to singles.
The PO predates Pack Ordering or hasn't been refreshed since it was enabled. Refresh the document (
Regenerate Line Items) to build pack eligibility, then re-runOptimize Packs.
Right-click a row and choose View Summary to see the exact reason for a given choice.
Why is there overage on my order?
Overage is the optimizer rounding up to meet demand — "buy a few units more rather than under-buy." It stays within the Total Demand Overage % you set (default 55). If you don't want any over-buy, set Total Demand Overage % to 0: the order will never exceed demand, and anything the packs can't cover becomes singles (or underage, if you've turned singles off). A pack can also add a size you didn't plan — see the next question.
Why did a size I didn't plan show up on the order?
When a pack includes a size this choice offers but you didn't plan demand for, Toolio can still use that pack and fills the extra size as overage — so a size row appears with units you didn't ask for. That's the pack's fixed size ratio at work. To avoid it, use a pack whose sizes match your planned run, or lower Total Demand Overage % (set it to 0 to stop any over-buy).
What does "Demand changed — re-run Optimize Packs" mean?
Optimization is manual, so if you edit demand after running it — going back to an earlier step, changing adjusted units, or re-splitting — the pack results are based on the older demand. The hint is a reminder to re-run Optimize Packs so the packs reflect your latest numbers. It never blocks you from approving.
Can I edit units or singles directly?
No. On the Pack Optimization step you can only edit Adjusted Number of Packs on pack rows; units recompute from the pack count, and the change syncs across all sizes of that pack. Singles rows are read-only. To change singles or units, re-run Optimize Packs with different selections or settings (for example, turning Allow Singles off for a row).
What happens to choices or POs I don't optimize?
Nothing — they keep their normal per-size order lines. Any row you leave unchecked in the Optimize Packs dialog is untouched, so you can pack part of a document (say, your warehouse POs) and leave the rest (an Ecommerce PO) as loose units.
Does pack optimization pull demand across receipt dates?
Not in this phase. Each choice and receipt date is optimized on its own, so a shortfall in one week is never topped up from another week's demand. Cross-date bundling is planned for a future release.
