Guide
Lot and batch tracking on Shopify: a complete guide
Shopify counts inventory. It does not tell those units apart. This guide explains what that limitation costs, the workarounds people try, and what a proper batch traceability setup looks like on Shopify.
What is lot and batch tracking?
A lot, or batch, is a quantity of product made or received together under the same conditions — one production run, one harvest, one delivery from a supplier. Lot tracking is the practice of keeping that group identifiable as it moves through your business, rather than dissolving it into an anonymous stock total.
The value shows up when something is wrong with one group and not the others. If your records identify batches, a problem is bounded — you know which units are implicated and which are fine. If they do not, every unit you ever sold of that product is potentially implicated.
The terms are used interchangeably in most contexts. "Batch" is more common in food, cosmetics, and pharmaceuticals; "lot" is more common in manufacturing and distribution.
What Shopify does and does not do natively
Shopify inventory is a quantity per variant per location. It supports tracking that quantity, adjusting it, and moving it between locations. There is no concept of the units within that quantity being distinguishable from one another.
Concretely, Shopify has no native field for a lot number, a batch number, a manufacture date, or an expiration date on inventory. Nothing records which specific units went into which order beyond the variant. And nothing can tell you which customers received stock from a particular delivery.
Metafields are sometimes suggested as a fix. They can store a value against a product or variant, but not against a subset of units within it — so a single expiry date on a variant is wrong the moment you receive a second batch.
The workarounds, and why they fail
Three approaches come up repeatedly, and each breaks under load.
- A variant per batch. Technically works, but every delivery creates new variants, the storefront fills with options customers should never see, and reporting fragments across dozens of near-identical SKUs.
- Batch codes in the SKU field. Preserves the code but nothing acts on it — no alerts, no allocation logic, and still no link between an order and a batch.
- A spreadsheet beside Shopify. Fine on day one. It drifts the first time someone fulfills an order without updating it, and drift in a traceability record is worse than no record, because it produces confident wrong answers.
FIFO, FEFO, and LIFO
Once batches are distinguishable, something has to decide which one ships. That decision is an allocation strategy.
FIFO draws from the oldest received batch, FEFO from the soonest expiring batch, and LIFO from the most recently received. FIFO is the intuitive default, but for anything perishable FEFO is the correct one — batches do not always expire in the order they arrive, and whenever those two orders diverge FIFO will strand short-dated stock behind long-dated stock until it expires.
Applying the strategy automatically at fulfillment matters as much as choosing it. A rule your pickers have to remember is a rule that holds until the first busy week.
Recall readiness is decided in advance
The work that makes a recall survivable happens months before it starts. Specifically, it happens at every fulfillment, when the link between an order and a batch is either recorded or lost forever.
With that link, a recall is bounded: enter the batch, get the affected orders and customers, notify exactly them, quarantine what remains, export the case. Without it, you cannot identify who is at risk, so the only defensible response is to treat every customer who bought that product as affected.
The cost difference is enormous, and it is not only financial — a recall that reaches customers who were never at risk does more damage to trust than the targeted one it replaced.
Setting traceability up on Shopify
A workable setup comes down to five decisions, in order.
- Scope — decide which products genuinely need lots. Tracking everything creates noise that trains your team to ignore alerts.
- Capture — record lot number, dates, and supplier reference as stock arrives, and bulk-import the batches you already hold so history is not lost.
- Strategy — pick FIFO, FEFO, or LIFO, and decide whether allocation is automatic at fulfillment or assigned by your team.
- Alerting — set an expiry warning window long enough to act commercially, and route notifications to a channel someone reads.
- Rehearsal — open a recall case on a test batch once before you need to do it for real. Discovering a gap in your records during an actual recall is the wrong time.
Where LotTrack fits
LotTrack implements the above as a Shopify app. Lots sit over your existing Shopify inventory rather than replacing it, so quantities stay in sync and your team keeps fulfilling orders in the admin they already use.
It covers selective tracking, lot capture with dates and supplier references, CSV import, FIFO, FEFO, and LIFO allocation, QC hold and quarantine, lot splitting with lineage, expiry and low-stock alerts, returns reconciliation, nightly drift detection against Shopify quantities, recall cases with customer notification, an append-only audit trail, CSV export, and Shopify POS support.
Every one of those features is on every plan. Plans differ only in how many active lots and locations you track.
Try it on your own inventory
Install from the Shopify App Store — 14-day free trial on every plan.
Frequently asked questions
Does Shopify support lot tracking natively?
No. Shopify inventory is a single quantity per variant per location with no field for lot numbers, batch numbers, or expiration dates, and no record of which units went into which order. Batch traceability requires an app.
What is the difference between a lot and a batch?
In practice they mean the same thing — a quantity of product produced or received together under the same conditions. "Batch" is more common in food and cosmetics, "lot" in manufacturing and distribution.
Can I use metafields to track expiry dates?
Not reliably. A metafield attaches a value to a product or variant, not to a subset of units within it. As soon as you hold two batches with different dates, a single variant-level date is wrong for one of them.
Should I track lots on every product?
Usually not. Tracking products that have no shelf life or traceability requirement creates alert noise and busywork. Selective tracking — nominating only the products that need it — keeps the signal meaningful.