Ship Qty is shown without the order buffer.
The database is missing [[ incomplete.schema_missing.join(', ') ]].
Run python -m app.schema_patches on the server, then reload.
[[ incomplete.buffers_error ]]
This table is incomplete — [[ incomplete.failed.length ]] of [[ incomplete.expected ]] products could not be computed.
Missing: [[ incomplete.failed.map(f => f.name).slice(0, 6).join(', ') ]] and [[ incomplete.failed.length - 6 ]] more. Their stock, shipments and quantities are not in any figure on this page.
The database is missing [[ incomplete.schema_missing.join(', ') ]].
Run python -m app.schema_patches on the server, then reload.
First error: [[ incomplete.failed[0].error ]]
Stock as of [[ fmtDateTime(freshness.stock_as_of) ]] · sales through [[ fmtDate(freshness.sales_through) ]] · forecasts computed [[ fmtDateTime(freshness.forecasts_at) ]] · sales are [[ staleDays ]] days behind — treat the red rows with care
| Status |
Stock at Amazon
at Amazon now + in AWD
|
Shipping to Amazon
in transit + into AWD
|
Days Left
[[ m.label ]]
stock only
+shipments
▲▼ last 14d vs 90d
|
Ship By | Ship Qty | Order By |
Qty to Order
to last until [[ fmtDate(until) ]]
pick a date above
|
Buffer
% extra per market
|
||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| [[ famGroup.familyName ]] | ||||||||||||||||||||||||||||
| [[ p.short_name ]] ([[ p.single_bucket ]]) B2B | [[ p.single_bucket ? fmtNum(p.sum.stock) : '' ]] +[[ fmtNum(p.all_buckets[0].stock_awd) ]] | [[ p.single_bucket ? fmtNum(shipOf(p.all_buckets[0])) : '' ]] +[[ fmtNum(shipAwdOf(p.all_buckets[0])) ]] |
[[ daysLeft(p.all_buckets[0]) <= 0 ? 'now' : daysLeft(p.all_buckets[0]) + 'd' ]]
1y+
!
Late shipment · [[ p.all_buckets[0].code ]]This figure counts stock from a shipment that has not shown up. It is assumed to land in 3 days.
Stock only: [[ daysLeftText(daysLeftFor(p.all_buckets[0], 'stock')) ]]. |
[[ dayCount(p.sum.ship_in) ]] [[ fmtDate(p.sum.ship_by) ]]
-
|
[[ p.sum.qty_to_ship != null ? fmtNum(p.sum.qty_to_ship) : '-' ]] |
Next PO · [[ orderPop(p) ? orderPop(p).code : '' ]][[ fmtDate((orderPop(p)).order_by) ]] — the first shipment the pipeline cannot cover must be produced by then No new PO within a year — the pipeline covers the forecast No run-out within a year Ships from the pipeline first (earliest deadline takes it):
Stock then lasts until [[ (orderPop(p)).run_out_after_pipeline ? fmtDate((orderPop(p)).run_out_after_pipeline) : 'beyond a year' ]]. Without the pipeline the PO would be due [[ fmtDate((orderPop(p)).order_by_base) ]]. Nothing in China or in production is left for this market. [[ fmtDate(p.sum.order_by) ]]
covered ✓
-
|
covered ✓
lands [[ fmtDate(p.sum.until_first_landing) ]]
after the date
[[ fmtNum(p.sum.until_qty) ]]
-
Pipeline — [[ p.short_name ]]
"To order" already counts what is at Amazon and shipping; China stock and production are not committed to a market, so they are shown for you to net off. |
per market ↓ | ||||||||||||||||||||
| [[ b.code ]] | [[ fmtNum(b.stock) ]] +[[ fmtNum(b.stock_awd) ]] | [[ fmtNum(shipOf(b)) ]] +[[ fmtNum(shipAwdOf(b)) ]] |
[[ daysLeft(b) <= 0 ? 'now' : daysLeft(b) + 'd' ]]
1y+
!
Late shipment · [[ b.code ]]This figure counts stock from a shipment that has not shown up. It is assumed to land in 3 days.
Stock only: [[ daysLeftText(daysLeftFor(b, 'stock')) ]]. |
[[ dayCount(b.ship_in) ]] [[ fmtDate(b.ship_by) ]] - |
[[ b.qty_to_ship != null ? fmtNum(b.qty_to_ship) : '-' ]] / [[ b.cartons ]] ctn +[[ b.buffer_pct ]]% |
Next PO · [[ b.code ]][[ fmtDate((b).order_by) ]] — the first shipment the pipeline cannot cover must be produced by then No new PO within a year — the pipeline covers the forecast No run-out within a year Ships from the pipeline first (earliest deadline takes it):
Stock then lasts until [[ (b).run_out_after_pipeline ? fmtDate((b).run_out_after_pipeline) : 'beyond a year' ]]. Without the pipeline the PO would be due [[ fmtDate((b).order_by_base) ]]. Nothing in China or in production is left for this market. [[ fmtDate(b.order_by) ]]
↑ [[ p.sum.order_bucket ]]
covered ✓
-
|
lands [[ fmtDate(b.until.arrival) ]]
after the date
covered ✓
[[ fmtNum(b.until.qty) ]] / [[ b.until.cartons ]] ctn
Pipeline — [[ p.short_name ]] · [[ b.code ]]
Lands [[ fmtDate(b.until.arrival) ]] — the order-by date has passed, so this is the earliest an order placed today can land ([[ p.mfg_lead ]]d production + [[ b.ocean_lead ]]d ocean) Covers [[ b.until.covered_days ]] days through [[ fmtDate(until) ]] (capped at the 1-year horizon) Base [[ fmtNum(b.until.qty_base) ]] + [[ b.buffer_pct ]]% buffer for this market. Forecast from landing to that date, minus the stock projected to still be there on landing. Rounded up to cartons. |
|||||||||||||||||||||
| Loading… the first load computes every forecast (about a minute); later loads are cached. | ||||||||||||||||||||||||||||
| No products for this filter. | ||||||||||||||||||||||||||||
Ship By, Order By, Ship Qty and Days Left (Spec) come from the Speculator's seasonal forecast per product and market (same numbers as the product's page). Days Left switches between that forecast and a flat 14/30/90-day average, and between today's stock alone and stock plus open shipments on their ETA. The trend (▲▼) compares the last 14 days with the 90-day average; neither yet excludes out-of-stock days, so a recent stockout reads as a drop in demand — hover for the two rates. Colours: red overdue / under 20 days, amber within 14 days / 20–40 days of cover, green otherwise.