AWRA OpsHub Search

The Rotation You Could Not Switch Off

Until 1 October 2026 every allocation in this product went oldest-expiry-first, with no setting and no per-item policy — and a column on the item that looked exactly like one. That column is now a real setting: earliest expiry first by default, or earliest received first, per item.

Inventory Insights AWRA OpsHub Team 10 min read

Rotation policy is normally a configuration question. For a long time ours was not a question at all. Every path that took stock out of a location sorted the available batches by expiry date, oldest first, and nothing anywhere changed it — not even the field on the item that said it would.

The position

First-expired-first-out is still the default, for every item that has not been told otherwise, with undated batches sorted last so an undated batch never jumps ahead of a dated one. Since 1 October 2026 an item can instead be set to first-received-first-out, and every issue path honours that. A batch you pick explicitly on an issue still wins over either. For food, drink, pharmaceuticals and anything with a date on the box, earliest expiry first remains the right default, and changing an item away from it goes through item-master approval for that reason.

How it actually works

On an item set to earliest expiry first, every allocation orders the candidate batches by expiry date, treating a missing date as the far future. That single rule produces the behaviour you want in all three cases without any special handling: dated batches rotate properly, undated batches are consumed only when nothing dated is available, and a mixture behaves sensibly rather than arbitrarily.

On an item set to earliest received first, the same paths order by when the stock arrived — the batch's received date, falling back to when the batch was recorded, falling back to when the stock row was created. Issues, till sales, transfers, and allocations from one warehouse or one location all read the same setting, so there is one rotation per item rather than one per screen.

The allocations are recorded, so a batch's history shows what was taken from it and when. That is what makes a recall traceable one step forward, which is the half of traceability that is usually missing.

The column that looked like a setting

There was a rotation-policy column on the item record. It was written by nothing, read by nothing, and exposed in no screen — it existed in a migration and in two internal registries and nowhere else.

We published that because a dead column is a specific kind of hazard. Found through an export, or by a developer looking at the schema, it read as a per-item rotation policy that somebody had left unset. It was not. Setting it would have accomplished nothing.

On 1 October 2026 we wired it rather than deleting it. It now appears on the item form as Stock rotation, it is read by every allocation path, and because it decides which physical stock leaves the shelf next it is one of the critical fields a change to which waits for approval.

The rotation used to be stricter than the schema suggested. That is the opposite of the usual error, and it was still an error.

It was one of five fields of that shape we published — alongside a bin capacity that enforced nothing, a count-plan frequency that scheduled nothing, approval value thresholds that route nothing, and a pick sequence that sorts nothing. The first two were wired on the same day as this one; the last two are still open. The pattern is worth carrying into any evaluation, of any product: a field you can see is not evidence of a behaviour you can rely on.

When you would legitimately want something other than the default

Rarely, and it is worth being honest about the cases rather than pretending there are none. Only one of them is answered by the new setting.

  • Non-perishables where expiry means something else. A date used as a manufacture reference rather than a use-by used to drive the rotation anyway, because the field is the field. This is the case the setting answers: set the item to earliest received first.
  • A customer specifies a minimum remaining shelf life. A retailer refusing anything with less than two-thirds of its life left means the oldest batch is precisely the one you cannot send them. A rotation setting does not help here; you allocate to that order by picking the batch or by moving stock.
  • A batch is quarantined but not expired. Held stock is excluded from allocation, which handles this correctly — but only if somebody has actually placed the hold. The rotation rule will happily allocate a batch nobody has flagged.
  • A promotional or contract batch bought for one customer. Confirming that customer's sales order reserves the quantity at the warehouse, so nobody else can sell it. The reservation holds a number rather than a batch, though, and rotation still decides which batch leaves against whichever order is filled first.

The last three share a shape: the rule is right about shelf life and knows commitments only as quantities. Where a commitment is to one particular batch, the resolution is still physical — an explicit batch or a separate location — rather than a policy switch.

Why Irish food and drink distribution is the right place to write this

Because it is a sector where remaining shelf life is a contractual term rather than a preference, and where the customer base is concentrated enough that a single retailer's specification shapes how you have to hold stock.

In that setting the default rotation rule is mostly a gift — it is the behaviour you would have configured anyway, applied consistently by something that never gets tired at four in the afternoon. The new setting matters for the packaging, dry goods and spares on the same shelves. And the exception that matters most, when it comes, is not a rotation exception at all. It is a segregation problem, and the answer is a location.

Scope, not a ceiling

What would actually be worth building here

The per-item setting is built. The useful work that remains is the shelf-life and commitment rules a switch is only a crude substitute for.

