TL;DR Published . Updated . · 10-minute read.

At AED 180M and 52 branches, inventory operations break on three structural problems — invisibility across sites, forecasting that is really smoothing, and transfer decisions made by phone. A three-phase rebuild (visibility backbone, forecasting upgrade, transfer agent) took this group from 85 days-on-hand to 66, from 89% in-stock to 97%, and from 2.3% expiry to 0.8% within twelve months. Full phase sequence, metrics, and the operating cadence that locked it in.

The client was a GCC retail pharmacy group with 52 branches across the UAE and KSA, roughly AED 180M in annual revenue. They were, by any reasonable measure, well-run. Good brand, experienced operators, a mature PMS, an ERP connected to it. And yet they had the same inventory problem every GCC operator has at this scale: too much cash tied up in the wrong SKUs at the wrong branches.

When we started, the key numbers looked like this:

  • Inventory on hand: roughly 85 days of COGS — against an internal target of 55 days.
  • In-stock rate on the top 200 SKUs: 89%. Meaning roughly one in ten customer asks for a top-200 item was getting walked out the door.
  • Expiry write-off rate: 2.3% of COGS. Industry benchmark for well-run GCC retail is under 1%.
  • Branch-to-branch transfers: manual, phone-based, and chronically delayed.

The cash opportunity here was significant. Reducing days-on-hand from 85 to 55 on AED 180M of COGS releases roughly AED 15M of working capital. The expiry opportunity was another AED 2.5M a year. But getting there required rebuilding how inventory decisions were actually made, not just tuning the numbers.

The diagnosis: three structural problems

We spent the first two weeks in the branches, not in the data. By the time we opened the ERP, we had a clear picture:

Problem 1 — Each branch was ordering for itself. Every branch had autonomy to set its own par levels and place its own orders against the central warehouse. This was sensible in the early days when the group had 8 branches. At 52 branches, it was producing 52 locally-optimal decisions that summed to a globally suboptimal result. Branch A was over-stocked on a specialty SKU that Branch B had been out of for three weeks. Nobody saw the mismatch.

Problem 2 — Demand signals were local and short. Par levels were based on the last 30 days of sales at each individual branch. Seasonality, local cohort shifts (a new clinic opening nearby), and cross-branch trends were invisible. The system was blind to anything outside the 30-day window.

Problem 3 — Expiry management was entirely reactive. There was no system that flagged approaching expiries early enough for a branch-to-branch transfer to actually happen. SKUs expired on shelf, got written off, and the root cause — that they should have been redistributed six months prior — was never surfaced.

The rebuild, in three phases

Rather than attempting everything at once, we phased the work to minimize operational risk. Any change to inventory operations at 52 branches in parallel is guaranteed to create a crisis. We staged it.

Phase 1 (months 1–2): the network-wide view

The first move was not a system change — it was a visibility change. We built a single, daily-refreshed view of every SKU across every branch and the central warehouse. Cross-branch stock-outs and overstocks became visible for the first time. Nothing was automated yet; we just made the situation legible.

The first two weeks of this view were, frankly, uncomfortable for the operations team. Mismatches that had been invisible for years were suddenly on a dashboard. We anticipated this and ran it as a weekly operations review, not a performance review. The goal was to build shared understanding before changing any behavior.

Phase 2 (months 3–4): the forecasting engine

With everyone looking at the same data, we rebuilt the demand forecasting engine. Four inputs per SKU per branch:

  1. Trailing 90-day branch-level demand.
  2. Trailing 90-day chain-level demand (for cross-branch signal).
  3. Seasonality coefficient (learned from 3 years of history).
  4. Local cohort adjustments (manual input from the branch manager for known events — a new clinic, a school term start, a Ramadan adjustment).

The engine produced a recommended reorder point and quantity per SKU per branch. The branch manager still approved every order — we did not take autonomy away. We just gave them a much better default.

Phase 3 (months 5–7): the transfer and expiry agent

