Skip to content

D-08

Warehouse Operations

A warehouse execution pattern backed by versioned task commitments, timestamped activity events, receipt and putaway records, allocations, picks and shipments, and cycle-count plans paired to their own book snapshots — with the business as-of pinned separately from the capture cutoff so a late correction is visible as one.

There is a reference build of this pattern: the Warehouse Operations dashboard in the showcase renders it over frozen, simulated data — not a live client system.

See the working synthetic reference build. The fact model below is stated canonically — as the business facts the pattern needs — because the source mapping for warehouse execution differs by system and none is claimed here.

What it answers

A warehouse supervisor asks four questions in a shift, and they are four different measurements. What has to move before the dispatch cutoff, and what is already late? How much of what arrived at the dock is actually available to pick? What shipped, as opposed to what merely got picked? And when a count disagrees with the book, which number is the count and which is the book?

The pattern keeps them apart deliberately. Receiving is not putaway availability. Picking is not shipping. A physical count is not an inventory position. Each is its own fact at its own grain, and each measurement names the accountable role that owns it.

Two instants are pinned separately: the business as-of decides what has happened, and the capture cutoff decides what is knowable. A report keyed wrongly at dispatch and corrected the next afternoon gives two honest readings — the one an earlier reader legitimately saw, and the corrected one — and the pattern can show both rather than pretending the first never existed.

The wireframe

Warehouse operations dashboard with separate current-snapshot and historical-window controls, four measure tiles, a state breakdown, an open worklist, and evidence tables

Business As-Of | Knowledge Cutoff | Zone ‖ History Window
Open Work
Overdue
Committed Qty (per UOM)
Median Open Age
Open work by task type and queue state, against the authored cutoff
Open worklist: task, committed quantity, due instant, time to due, age, revisions, accountable owner
Evidence: receipt vs putaway | allocation vs pick vs ship | count attempts against the book snapshot
Filters
KPI / Metric
Primary Chart
Secondary Viz
Detail / Table

Layout basis

  • L-04 Tabbed Views separates the live queue from inbound, outbound and counting without changing the pinned instants
  • L-03 Master-Detail / Drill-Down keeps each task, receipt line, order line and count line and its own evidence attached to the figure it moved
  1. Pins the business as-of and the capture cutoff are separate controls, and the history window is separate from both.
  2. Measure row counts, per-unit quantities and a pooled age stay four numbers; none of them is averaged into a score.
  3. State breakdown overdue, at risk, due before cutoff and due after cutoff are one state per task, so the states partition the queue.
  4. Worklist each row keeps its own due instant, its revision count and the role accountable for finishing it.
  5. Evidence partials, cancellations, short picks, corrections and recounts stay visible rather than being netted away.

The fact model underneath

The accumulating fact is the task: it gathers a versioned commitment and an append-only stream of activity events, and it is never edited in place. A due instant that moves is a new revision; a cancellation is a revision; a mis-keyed completion is a correcting event that supersedes the report it replaces. Both a business instant and a capture instant are kept on every row, which is what makes a reading reproducible at either pin.

Around it sit the records the tasks work against: receipt lines and the putaway movements that make their quantity available, allocations and picks and shipments on the outbound line, and cycle-count plans whose lines carry the book quantity read at the plan’s own boundary snapshot with every count attempt kept beside them.

Every one of those base facts carries its own capture instant, not just the events reported against them. A receipt, an order line, a task or a count plan that reaches the system late is absent from a reading pinned before it arrived, and the reading says how many facts it could not see — a smaller population, disclosed, rather than a quantity of zero.

fct_warehouse_task_activityAccumulating line fact

Grain one warehouse task, accumulated from its commitment revisions and activity events

Stored components

  • task_id
  • opened_at
  • recorded_at
  • effective_due_at
  • committed_quantity
  • uom
  • completion_occurred_at
  • completion_recorded_at
  • owner_role

Foreign keys

  • dim_task_commitment_revision
  • dim_receipt_and_putaway
  • dim_outbound_line
  • dim_fulfilment_profile
  • dim_cycle_count_plan
  • dim_count_attempt
  • dim_location