Minimum remaining shelf life

A rule that refuses to allocate a batch with less than a stated proportion of its life left, per customer or per order. This is what people usually mean when they ask to override the rotation.

A batch reserved against a commitment

Stock can be held by hand today with a reason, and a confirmed sales order already reserves its quantity per warehouse. Pinning that reservation to a named batch, so the rotation cannot hand that batch to another order, is the smaller and more valuable half.

A per-issue override

Picking a batch explicitly already beats the policy on a single issue. A recorded override with a reason — take the newer batch this once, and say why — is the audited version of the same thing.

We put scope on a public page and dates in a written quote. If minimum shelf life is a contractual requirement for you rather than a nicety, describe it and we will come back with a written scope, timeline and cost.

Scope shelf-life rules

The rotation ledger, precisely

What AWRA OpsHub does today

  • A per-item stock rotation setting: earliest expiry first by default, with undated batches sorted last, or earliest received first.
  • The setting read on every allocation path — issue, till sale, transfer, and allocation from a single warehouse or location — with an explicitly chosen batch still taking precedence.
  • Rotation held as a critical item field, so changing it waits for item-master approval.
  • Batch allocations recorded, so a batch can be traced forward to what was taken from it and when.
  • Batches carrying a lot number, supplier, purchase order, received and manufactured dates, quality status and recall status.
  • Expiry alerting on a 30/60/90 horizon with value at risk, daily, plus a workflow event per expiring batch.
  • Hold and disposition states on stock at a location, which exclude it from allocation once set.
  • Stock reservations: a confirmed sales order reserves its quantity per warehouse, backorders fill oldest-first as stock arrives, and reserved stock cannot be sold, transferred or issued to anyone else.
  • Read FEFO versus FIFO for what the two rotation policies mean and when each is right.

More we can add to your workspace

  • A recorded per-issue override of the rotation, with a reason, beyond picking the batch by hand.
  • A minimum-remaining-shelf-life rule, per customer or per order.
  • A link between a specific batch and a commitment. Reservations hold a quantity per warehouse and rotation still chooses the batch, so protecting one particular batch today means holding it or keeping it somewhere else.

Where we point you to a specialist

  • Earliest expiry first is the right default and we would defend it. What is worth building next is not another switch but the shelf-life and commitment rules a switch would be a crude substitute for.
  • Held stock is excluded from allocation, which is a real control — once somebody places the hold. Placing it automatically is the build.
  • This is market-neutral. It is what a rotation rule does; Ireland is where the contractual shelf-life term is most likely to be sitting on your desk.

Three questions about rotation, for any vendor

What happens to a batch with no expiry date?

A good answer sounds like

It sorts last, behind everything dated.

What it actually means

If undated batches sort first or arbitrarily, your rotation is broken the moment one item is entered without a date — which will happen in the first month.

Set one item to first-in-first-out. Show me a sale, a transfer and an issue all honouring it.

A good answer sounds like

The same batch chosen on all three.

What it actually means

A rotation setting that only one screen reads is two rotation rules in one product. Ours is read by every allocation path.

Show me what was taken from this batch and when.

A good answer sounds like

A list of allocations.

What it actually means

This is the forward half of traceability and it is the half most often missing. One step back is easy; one step forward needs the allocations to have been recorded.

Talk about shelf life, not rotation

If a customer contract specifies remaining life, that is the requirement worth describing to us — the rotation already does what you want, per item, and the shelf-life rule is the piece still to build.

Describe the requirement

Frequently asked questions

Can I make one item first-in-first-out instead?

Yes, since 1 October 2026. Set the item's stock rotation to earliest received first and every allocation path — issues, till sales and transfers — takes the stock that arrived first. The change is a critical field, so it goes through item-master approval. Items you leave alone stay on earliest expiry first.

What if my items have no expiry dates at all?

Then earliest expiry first has no effect — undated batches sort last, and if everything is undated the ordering falls through to the rest of the allocation logic. Setting such items to earliest received first gives them a deliberate order instead.

Does the till follow the same rotation?

Yes. The point of sale takes stock through the same allocation paths and reads the same per-item setting, so a counter sale rotates exactly as an issue does. That consistency is worth more than it sounds: two rotation rules in one product is how a batch ends up expiring on a shelf while the same item is being sold from the back.

Can I override the rotation on a single issue?

By choosing the batch explicitly, yes — a batch you pick wins over the item's policy. A recorded override with a reason is not built yet, and is something we can add.

Share this article

LinkedIn X WhatsApp

Help Center

Need a quick answer while you read?

Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.

Search all approved AWRA public help articles.

Open Help Center