maiven gateway · online··
manifest · 1d ago
Sign in
Back to catalog
MAIVENmodelmetrics

metric_inventory_turnover

beta
metric table

Average inventory turns, days of cover, and site utilization by site, temp class, and segment.

Definition

Inventory velocity rolled up from the per-lot `mart_inventory_health` to (inv_month × site × temp_class × client_segment). `inv_month` is `toStartOfMonth(received_date)`. `turnover_ratio` is the average per-lot turnover (units_out_window / avg_qty_on_hand); `days_of_cover` is the average per-lot days of cover; `utilization_pct` is site utilization (occupied ÷ capacity) joined from `mart_site_performance` at the region-level `site` grain — it is SITE-WIDE, not client-specific. All three are `avg()` measures declared Nullable(Float64) (ClickHouse avg-of-Nullable semantics); `avg()` ignores NULLs, so NULL-velocity (dead / new) lots are skipped by construction — do not zero-fill them. The `site` dimension is REGION-LEVEL. De-identified — no lot_id, no client_id.

Watch out for
  • mediumAveraging avg-of-avg across mixed temp classes

    Frozen / chilled / ambient turnover differs structurally. Slice by `temp_class` first; a single blended average across temp classes is an avg-of-averages that hides the mix.

  • mediumReading utilization as client-specific

    `utilization_pct` is SITE-WIDE (occupied ÷ capacity across all tenants stored at the site), joined at the region level. It is not attributable to one client's stock.

  • lowZero-filling NULL turnover / days_of_cover

    `avg()` ignores NULLs, so lots with no outbound velocity (dead / new stock) are skipped by construction — this is correct. Do not zero-fill NULL turnover / days_of_cover; a NULL means "velocity undefined", not "zero turns".

Questions this answers
  • “What is inventory turnover by temp class this year?”
  • “Which regions carry the most days of cover for frozen stock?”
  • “How does turnover compare across segments?”
Related metrics
  • fulfillment

    Turnover measures how fast stock moves; `fulfillment` measures how well orders ship. Pair to read stock velocity against service level for the same region / segment.

7 of 7
Column
Type
Description
Tests · PII
inv_month
Date
First day of the inventory month (toStartOfMonth of received_date). Grain + sort key.
1 test
site
LowCardinality(String)
Region-level site rollup (= `site_region`) — EU / UK / NA / APAC; `unknown` when unmapped. Dimension + sort key.
1 test
temp_class
LowCardinality(String)
Temperature class — ambient / chilled / frozen; `unknown` when unmapped. Dimension + sort key.
1 test
client_segment
LowCardinality(String)
Owning-client segment — automotive / chemicals / fmcg / fashion / high_tech / life_sciences; `unknown` when unmapped. Dimension + sort key.
1 test
turnover_ratio
Nullable(Float64)
Average per-lot turnover ratio (units_out_window / avg_qty_on_hand) in the bucket. Exposed as the `turnover_ratio` measure (avg). Nullable(Float64) because avg() of a Nullable Decimal returns Nullable(Float64); NULL-velocity lots are skipped by avg() (not zero-filled).
days_of_cover
Nullable(Float64)
Average per-lot days of cover (qty_on_hand / avg daily units out) in the bucket. Exposed as the `days_of_cover` measure (avg). Nullable(Float64) — avg() of a Nullable Decimal; NULL when no outbound velocity.
utilization_pct
Nullable(Float64)
Site utilization (occupied ÷ capacity · 100) joined from `mart_site_performance` at the region-level `site` grain — SITE-WIDE context, not client-specific. Exposed as the `utilization_pct` measure (avg). Nullable(Float64) per §0.3 (avg() returns Nullable(Float64), not Decimal).