Batches & Expiry Dates
Batch tracking lets Helm WMS hold a product's stock as separate batches, each with its own batch number and optional expiry date, so you can trace a unit back to the delivery it arrived on and send the shortest-dated stock out first. This article covers switching it on, capturing batches at goods-in, how expiry drives picking, and where the history sits.
What Batch Tracking Does
Without batch tracking, Helm holds one stock figure per product per location. Turn it on and that figure splits into batches, each carrying a batch number and, if you capture one, an expiry date. Every batch belongs to one location, and the batches at a location always add up to that location's stock figure, so the two cannot drift apart.
That split is what makes date-coded stock manageable: a recall has to be traceable to a batch, not a product, and stock with a shelf life has to leave in date order.
Example scenario: a supplier sends 600 units of a moisturiser on three pallets with three different best-before dates. Booked in as three batches, Helm knows which location holds which date, allocates the shortest-dated pallet first, and can tell you which orders took the batch the supplier later queries.
Before You Start
Your warehouse has to be running in Full mode. Batch tracking is part of location-based stock control. Go to Settings > Company Settings, open the tile named after your warehouse, and check Warehouse Mode reads Full. On Basic there are no batches at all: no Batch Item switch, no batch sections on a product, no batch import.
Batch tracking is set per product, at creation. The switch is on the Create Inventory dialog, and only for an Inventory type of Product. Afterwards the matching field on Product Information is read only.
Know the difference between Batch and Serial. Batching type offers Batch, where a quantity shares one number and one expiry date, and Serial, where every unit has its own number. Only Batch is covered here.
Decide whether a location may hold more than one batch. Enforce Single Batch Per Location, in the Batch Settings card on the same warehouse page, is on by default and limits each location to one batch number per product. Switch it off only if you genuinely mix dates on a shelf.
Have the batch numbers and expiry dates to hand. They are captured while you book goods in.
How to Turn Batch Tracking On
Go to Inventory and choose Create Inventory.
Fill in the Name and Item code, leaving Inventory type as Product.
Switch on Batch Item.
Set Batching type to Batch.
Choose Create Inventory.

A product that already exists without a batching type can still be given one through the Inventory import, using its Batching Type column with a value of batch. A product whose batching type is already set cannot be switched to the other type, because its records belong to the type it has.
Capturing a Batch & Expiry at Goods-In
Batches normally come from receiving. On a delivery under Purchasing > Deliveries, a batch-tracked line gains two extra columns on Delivery Items: Batch Number and Expiry Date.
Enter the batch number and expiry date on the line, alongside the Action Qty and Location.
Where a line arrived as several batches, or with more than one date, open its action menu and choose Split Lines. Use Add Split Line for a row per batch, setting its Batch Number, Expiry Date and Qty.
Publish the delivery. Publishing creates the batch and puts the stock in the location.
A delivery will not publish until every batch-tracked line has a batch number: Helm returns "Batch number is required for batch-type items before publishing." The expiry date is optional, but an undated batch is never treated as the oldest stock, so capture it where the product has one.
Helm matches what you type against the batches already at that location: where the number and date match, the quantity joins the existing batch rather than creating a second record. Receiving itself is covered in the Deliveries article.

Managing Batches on a Product
Open the product from Inventory. Its stock section is titled Batch Stock Locations, not Stock Locations, and carries a Batch Info column in place of the replenishment fields. Its tooltip lists Batch No., Expiry Date and Qty for every batch there, soonest first.
To add stock, use the plus button on the section heading. That opens Create Batch Stock: pick the Location, add a row per batch under Batches with its Batch Number, Expiry Date and Quantity, then Save.
To change what is there, open a row's action menu and choose Batch Stock Management. It lists that location's batches with Batch Number, Expiry Date and Stock, and lets you Edit or Delete one or add another through New Batch Entry.
Stock reads available over physical. The figure before the slash is free to allocate, the one after it is what is physically there, and the difference is reserved for a pick.
A batch cannot be moved by editing it. Its location is fixed once it exists. Use a movement, which carries the number and date to the destination.
Reserved stock is protected. A quantity cannot drop below the amount reserved for a pick, and a reserved batch cannot be deleted: Helm answers "You cannot perform this operation because the stock has already been included in the pick!"

