Skip to content

D-10

Returns & Recovery

A reverse-flow pattern backed by return authorizations and their revisions, physical receipt events, repeated inspection attempts, disposition actions, evidenced recovery and cost components and customer settlements — with authorization, receipt and credit kept as three separate facts and material conserved from receipt through to supported final disposition.

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

See the working synthetic reference build. This pattern states a canonical business input contract; it names no ERP tables and no BI-platform behaviour, because neither has been verified for it.

What it answers

Three questions that returns dashboards usually blur into one. What is still open in the reverse flow, as of now — authorized but not received, received but not inspected, inspected but not dispositioned. What came back out of the material that actually settled — as usable quantity, and separately as money. And what a claim about preventing the next return would need to rest on.

The pattern refuses three shortcuts. An authorization is not a receipt: a customer being told they may return something is not material arriving. A credit is not a recovery: money settled with a customer is a liability discharged, not inventory value regained. And a reason code is not a cause: it records how somebody classified a return, which is an input to an investigation rather than a conclusion of one.

The wireframe

Returns and recovery dashboard with a current-snapshot context, a separate completed-cycle window, an open worklist, a material conservation ladder, financial recovery and reason coding

Business As-Of | Capture Cutoff | Receiving Site | Completed-Cycle Window
Open Lines
Past Due
Recovered Qty
Net Financial Recovery
Open worklist: authorized | received | outstanding | pending inspection | awaiting disposition | age | past due | owner ‖ closed or cancelled with material still here
Conservation ladder per unit: received = pending + awaiting + final
Per currency: value | cost | partial net | unevidenced | eligible actions | evidence coverage ‖ credits issued ‖ actions with no currency
Reported coding vs assessed coding, with the owned investigation and its evidence
Filters
KPI / Metric
Primary Chart
Secondary Viz
Detail / Table

Layout basis

  • L-04 Tabbed Views separates the current open worklist from the two completed-cycle reviews without changing the pinned as-of
  • L-03 Master-Detail / Drill-Down keeps each case's revisions, attempts, actions, evidence and owner attached to the line they belong to
  1. Context four independent pins. The business as-of and the capture cutoff decide what exists and what is known; the completed-cycle window is separate and applies only to the historical views, which say so rather than showing a control that changes nothing.
  2. Measure row recovered quantity and net financial recovery are different measures in different units, and neither is the credit issued to the customer.
  3. Worklist a current-snapshot list, aged from authorization and scored against the authored disposition due instant. It is not a completed-cycle measure, and a line recorded as closed or cancelled while material is still here stays on it as an exception rather than leaving the view.
  4. Conservation one bar per unit of measure, and the segments sum exactly to what was received. A repeated inspection does not add material.
  5. Financial value and cost stay separate with their own evidence, the net is labelled partial, and completeness is counted against the physical actions that declare the currency.
  6. Reasons two codings side by side, never merged, and a preventive claim only where an owned investigation with evidence exists.

The reverse-flow model

The accumulating fact is the authorization line as it moves: authorized, received, inspected, dispositioned, settled. Everything that could otherwise overwrite an earlier state is a separate append-only row instead — a revision for a cancellation, a reopen, a quantity change or a reason change; a signed correction event for a miscounted receipt; a numbered attempt for a re-inspection; a reversal for an action taken in error.

Two instants travel with every row. The business instant says when it happened; the capture instant says when the warehouse learned about it. Pinning them separately is what lets a replay answer “what did the room know on the second, about the flow as it stood on the tenth” without a late-captured receipt silently appearing in an earlier reading, and without a future receipt leaking into a current one.

A fact that spans time captures more than once. An inspection attempt records when it started and, separately, when its completion was learned of — because knowing an attempt began is not knowing how it ended. Until the completion is captured, the attempt is open: it contributes no inspected quantity, no outcome and no assessed reason, rather than being credited with a result the review cannot yet see. The same discipline applies to every derived population: an investigation recorded after the capture cutoff reaches no tile, no card and no reason row.

