Skip to main content

Lot tracking: batch numbers and expiry dates

Record supplier batch numbers and expiry dates as you receive, browse them in the Lots view, and catch expiring stock - an early-access preview, off by default.

Lot tracking records which supplier batch each delivery came from, and when it expires. It's an early-access preview and it's off by default - if you don't need it, you'll never see it.

Lots are a record that sits alongside your inventory. Recording, correcting, or consuming a lot never changes your Shopify stock levels - receiving updates inventory exactly as it always has, and the lot simply remembers where those units came from.

Turn it on

In Stockroom, open Settings, choose Purchase orders, and scroll to the Early access section. Turn on Turn on lot tracking and save. The same toggle is available in your store settings on go.stockroom.app.

Then mark each product you want to track: on its product page, tick Track lots in the Costs & replenishment section. To mark many at once, select products on the Products page and use Track lots, or use the lot_tracking column in the stock settings CSV. Most stores only track a few products - everything else stays exactly as it was.

Record lots as you receive

On a purchase order with marked items, the receive card's Columns picker offers Lot, Expiry and Mfg date columns - turn on the ones you use. Type the supplier's batch number next to each line and pick the expiry date if the product has one. When you receive, the accepted units are booked into that lot.

A few things worth knowing about how capture works:

  • Each receive line takes one lot. If a single delivery contains two batches of the same product, receive it in two rounds - each round makes its own receipt.

  • If you receive more of a lot number you've recorded before, the new units join the existing lot. A lot keeps the expiry date it was first given.

  • Only marked products take a lot - other lines on the same order show a dash.

  • Only accepted units go into the lot - units you reject at receiving don't.

  • Undoing a receive also takes its units back out of the lot.

The same columns are available when you receive on go.stockroom.app. On a return to a supplier, the column picker offers From lot instead - pick which batch the units are leaving from (the batch expiring soonest is at the top of the list), and the lot's balance goes down when you record the shipment. Undoing the ship-back puts the units back. For the full receiving flow, see Receiving Inventory Against a Purchase Order.

Browse your lots

Open Inventory and choose Lots. You can search by lot number, switch between Active and Consumed lots, and filter to lots expiring within 30 or 90 days. A lot is Active while it still holds units and becomes Consumed when its balance reaches zero.

Open a lot to see its full story: the expiry and manufacture dates, how many units are on hand, and a history of every movement - which purchase order the units arrived on, any receives that were undone, and any manual corrections. Each product also shows its own lots on the product page.

Correct a lot

On a lot's page you can edit the expiry and manufacture dates directly. To move units in or out - say a batch number was typed on the wrong line - use Adjust: enter the change (positive adds units, negative removes them) and a reason. Adjustments only correct which lot the units belong to; your Shopify inventory doesn't move.

Recall a batch

If a batch has to be pulled, open its lot page and choose Mark recalled, adding a reason if you like. Nothing moves in Shopify - a recall is a flag, not an adjustment. While a lot is recalled, Stockroom won't let it be assigned to an order or consumed by a build, and it disappears from the earliest-expiry suggestions. Adjustments, stocktakes, returns to the supplier and unbuilds still work on it, so you can pull the stock out however suits you.

The lot page turns into the case file: a red banner with the reason and date, and a Where this batch went section listing the orders that shipped units from it and any batches that were built from it - so a recalled component leads you straight to the finished goods it went into. The Lots view gets a Recalled tab to find these quickly. When the recall is over, Reinstate puts the lot back to normal.

Assign lots to orders

On a Shopify order, the Stockroom - Lots block lists the order's lot-tracked items with a suggestion for which lot the units should come from - the batch expiring soonest comes first, split across batches when one can't cover the quantity. Review it, change any line, and Save: the units come out of those lots, and each lot's page lists the order in its history. You'll find the block on the order page in the apps area - pin it to keep it in view.

Assignments are always yours to confirm - Stockroom never picks a lot on its own. Clearing an assignment puts the units back in the lot, and a refund doesn't return units automatically - adjust the lot if you restock them.

Lots on adjustments and stocktakes

When you write off or find stock, you can say which batch it belongs to. On a stock adjustment, lines for lot-tracked products get a Lot column: pick the lot the units are leaving (a negative adjustment) or joining (a positive one). The pick is optional - a correction with no lot still updates Shopify, it just leaves your lot balances alone.

Stocktakes work the same way at the review step. You count the shelf as usual - one count per product, since every batch shares the same barcode - and any line with a difference shows a Lot select where you can say which batch the missing or extra units came from. When you apply the stocktake, that lot moves along with the Shopify correction.

Lot balances move when the document is applied, not when it is saved, and Stockroom refuses to apply one that would take more units out of a lot than it holds - adjust the lot first if its balance is wrong. Each lot's page lists these movements as Adjustment or Stocktake with the document number, linked to it.

Lots on builds

When you record a build, you can track both sides of it. If a component is lot-tracked, its line in the Record build dialog gets a Lot select - pick the batch those parts came from, and the lot's balance goes down by what the run consumed. Picks are optional, and Stockroom refuses to record a run that would take more units out of a lot than it holds.

If the product you're making is lot-tracked, the same dialog offers a Lot number field - prefilled with the build number, like BLD-1024 - and an optional Expiry. The units you record join that batch, so a production run becomes a traceable lot of its own. Type a different number to add to an existing batch, or clear the field to skip it. Scrapped units never enter a lot.

Undoing a run puts everything back - the component lots and the output batch. Each lot's page lists these movements as Build with the build number, linked to it. Components issued to a build ahead of time aren't drawn from a lot until a run consumes them.

Unbuilds work the same way in reverse. In the Record unbuild dialog, a lot-tracked product gets a Lot select for the batch the units you're taking apart come out of, and each lot-tracked component gets a Lot number and optional Expiry for the batch the recovered parts go back into - type an existing number to rejoin it, or a new one to start a batch. Leave either blank to skip it.

The Expiring lots report

Under Reports, the Expiring lots report lists every lot with an expiry date that still holds units, soonest first - anything already expired sits at the top. You can export it as a CSV.

To get this by email or Slack on a schedule, create an Expiring lots alert under Settings > Alerts. Choose how far ahead it looks, and expiring lots arrive with your stock alert digest.

Put the lot on your labels

When you print labels - from a receipt, a purchase order, or the Products page - the print dialog offers Include lot number and Include lot expiry. Labels printed from a receipt carry the batch that arrived on that delivery; printing for a whole order or from the Products page uses the item's most recent lot. The expiry prints as EXP followed by the date, and both need one of the larger label sizes.

Good to know

  • Lot tracking is off by default, and applies only to products you mark. Until you turn it on and mark a product, the columns, the Lots view, and the report stay hidden.

  • Lots never change Shopify inventory. They're a record of where units came from, kept alongside your stock levels.

  • Lots are captured at receiving, when a build records a lot-tracked product, or when an unbuild recovers lot-tracked components; drawn down when you assign them on an order, return stock to a supplier, a build consumes lot-tracked components, or an unbuild takes a batch apart; and moved by the lot you pick on an adjustment or at stocktake review. Transfers don't record against lots yet - this is an early-access preview, and lot awareness will reach more of the app as it grows.

  • go.stockroom.app has the same Lots view and lot pages under Inventory, records lots at receive, and can turn the feature on or off. When receiving at the POS, marked products offer a lot number field too.

Did this answer your question?