Skip to main content

Ordering in Packs (Prepacks) on Purchase Orders

How to build a pack catalog, assign packs to choices, and optimize a Recommended Purchase Order into prepacks and singles.

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 Pack 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 → Intelligence → Packs. This page is the central repository for every pack definition in your tenant.

Screenshot: the Packs settings page under Settings → Intelligence, showing the pack grid and the ADD button

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. XS, S, M, L, XL.

Pack Units

Total units in the pack (the sum of the per-size units).

Pack Detail

The per-size breakdown, e.g. XS:1, S:2, M:2.

Status

Active or Inactive — edit it inline.

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.

Screenshot: the Add/Edit Pack dialog with header fields, the Sizes multi-select, and the per-size units rows

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.

  • StatusActive or Inactive; defaults to Active.

  • 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 Pack 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 → Organization → Attributes by choosing Pack as the model, 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, download the pack template from the Packs settings page and import your definitions. The template 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

pack_id

Yes

The pack's external identifier. Re-importing the same pack_id replaces that pack's size rows.

name

No

The pack name; identical across a pack's rows.

pack_upc

No

The pack UPC; SKU packs only.

variant_external_id

Conditional

The vendor/RMS SKU for the size. Provide it to create a SKU-bound pack.

size

Conditional

The size label, e.g. M. Each detail row needs at least one of size or variant_external_id.

units

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.

Errors are reported per row and per pack, and valid rows still import — so one bad row doesn't block the rest of the file.

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 soft-deletes the pack — it disappears from all grids and pickers. To simply stop using a pack, set it Inactive rather than deleting it.

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 Pack 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.

Screenshot: the Pack tab on an Actual Choice in Assortment Plan, showing included and excluded packs with the Add Existing button

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

Toggle each pack with Include / 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 Existing opens a picker of generic packs whose sizes match the choice, so you can attach one without leaving the tab. Selecting it attaches the pack as included.

  • Add New opens the Packs settings page in a new tab. After creating a pack there, use the tab's refresh option 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. Auto-matched packs have no Remove — exclude them instead, since they'd re-appear on the next render anyway.

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 a Click Optimize Packs to generate pack recommendations placeholder — nothing runs on its own. If a PO has no pack-eligible choices at all, the Optimize Packs button is grayed out with a tooltip explaining why.

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) and three per-row settings:

Setting

What it does

Default

Allow Singles

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

Demand Considered %

How much of the row's demand the optimizer may fill with packs. Below 100 deliberately under-fills with packs.

100

Overage Allowed %

Caps how far the optimizer may over-buy to finish filling demand. At 0, it never buys a single unit beyond demand.

55

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:

Screenshot: the Pack Optimization step in the PO wizard after a run, showing pack rows (with Number of Packs and Units) alongside singles rows, and the Optimize Packs button
  • Pack rows — one per size for each pack the optimizer chose. Number of Packs and Units (= Number of Packs × Units Per Pack) are read-only.

  • Singles rows — one per size where loose units were needed. The pack columns (Pack Name, Pack External ID, Pack UPC, Units Per Pack) are blank, Number of Packs is blank, and Units is 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.

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 on save, and the units recompute. Singles rows can't be edited here. Your edits commit behind the standard You have unsaved changes banner.

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. 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 prevents a 1-unit shortfall from dragging in a whole pack. Overage Allowed % 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 Overage Allowed % to 0 guarantees 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 Singles off 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, leaving S: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 Pack tab — auto-matched packs start excluded, so you have to opt them in.

  • Every eligible pack carries a size the demand doesn't have. A pack is only used when its sizes are a subset of the demanded sizes — a pack with S, M, L, XL is never used for S, M, L demand.

  • 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. Use the PO's Refresh to rebuild pack eligibility, then re-run Optimize Packs.

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 Overage Allowed % you set (default 55). If you don't want any over-buy, set Overage Allowed % 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).

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.

Did this answer your question?