Quantities carry the line’s unit of measure and money carries its own currency. Both are exact decimal strings at a declared scale and are summed as scaled integers, so a conservation ladder closes to zero rather than to a rounding residue. Nothing is converted between units or currencies anywhere in the model.

fct_return_line_dispositionAccumulating line fact

Grain return authorization line × recorded reverse-flow event

Stored components

  • authorized_quantity
  • received_quantity (signed)
  • inspected_quantity (attempt 1 only)
  • disposition_quantity
  • recovery_currency_code (declared on the action)
  • recovery_amount
  • cost_amount
  • settlement_amount
  • business_instant
  • capture_instant (per stage)

Foreign keys

  • dim_return_line_revision
  • dim_disposition_type
  • dim_reason_code
  • dim_action_owner
dim_return_authorizationdegenerate
  • authorization_id
  • customer_id
  • receiving_site_id
  • currency_code
  • authorized_at
  • disposition_due_at
  • owner_id

An authorization is a permission to return. It is not a physical receipt and it is not a credit; both of those are their own facts.

dim_disposition_type
  • action_type
  • terminal
  • recovery_basis

Whether an action ends the reverse flow is configuration, not a code list hard-wired into a query. Interim rework and hold never count as final.

dim_action_owner
  • owner_id
  • name
  • role

Every authorization, inspection, action, settlement and investigation names an accountable owner.

dim_capturedegenerate
  • recorded_at
  • completion_recorded_at

Capture is per fact, and a long-running fact captures twice: knowing an inspection started is not knowing how it ended, so the completion carries its own capture instant.

dim_return_line_revision
  • revision_id
  • revision_no
  • effective_at
  • line_state
  • authorized_quantity
  • reported_reason_code
  • corrects_revision_id

Append-only lifecycle. Cancellations, reopens, quantity changes, reason changes and corrections are all revisions, so no earlier state is ever lost. A recorded closure is an administrative act and never disposes of material.

dim_reason_code
  • reason_code
  • category
  • definition

One vocabulary, two independent uses: what the customer reported and what inspection assessed. They are published side by side and never merged.

dim_currency_and_uomdegenerate
  • uom_code
  • recovery_currency_code
  • decimal_scale

Quantities group by unit and money by currency. The settlement currency is declared on the physical action, so monetary completeness has a denominator that a missing money row cannot shrink; an action with no declared currency is an unattributed gap, never an inferred one.

Reverse-flow facts join by authorization-line identity; no row is ever updated in place, so a cancellation, a reopen and a correction all remain readable.

Measures and conservation

Returns & Recovery measures and their aggregation behavior.
MeasureFormulaAdditivityNote
Received quantityΣ signed receipt-event quantity within one unit of measureAdditiveCorrections are signed events, so a miscount is visible rather than edited away.
Material conservationreceived = pending inspection + awaiting disposition + finally dispositionedAdditiveCloses exactly inside each unit. Only the first inspection attempt against a receipt event contributes distinct inspected quantity, so a re-inspection cannot create material.
Settled recovery yieldrestocked quantity / finally dispositioned quantityNon-additiveThe denominator is declared. Unavailable when nothing has settled; the received-basis alternative is published beside it with its pending share.
Partial supported netevidenced proceeds + evidenced restocked value − evidenced processing, transport and disposal costAdditiveWithin one currency, and partial by construction: it nets the money recorded and evidenced, not the money the physical actions produced. Unevidenced components are excluded from the net and reported as excluded, never dropped.
Monetary evidence coverageactions carrying any recorded component / physical actions declaring that currency in the windowNon-additiveThe denominator is the physical population, so deleting a money row lowers the coverage instead of shrinking the population it was measured against. Unavailable when no action declares the currency.
Unresolved lifecycle linescount(line where recorded state is closed or cancelled and pending inspection + awaiting disposition > 0, plus cancellations after receipt)AdditiveRetained in the operational worklist. A closure is administrative and cannot settle a physical position.
Net settled to customerscredits + refunds − charge correctionsAdditiveA customer settlement, within one currency. It is not recovered inventory value and the two are never combined.
Closed-cycle disposition daysnearest-rank percentile over pooled first-receipt to last-terminal-action durationsNon-additiveEligible population is settled closed lines only; unsettled lines are censored and counted, never treated as fast.