How Expiry Drives Picking
On a batch-tracked product Helm allocates from batches rather than the location's total, and never from a batch whose expiry date has passed. That holds whether or not date-ordered picking is on, so expired stock is never offered to a new pick or shipment.
Where first expired, first out is switched on, Helm sorts the candidate batches by expiry date, soonest first, and treats anything expiring inside that product's expiry lead time as unavailable, so it will not pick stock due to expire before it reaches the customer. Batches with no date sort last. Where it is off, batches follow your pick's usual location strategy and expiry only decides what is excluded.
First expired, first out is driven by a per-product expiry lead time in days, and there is currently no field for it on the product screen. Contact support to have it set on a product that needs date-ordered picking. Until it is, expired stock is still excluded, but the shortest-dated batch is not necessarily picked first.
On the pick itself the item table carries a Batch column, with a Batch Info tooltip showing Expiry Date and Qty, so a picker can confirm they lifted the right batch. Completing the pick moves the batch to the picked location, number and date intact, and holds it reserved until despatch. Picking is covered in the Pick Management article.
Reading the Batch Log
Every change to a batch's quantity or reservation is written to Batch Logs. Open it from the action menu on a row of Batch Stock Locations, the only route in, because the page covers one product at one location. Entries are newest first.
The columns are Batch Number, Expiry Date, Action, Previous Quantity, Action Qty, New Qty, Creation Date and User, which reads System where no signed-in user was recorded. Filter by Date Range, Action or User; search matches the batch number and location code.
Previous Quantity and New Qty are the figures to trust: Action Qty is written unsigned by most actions and signed by the expiry sweep. On Pick Reserved and Pick Released all three columns describe the reservation, not the stock on the shelf.
The Nightly Expiry Sweep
Every night at 03:30 Helm finds batches whose expiry date has arrived or passed and moves that stock off the live product so it cannot be sold by mistake. Nothing is deleted and nothing leaves the shelf: it transfers to a twin product at the same location.
The twin takes the product code with -ex on the end. It carries the original's name, price and cost, and the batch keeps its expiry date with -ex added to its number.
Only unreserved stock moves. Anything reserved for a pick stays on the live product, so a batch can be part expired and part live.
Two entries are written. A Manual Decrease on the original and a Manual Increase on the twin, both noted as expired batch stock moved.
Twins are easy to find. On Inventory, set the Batch Expired filter to Yes, then write the stock off or quarantine it.
The sweep only runs on Full mode. Archived products are skipped and a twin is never swept again.
Because reserved stock is left behind, an expired batch already allocated to a pick will still be picked and despatched. Where the date matters that much, cancel or reset the pick before it expires rather than relying on the sweep.
Importing Batches
Opening stock, or a stocktake across many batches, is faster as a file. Go to Settings > Company Settings > Import, set Import type to Inventory Batch on the Select Import dialog, upload your file and choose Continue, then map your columns and run it. The template carries the exact headings.
The import creates or updates. A row matching an existing batch on product, number, date and location sets that batch's quantity; anything else creates a batch.
It will not undercut a reservation. A row dropping a quantity below the amount reserved for a pick fails and is reported, leaving that batch alone.
Enforce Single Batch Per Location still applies. With it on, a row adding a second batch number at an occupied location is rejected, naming both, so you can fix the file and rerun it.
The import cannot switch tracking on. A row for a product that is not batch-tracked fails: "This inventory item is not configured for batch tracking."
When Something Has Not Happened
Most batch questions come in because something expected did not happen. The usual causes:
No batch fields anywhere. Either the warehouse is not in Full mode or the product has no batching type. Check Warehouse Mode, then Batching Type on Product Information.
The delivery will not publish. A batch-tracked line has no batch number, or no location. Fill both in and publish again.
Helm rejects the batch number you typed. Enforce Single Batch Per Location is on and that location holds a different batch. Reuse the number there, receive into another location, or turn the setting off.
Editing the stock figure is refused. Batch products reject direct stock changes and replenishment levels. Amend the quantity through Batch Stock Management instead.
Batch Logs looks incomplete. It covers one location, and a movement or completed pick writes its other half against the destination. Open Batch Logs from that row too.
Expired stock is still on the product. The sweep runs overnight, and any part reserved for a pick is left where it is.
The oldest batch is not picked first. Date-ordered picking is not enabled on that product, so the order follows your location strategy until an expiry lead time is set.
FAQ
Is the Expiry Date Compulsory?
No. A batch needs a number but not a date, which suits lot-traceable stock that does not expire. An undated batch is used only once every dated batch has run out.
What Is the Product Ending in -ex?
It is the expired twin of the product with the matching code. The nightly sweep moved expired batch stock onto it so it could not be sold, leaving it where it was. Filter Inventory by Batch Expired set to Yes to see them.
Why Does a Goods-In Read as Manual Increase?
Because the log records what happened to the batch quantity, not which screen caused it, so publishing a delivery, an inventory check and a change made by hand all read Manual Increase. The product's Stock Logs does name the source record.
Can I Turn Batch Tracking Off Again?
Not from the product screen: Batching Type is read only once set. Contact support if a product was set up wrongly, and expect its batch records to go too.
If a batch figure still does not add up, open Batch Logs for the location involved and note the batch number and the entry's Creation Date before contacting support. Between them they point straight at what moved the stock.
Was this helpful?
More in Inventory
Getting Started with InventoryManual Inventory CreationNested HeightsPackaging Items & Free GiftsStill need help? Share an idea