dim_task_commitment_revision
  • task_id
  • revision
  • commitment_state
  • due_at
  • planned_quantity
  • uom
  • effective_at
  • recorded_at

The commitment is versioned and cancellation is a revision, so a due instant that moved stays visible and a cancelled task is never deleted. One terminal-state profile decides the outcome for every view: completed work stays completed work whatever the commitment does afterwards, and work reported after its own commitment was cancelled is counted as work that happened rather than scored against a commitment that was not live.

dim_receipt_and_putaway
  • receipt_line_id
  • received_quantity
  • received_at
  • putaway_id
  • putaway_quantity
  • available_at
  • destination_location_id

Two records, not one: receiving is arrival and putaway is availability, so a partially put-away line stays partial.

dim_fulfilment_profile
  • policy_id
  • version
  • overdelivery_policy
  • overdelivery_quantity
  • overdelivery_uom
  • effective_from

The authored profile the outbound ceiling comes from. Overdelivery is either not permitted — in which case cumulative quantity may never exceed the commitment — or permitted with a declared surplus that is published as its own measure and never counted as fulfilment.

dim_count_attempt
  • observation_id
  • count_line_id
  • attempt_no
  • counted_quantity
  • approval_state
  • counted_at
  • recorded_at

Every attempt is retained. Which attempt is scored is a declared policy — never an average of attempts and never whichever row is last — and the attempt sequence must agree with the chronology: a recount counted before, or at the same instant as, the attempt it recounts is rejected rather than scored.

dim_activity_eventdegenerate
  • event_id
  • event_type
  • occurred_at
  • recorded_at
  • corrects_event_id
  • actor_role

Append-only. A correction replaces an earlier report rather than editing it, and both instants are kept so a late correction can be read at either capture cutoff.

dim_outbound_line
  • order_line_id
  • ordered_quantity
  • required_ship_by
  • recorded_at
  • allocated_quantity
  • picked_quantity
  • short_reason
  • shipped_quantity
  • corrects_ship_id

Allocation, pick and shipment are separate quantities on the line; splits are several rows and a correction supersedes a row rather than overwriting it. The line is the obligation cumulative allocation, picking and shipping are held to, and it carries no zone: outbound line measurement is warehouse-wide unless the model adds an explicit zone allocation.

dim_cycle_count_plan
  • count_plan_id
  • count_boundary_at
  • book_snapshot_id
  • tolerance_policy_id
  • tolerance_policy_version
  • chosen_attempt_policy

The plan pins the book snapshot its counts are compared against and the tolerance version it is scored under; a later balance or a later policy never rescores it.

dim_location
  • location_id
  • zone_id
  • location_type

The known location population a count sample is measured against, so coverage is a real denominator rather than the lines that happen to exist.

Quantities are exact decimals carried with the unit they are stated in; nothing is summed across units.

Measures and states

Warehouse Operations measures and their aggregation behavior.
MeasureFormulaAdditivityNote
Open and overdue workcount(task where effective commitment is active and no completion event exists) and, of those, count(due_at < business as-of)AdditiveRead at a pinned business instant. A task with no effective revision is not yet committed, which is not the same as not open.
Open agepercentile(business as-of − opened_at) over open tasksNon-additivePooled from the open tasks at the displayed scope. Elapsed wall-clock time; no labour time exists in these facts, so it is not productivity.
Completion and on-time completioncompleted eligible commitments / commitments due in the window, and completions at or before the due instant in effect at completion / completionsNon-additiveEligibility is by due instant inside the window, under the same terminal-state profile the queue reads. Work still open is censored and disclosed, never counted as late; work completed against an already-cancelled commitment is counted separately rather than scored or dropped.
Received, put away and awaiting putawayΣ received_quantity, Σ putaway_quantity, and their difference, within one unit of measureAdditiveThree separate quantities. Receiving does not make stock available, and quantities in different units are never added.
Dock-to-stock durationpercentile(last available_at − received_at) over receipt lines whose whole quantity is availableNon-additiveOnly fully available lines have a duration; partial lines are censored and reported as such.
Pick and ship completionΣ picked / Σ allocated and Σ min(shipped, ordered) / Σ ordered, within one unit of measure, over lines already dueNon-additiveSummed components, divided once, warehouse-wide. Each line contributes only up to what it committed, so completion cannot exceed 100%; any surplus is published as its own quantity. Cancelled lines, commitments not yet due, and lines not yet captured are excluded and disclosed separately.
Shipped beyond the commitmentΣ max(0, shipped − ordered) within one unit of measureAdditiveIts own measure, never part of completion. Under a profile that does not permit overdelivery it is an evidenced zero and the boundary rejects any data that would make it otherwise.
Count accuracy, variance and coveragelines within tolerance / scored lines; Σ (counted − book) and Σ |counted − book| per unit; counted locations / known locationsNon-additiveFour separate numbers. No counts is unavailable, not 100%, and a plan is a sample rather than a census of the warehouse.