This is where the operational leverage really appeared. We deployed an agent whose sole job was to look at the chain-wide inventory position every night and recommend branch-to-branch transfers. Two triggers:

  • Expiry trigger. Any SKU with <120 days to expiry at a branch with low sell-through, and >60-day velocity at another branch, became a transfer candidate.
  • Stock-out trigger. Any SKU that had stocked out at a branch, where stock was available within a 2-hour drive, became a transfer candidate — same-day.

The agent drafted the transfer order; a central operations manager approved it; it went into the next day's courier route. No phone calls. No chasing.

What broke in the first 60 days

We had predicted about a third of the real friction. Here's what actually happened that we hadn't fully planned for:

Branch managers pushed back on the forecasting engine in week 3. The engine was recommending orders that were 10–20% lower than historical ordering patterns. Several branch managers felt this exposed them to stock-out risk. They weren't wrong to worry — the engine was right in aggregate, but for a given SKU on a given day it could be 10% off either direction. We added a simple "safety override" that let the branch manager bump an order without needing sign-off. Usage of the override dropped from ~30% of orders in week 3 to <5% by week 8 as trust built.

The central warehouse could not handle the new ordering cadence. We had shifted ordering from weekly-by-branch to daily-dynamic-by-branch, and the central warehouse was set up for the weekly rhythm. Picking teams got overwhelmed in week 4. We had to pause new rollout and add a shift. In retrospect we should have staged the warehouse capacity upgrade before the branch rollout.

The transfer agent over-recommended in month 5. In its first month live, the transfer agent recommended about 3x the volume of transfers that the courier network could realistically move. We had to layer in a cost-of-transfer threshold (minimum AED value per transfer to justify the move) and a frequency cap (no more than one transfer per SKU per week, outside of stock-out emergencies).

Supplier relationships needed renegotiation. The new ordering pattern produced smaller, more frequent orders. Several key suppliers had pricing tiers tied to order size. We had to renegotiate three major vendor contracts in month 6. In two cases this was neutral; in one case it resulted in a 1.2% unit-cost increase that partially offset the inventory reduction savings.

The numbers at the end of month 12

A year after kick-off, with the system running in steady state:

  • Inventory on hand: 85 days → 66 days. Target was 55; we landed higher because the supplier negotiation outcome and a deliberate choice to hold more specialty buffer.
  • In-stock rate on top 200 SKUs: 89% → 97%.
  • Expiry write-off rate: 2.3% → 0.8%.
  • Working capital released: AED 9.8M.
  • Annualized expiry savings: AED 2.7M.
  • Branch-to-branch transfers processed: ~11,000 in the year, against <400 in the prior year.

What we'd do differently next time

Three things, in order of impact.

One, stage the central warehouse capacity before the branch rollout. This was the biggest operational pain of the engagement and was entirely avoidable.

Two, set the supplier renegotiation conversation earlier. By the time we were in the new ordering pattern, we had less leverage than if we had started the conversation with suppliers in month 2.

Three, invest more in branch manager training before the forecasting engine went live. The week-3 pushback was avoidable with two hours of pre-rollout training per manager. We did an hour and it wasn't enough.

The general lesson

The technology in this engagement was not particularly novel. Demand forecasting, transfer optimization, and expiry management are solved problems in other industries. The reason it wasn't already happening in GCC pharmacy at scale was operational, not technical: the 52-branch model had been allowed to evolve as 52 local optima, and nobody had the mandate or the cross-branch visibility to change that.

If you are running a chain of more than 20 branches and you haven't done this rebuild, the working capital sitting on your shelves is probably more than your annual capex budget.

The diagnostic starts with a 3-branch inventory benchmark. Two weeks, no commitment.

Book a diagnostic →
More from insights
PLAYBOOK · 8 MIN

The 6–12% margin in your claims

Taxonomy, resubmission rules, and the agent loop that keeps it closed.

DEEP DIVE · 12 MIN

What a pharmacy agent looks like in production

Architecture, human-in-the-loop, and SLAs we commit to.

PLAYBOOK · 6 MIN

PBM negotiation in the age of live reconciliation

Data-backed leverage at the negotiation table.