AWRA OpsHub Search

The Rotation You Cannot Switch Off

Every allocation in this product goes oldest-expiry-first. There is no setting, no per-item policy and no override — and there is a column on the item that looks exactly like one. The behaviour is stricter than the interface suggests, which is an unusual direction for a product to be wrong in.

Inventory Insights AWRA OpsHub Team 10 min read

Rotation policy is normally a configuration question. Ours is not a question at all. Every path that takes stock out of a location sorts the available batches by expiry date, oldest first, and there is nothing anywhere that changes it.

The position

First-expired-first-out, unconditionally, for every item, every organisation and every issue path. Batches with no expiry sort last, so an undated batch never jumps ahead of a dated one. You cannot relax this, you cannot set it per item, and you cannot override it on a single issue. For food, drink, pharmaceuticals and anything with a date on the box, that is the right default and we would not offer to change it lightly.

How it actually works

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.

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 looks like a setting

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

We are publishing that because a dead column is a specific kind of hazard. If you find it — through the API, through an export, through a developer looking at the schema — it reads as a per-item rotation policy that somebody has left unset. It is not. Setting it, if you could, would accomplish nothing.

The rotation is stricter than the schema suggests. That is the opposite of the usual error, and it is still an error.

This is the fifth field of that shape we have published — alongside a bin capacity that enforces nothing, a count-plan frequency that schedules nothing, approval value thresholds that route nothing, and a pick sequence that sorts nothing. 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 to relax it

Rarely, and it is worth being honest about the cases rather than pretending there are none.

  • 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. Under a strict rule you have to allocate to that order by moving stock, not by choosing a batch.
  • 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.
  • Non-perishables where expiry means something else. A date used as a manufacture reference rather than a use-by will still drive the rotation, because the field is the field.
  • A promotional or contract batch bought for one customer. Nothing ties a batch to a commitment, so the rotation rule will allocate it to whoever asks first.

The general shape of all four is the same: the rule is right about shelf life and knows nothing about commitments. Where those conflict, the resolution is physical — separate locations — rather than configurable.

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 an unconditional 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. And the exception, 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

Not a policy switch. A per-item toggle between first-expired and first-in-first-out would be easy and would mostly be used by accident. The useful work is elsewhere.

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 actually mean when they ask to override the rotation.

A batch reserved against a commitment

Stock can be held by hand today with a reason. Tying a hold to a customer or an order, so the rotation cannot consume it, is the smaller and more valuable half.

Remove the dead column

The honest option, and possibly the right one. A field nothing reads is a trap for whoever finds it next, and deleting it is cheaper than wiring it.

No dates on a public page. 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

  • Oldest-expiry-first allocation on every issue path, unconditionally, with undated batches sorted last.
  • 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.
  • Read FEFO versus FIFO for what the two rotation policies mean and when each is right.

What it does not do

  • Any rotation setting. There is no per-item policy, no organisation switch and no per-issue override.
  • A minimum-remaining-shelf-life rule, per customer or per order.
  • Any link between a batch and a commitment, so a reserved batch can only be protected by holding it or by keeping it somewhere else.
  • A live per-item rotation policy column — one exists in the schema, is read by nothing, and should not be relied on.

Not ours, by choice

  • The unconditional rule is the right default and we would defend it. The gap is not the absence of a switch; it is the absence of shelf-life and commitment rules that the switch would be a crude substitute for.
  • Held stock is excluded from allocation, which is a real control — but only once somebody places the hold. Nothing places it automatically.
  • Nothing here is Irish. It is what an unconditional 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.

Can I stop a specific batch being allocated?

A good answer sounds like

A hold, with a reason, that removes it from the pool.

What it actually means

Ours can, by hand. Without it there is no way to protect stock from your own rotation rule.

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 is already doing what you want and the shelf-life rule is the thing that is missing.

Describe the requirement

Frequently asked questions

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

No. The rotation is unconditional across every item and every issue path, and the column on the item that looks like it would change this is read by nothing. Where you genuinely need a different batch to go out, the working answer is to hold the batch you want to protect or to keep it in a separate location.

What if my items have no expiry dates at all?

Then the rule has no effect — undated batches sort last, and if everything is undated the ordering falls through to the rest of the allocation logic. You lose nothing by the rule existing.

Does the till follow the same rotation?

Yes. The point of sale takes stock through the same allocation paths, 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.

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