The conservation rule is the one that has to hold before any yield means anything: inside a single unit of measure, received quantity equals the quantity still awaiting inspection, plus the quantity inspected and awaiting a disposition, plus the quantity that reached a supported final disposition. Only the first inspection attempt against a receipt event contributes distinct inspected quantity, which is what stops a second or third look at the same units from inflating the ladder. Interim rework and quarantine holds are counted and shown as attempt volume, and deliberately do not enter the identity.

Recovery yield needs its denominator declared, because two defensible ones give very different numbers. The settled basis divides restocked quantity by what has actually reached a final disposition. The received basis divides it by everything received, which is lower by construction while material is still pending — so the pending share is published beside it rather than left for the reader to infer. When nothing has settled, the settled yield is unavailable; it is not reported as zero.

A zero that was measured and a value that is missing are different states throughout. A line that settled with nothing restocked has a recovered quantity of zero. A line with no final disposition yet has no recovered quantity at all, and says so.

Money is measured the same way, and the trap there is the denominator. Counting only the actions that happen to carry a money row makes a missing record invisible: delete an action’s only cost and it leaves the population it was supposed to be measured against, so the figure improves. The settlement currency is therefore declared on the physical action, and the eligible population for a currency is the actions that declare it. What comes out is a partial supported net — evidenced value less evidenced cost — beside the count of eligible actions that recorded no money at all. An action with no declared currency cannot be attributed to either side and is reported as its own gap.

A lifecycle state is a record, not a settlement. Marking a line closed or cancelled is an administrative act and cannot dispose of material, so a line whose recorded state says the case is over while units are still pending inspection or awaiting a disposition stays in the operational worklist as an exception, with the quantity it still holds. A cancellation raised after material had arrived is reported separately from one raised before anything was ever sent back.

Implementation notes

  • Reject duplicate authorization, line, revision, receipt, inspection, action, component and settlement identities, and reject a revision sequence whose numbering disagrees with its effective instants — that is an ambiguous revision, not a tie to break.
  • Compare instants, never date text, and require a capture instant at or after the business instant it records. Give a fact that spans time a capture instant per stage, and derive every population — including reason and investigation joins — from the same cutoff-aware set the detail views read.
  • Attribute a settlement correction to what it corrects: the same authorization, the same allocated line and the same currency, targeting a credit or a refund rather than another correction, issued and captured after it, and never taking back more in total than that document settled.
  • Format exact decimals as strings. Grouping an integer identity through a floating-point number silently rounds anything past the mantissa, and plot geometry needs a checked conversion with an explicit unavailable state rather than a bar drawn to a rounded value.
  • Keep the open worklist on the current as-of and completed cycle-time on the declared start, end and eligible closed population. A line still carrying pending or awaiting quantity is censored out of cycle time and counted, never treated as fast.
  • Keep reported and assessed reason coding in separate fields for the life of the line. Publish agreement and disagreement counts; never overwrite one with the other, and never fold an absent reason into a residual code.
  • Attach an owner to every action, and require an owner, evidence and at least one examined case before anything on the page reads as a preventive finding.
  • Store recovery value and each cost class as separate evidenced components. Exclude unevidenced components from the net and report both the excluded amount and the actions that recorded no cost at all.
  • Do not derive an environmental or revenue-impact claim from a disposition type. Recycling a unit is an action; an emissions statement additionally needs activity data, factors, a declared boundary and an allocation rule, none of which this contract carries.
  • Source availability stays outside this pattern. Which system holds these facts, and whether it holds them at this grain, is an adapter question that needs a named product, version and extraction path before it can be answered.

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.