Current state and historical performance are different populations and are controlled separately. The queue is read at the pinned instant; completion, duration, receiving and outbound populations are read over a trailing window and always publish how much eligible work is still open inside it.

A duration here is elapsed wall-clock time between two business instants. No labour time is captured in this fact model, so none of these measures is labour productivity and none may be labelled as such.

Outbound line measurement is warehouse-wide. These facts carry no allocation of an ordered quantity to a zone — a line is typically picked in one zone and shipped from another — so a zone filter over order lines would report a denominator nothing supports. The queue is at task grain, where the zone is a fact, and remains scoped by it.

Implementation notes

  • Pin the business as-of and the capture cutoff separately, and compare timestamps as instants — two rows written at different UTC offsets are not ordered by their strings.
  • Reject ambiguous commitment revisions (two revisions effective at the same instant on one task) and correction chains that fork, loop or point at another task.
  • Declare one terminal-state profile and let every view read it from one kernel. Completion is a physical fact: a cancellation recorded afterwards cannot un-report it, and a cancellation recorded before it does not make the work disappear either — it makes the work something that happened outside a live commitment, which is counted on its own rather than scored or dropped. A reinstatement is a later active revision in the data, never an assumption in the code. Two views walking the same ladder in different orders is how a task ends up completed on one screen and cancelled on the next.
  • Keep receiving and putaway as separate records, and never let the sum of a line’s putaways exceed what it received. A partial stays partial.
  • Keep allocation, pick and shipment as separate quantities. A split shipment is several rows; a correction supersedes a row and both rows are retained.
  • Hold the cumulative quantity to the obligation, not just each row to its own allocation. Ten picks of ten units each are individually consistent and collectively an invention: sum every effective pick and shipment on a line and compare the total with what the line committed, under a declared fulfilment profile. If that profile permits a surplus, publish the surplus as its own measure and keep it out of the completion numerator.
  • Scope only what an allocation supports. An ordered quantity is a commitment on the warehouse; unless the model carries an allocation of it to a zone, outbound line measurement is warehouse-wide and the filter is not offered rather than being offered and quietly ignored.
  • Give every base fact a capture instant, not only the events reported against it, and apply the knowledge cutoff to all of them. A late-arriving receipt, order line, task or count plan is absent from an earlier reading and its absence is published.
  • Pair a physical count with the book snapshot named by its own plan boundary, declare which attempt a recounted line is scored on, and never average attempts. Hold that declared sequence to the chronology: a recount counted before — or at the same instant as — the attempt it recounts is a data fault, not a scorable result.
  • Keep signed variance, absolute variance, within-tolerance accuracy, sample size and coverage as five separate numbers. No counts is unavailable, not 100%, and a plan is a sample rather than a census.
  • Treat the dispatch cutoff, the at-risk horizon and the count tolerances as versioned configuration with an owner and a stated provenance, and score a plan under the version it pinned.
  • Partition every quantity by unit of measure, and reject a row whose unit disagrees with the record it belongs to rather than converting it silently.

Maintained by Summit Analytics, a supply chain analytics practice. The tools and references are free — the consulting is selective.

Part of the Summit Analytics reference library.

Work with the practice

Not affiliated with or endorsed by SAP, Oracle, Microsoft, or Infor. Product names are trademarks of their respective owners.