The Speculator columns are incomplete — [[ incomplete.failed.length ]] of [[ incomplete.expected ]] products could not be computed.
Stock and Shipping are built here and are unaffected, but Days Left (Spec), Ship In, Ship Qty, Order In and Order Until are blank for: [[ incomplete.failed.map(f => f.name).slice(0, 6).join(', ') ]] and [[ incomplete.failed.length - 6 ]] more.
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 ]]
| Product | In Production | Stock in China | Shipping → FBA |
Shipping → AWD into AWD · US live |
Stock FBA |
Stock AWD not sellable yet |
Sales
[[ m.label ]]
[[ salesSubtitle ]]
|
Days Left
Spec
[[ d ]]d
stock only
+shipments
[[ daysLeftSpec ? 'forecast' : 'avg over ' + velocityDays + 'd' ]]
|
Shipment ETA | Ship In | Ship Qty |
Order In
once per product
|
Order Until
to last until [[ fmtDate(until) ]]
pick a date above
|
Amazon on date
+ shipping
+ AWD
[[ onDateSub ]]
pick "Stock on" above
|
Reachable on date
+ship +China
+production
pipeline split by sales share
|
|||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| [[ famGroup.familyName ]] | ||||||||||||||||||||||||||||||||||||||
| [[ famGroup.familyName ]] | ||||||||||||||||||||||||||||||||||||||
| [[ p.short_name ]] ([[ p.single_market ]]) |
In Production:
[[ d.qty ]]
@ [[ d.manuf ]]
([[ d.po ]])
Approx ready: [[ d.ready || 'TBD' ]] |
[[ p.shipping_amazon ]]
Shipments In Transit:
[[ d.qty ]]
units via
[[ d.shipment_id ]]
( [[ d.status ]] )
[[ d.source ]] → [[ d.dest ]] |
[[ awdShipSum(p) || '—' ]]
Units on their way into Amazon Warehousing & Distribution. Not at Amazon yet and not in the projection — AWD feeds FBA, it does not sell. Every market summed — type the EU, UK and AU figures in on the market rows below. |
[[ p.amazon_stock ]]
Stock Breakdown:Available: [[ p.stock_bd.avail ]] FC Processing: [[ p.stock_bd.proc ]] FC Transfer (reserved): [[ p.stock_bd.resv ]] |
[[ awdStockSum(p) || '—' ]]
Sitting in Amazon Warehousing & Distribution, or in a warehouse typed in by hand. Reachable, but not sellable until it is distributed into FBA (about 10 days). Days Left and Ship Qty count FBA stock only. The toggles under Amazon on date are where this figure counts. |
[[ salesValue(p) ]]
[[ salesModeLabel ]] Avg SalesDaily [[ p.sales_daily ]] · Weekly [[ p.sales_weekly ]] · Monthly [[ p.sales_monthly ]] Daily = units ÷ days with data over the last [[ velocityDays ]] days; weekly ×7, monthly ×30. Days Left uses the same daily figure. |
[[ daysLeft(p) === 0 ? 'now' : daysLeft(p) ]] |
-
Overdue
[[ p.shipment_eta ]]d
Incoming Shipments:
[[ e.shipment_id ]]
Shipped: [[ e.shipped_date ]] ETA: [[ e.eta ]] (avg [[ e.avg_lead ]]d) |
[[ urgentSpec(p).days ]]d ([[ urgentSpec(p).bucket ]]) - | [[ urgentSpec(p) && urgentSpec(p).qty != null ? urgentSpec(p).qty : '-' ]] |
Next PO · [[ orderPop(p) ? orderPop(p).code : '' ]][[ fmtDate((orderPop(p) && orderPop(p).a).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) && orderPop(p).a).run_out_after_pipeline ? fmtDate((orderPop(p) && orderPop(p).a).run_out_after_pipeline) : 'beyond a year' ]]. Without the pipeline the PO would be due [[ fmtDate((orderPop(p) && orderPop(p).a).order_by_base) ]]. Nothing in China or in production is left for this market. [[ inDays(urgentOrder(p).days) ]] · [[ urgentOrder(p).bucket ]]
covered ✓
-
|
covered ✓
lands [[ fmtDate(untilSummary(p).first_landing) ]]
after the date
[[ fmtNum(untilSummary(p).qty) ]]
-
|
[[ stockOn && stockOnSum(p) ? fmtNum(amazonOn(stockOnSum(p))) : '-' ]]
At Amazon by [[ fmtDate(stockOn) ]]
Counted regardless of ETA: what could be at Amazon by then, not what will have landed. |
[[ stockOn && stockOnSum(p) ? fmtNum(reachable(stockOnSum(p))) : '-' ]]
Reachable by [[ fmtDate(stockOn) ]]
Pipeline counted regardless of its ETA: what could be there, not what will have landed. Date beyond the 1-year forecast; sales subtracted to the horizon only. |
||||||||||||||||||||||||
| [[ mkt.code ]] |
[[ mkt.shipping || '-' ]]
Shipments ([[ mkt.code ]]):
[[ d.qty ]]
units via
[[ d.shipment_id ]]
( [[ d.status ]] )
[[ d.source ]] → [[ d.dest ]] |
[[ awdShipFor(p.id, mkt.code) || '—' ]] dates [[ awdShipFor(p.id, mkt.code) || '—' ]] |
[[ mkt.stock || '-' ]]
Stock Breakdown ([[ mkt.code ]]):Available: [[ mkt.stock_bd.avail ]] FC Processing: [[ mkt.stock_bd.proc ]] FC Transfer (reserved): [[ mkt.stock_bd.resv ]] |
[[ awdStockFor(p.id, mkt.code) || '—' ]] [[ awdStockFor(p.id, mkt.code) || '—' ]] | [[ salesValue(mkt) || '-' ]] | [[ daysLeft(p, mkt) === 0 ? 'now' : daysLeft(p, mkt) ]] |
-
Overdue
[[ mkt.shipment_eta ]]d
Incoming Shipments ([[ mkt.code ]]):
[[ e.shipment_id ]]
Shipped: [[ e.shipped_date ]] ETA: [[ e.eta ]] (avg [[ e.avg_lead ]]d) |
[[ shipInDays(p.id, mkt.code) ]]d - | [[ specFor(p.id, mkt.code) && specFor(p.id, mkt.code).qty_to_ship != null ? specFor(p.id, mkt.code).qty_to_ship : '-' ]] |
Next PO · [[ mkt.code ]][[ fmtDate((specFor(p.id, mkt.code)).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 [[ (specFor(p.id, mkt.code)).run_out_after_pipeline ? fmtDate((specFor(p.id, mkt.code)).run_out_after_pipeline) : 'beyond a year' ]]. Without the pipeline the PO would be due [[ fmtDate((specFor(p.id, mkt.code)).order_by_base) ]]. Nothing in China or in production is left for this market. [[ inDays(orderInDays(p.id, mkt.code)) ]]
↑ [[ urgentOrder(p).bucket ]]
covered ✓
-
|
lands [[ fmtDate(untilFor(p.id, mkt.code).arrival) ]]
after the date
covered ✓
[[ fmtNum(untilFor(p.id, mkt.code).qty) ]] / [[ untilFor(p.id, mkt.code).cartons ]] ctn +[[ specFor(p.id, mkt.code).buffer_pct ]]%
Lands [[ fmtDate(untilFor(p.id, mkt.code).arrival) ]] — the order-by date has passed, so this is the earliest an order placed today can land Covers [[ untilFor(p.id, mkt.code).covered_days ]] days through [[ fmtDate(until) ]] Same figure as the Speculator Overview: forecast from landing to that date minus projected stock on landing, plus this market's buffer, rounded to cartons. |
[[ stockOn && stockOnFor(p.id, mkt.code) ? fmtNum(amazonOn(stockOnFor(p.id, mkt.code))) : '-' ]] |
[[ stockOn && stockOnFor(p.id, mkt.code) ? fmtNum(reachable(stockOnFor(p.id, mkt.code))) : '-' ]]
Reachable by [[ fmtDate(stockOn) ]] · [[ mkt.code ]]
China stock and production are split across this product's markets by their share of 90-day units. |
|||||||||||||||||||||||||
| Loading... | ||||||||||||||||||||||||||||||||||||||
[[ shipModal.bucket ]] [[ shipModal.p.short_name ]] — [[ shipModal.mode === 'to_fba' ? 'move to FBA' : 'shipping into AWD' ]]
[[ shipModal.error ]]
How many units went on from the [[ shipModal.bucket ]] warehouse to FBA? The FBA shipment then comes in from Amazon's own sync, so nothing is counted twice.
Loading…
Units count at FBA on created + [[ shipModal.data.ocean_lead ]] days (this route's lead) + [[ shipModal.data.lead_days ]] days (a distribution from AWD). Past that and still not delivered: they count as landing in a few days, marked late.
| Shipment | Created | On the way | Counts at FBA | Delivered | |
|---|---|---|---|---|---|
| [[ fmtShort(s.lands) ]] · late [[ s.late_days ]]d |
|
✕ | |||
| No date — typed before shipments had dates | [[ shipModal.data.undated ]] | [[ fmtShort(shipModal.data.undated_lands) ]] (from today) |
|
||
Nothing on its way into the warehouse.
[[ shipModal.data.undated ? 'Add a shipment, or give the undated units a date' : 'Add a shipment' ]]
From Amazon (AWD API)
| Shipment | Status | Created | On the way | Counts at FBA |
|---|---|---|---|---|
| [[ s.name ]] | [[ s.status ]] | [[ fmtShort(s.created_date) ]] | [[ fmtNum(s.units) ]] | [[ fmtShort(s.lands) ]] · late [[ s.late_days ]]d |