—
Rank SKU by Class
Every classification in the brand. Shows the rank SKU(s) set for each class — or flags classes that don't have one assigned yet.
Filter:
Rank SKUs are today's featured SKU per portfolio. Sales/Day now populated from SPD (L7) — the default period across the app. Plan & Pace columns (Projections / Ratios / DoS) populate once those segments are built.
NB = Hoffman (New Brunswick).
Still in Production = ordered − received − inbound expected (at factory). On Water = inbound expected qty.
🚚 FBA Shipments — Live
Inbound shipments from Amazon SP-API filtered to brand SKUs. Default view reads a snapshot refreshed every 2 hours automatically. Use the "Fetch live now" button if you need real-time data.
📦 FBA Shipment
Decide what goes in the next shipment. Suggested = action-ready candidates. Queued = locked-in items pending shipment creation.
No items selected.
SPD = sales per day (units ÷ days in period). At rollup levels, SPD = sum of SKU SPDs — answers "how fast is this classification/portfolio moving inventory."
Default period = L7 (labeled everywhere). Hover column headers for exact date ranges.
📌 What these numbers mean: Projection quantity shown per month represents the projected sales units per day at the class level.
Example: If May shows 50 units for a single class, and May is a 31-day month, then the projected sales units for that class for May is a total of 1,550 units (50 × 31 = 1,550).
Edit inline (click any month cell) OR bulk upload via Excel. Both paths write to Hub's
tbl_projections via new-batch merge. Current month column is highlighted.
▶ 📌 What these numbers mean — ratios distribute class-level projections to SKUs · click to expand
Step 1 — class projection: Projection cells per month represent units per day at the class level.
If May shows 50 units for a single class and May is a 31-day month, the projected sales for that class in May = 1,550 units (50 × 31 = 1,550).
Step 2 — ratios distribute the class total to SKU level: Each SKU has a ratio (a fraction of its class) so we can project each SKU's expected demand.
Worked example (SKU level):
Say the class above has a SKU with a ratio of 0.10 (= 10%) — meaning this SKU is projected to capture 10% of the class's sales.
• Projected monthly units for this SKU = 1,550 × 0.10 = 155 units
• Projected daily SPD for this SKU = 50 × 0.10 = 5 units/day
• Sanity check: 155 ÷ 31 = 5/day ✓
Within a single class, all SKU ratios should sum to 1.00 (= 100%). The classification rollup view on this tab flags any class where the sum drifts away from that.
Say the class above has a SKU with a ratio of 0.10 (= 10%) — meaning this SKU is projected to capture 10% of the class's sales.
• Projected monthly units for this SKU = 1,550 × 0.10 = 155 units
• Projected daily SPD for this SKU = 50 × 0.10 = 5 units/day
• Sanity check: 155 ÷ 31 = 5/day ✓
Within a single class, all SKU ratios should sum to 1.00 (= 100%). The classification rollup view on this tab flags any class where the sum drifts away from that.
Read-only mirror of Inventory Hub's active
tbl_ratios batch. Each SKU's ratio = its share of its classification. Rollup shows ratio sum — should be ~1.0 when fully loaded.
Target cover = 60 days (fulfillable + inbound combined). Units to send = how many to ship to FBA to hit 60d. Excess = how many above 60d (candidates to slow down / hold).
Rows color-coded by health bucket. Default period = L7 — swap above to re-score.
📦 Case Pack
Per-SKU case-pack quantities. A SKU can have multiple case-pack qtys —
add one row per qty in the template (e.g. one row for 12-pack cartons
and another row for 24-pack cartons of the same SKU).
Upload replaces all case-pack rows for this brand.
Showing every case-pack qty currently saved for this brand. A SKU with multiple qtys appears multiple times.
Source:
eddie_v2_deals.vw_deals — portfolio-keyed.
Each classification / SKU under a portfolio inherits the portfolio's active deal.
Segments
Each inventory segment is built end-to-end before moving to the next. Order is flexible.
Agent Call-Outs (goals)
What the agent should surface once the segments above are populated.
Ground Rules
- Target stock at FBA: 60 days cover (fulfillable + inbound combined).
- Production orders are placed at the classification level.
- NB = Hoffman (New Brunswick).
- Default SPD period = L7. Labeled everywhere — change the one constant in the backend to swap to L14/L30.
- Rollup SPD at classification/portfolio = sum of SKU SPDs.
- Phase 1 = Reebok only, via
vw_netsuite_portfolio_or_class_contains_brand_name_custom_mapping. - Sales source:
eddie_v2_sales.vw_sales_spd_by_child_asin_all_periods. - Production source:
eddie_v2_inventory.vw_inbound_shipments_production_data_merged_kelsey_erika. - Rank SKU source:
eddie_v2_x_custom_mcp_read_only_rank_sku.vw_g_sheet_amazon_ads_reporting_portfolio_hlink_rank_sku_parsed. - Inventory source:
eddie_v2_inventory.vw_netsuite_and_fba_inventory_by_child_asin. - Season is user-maintained in Firestore (
agent_inventory_seasons). - Images via
/api/image?asin=…, cached in Firestore (agent_inventory_asin_images). Click any image/ASIN to open Amazon.
Archive · what the Brand tab used to show
Preserved so you can see the previous Brand-tab layout if you need to reference any of the historic tiles or call-out goals. The live Brand tab now shows only the two action-headline tiles.
Full brand snapshot
Agent Call-Outs (goals)
What the agent will surface once the pending segments (Projections, Ratios, Days of Stock) are populated. This card will be redesigned.
🛠 Brand Enable / Disable
Flip a brand on to make its data appear throughout the app (Item Catalog, Sales, Inventory, Call-Outs, etc.).
Flip it off to hide it everywhere — handy when prepping a brand (projections, ratios, etc.) before exposing it.
Changes take effect within ~15 seconds. Enabling a brand kicks a snapshot refresh in the background.
Loading brands…
🔍 Data-Source ↔ Brand-Classification Gaps
Each source data feed (Rank-SKU sheet, Inventory view, Sales view) is joined against BRAND_MAP_VIEW to find which brand each ASIN belongs to.
Rows that don't match get silently dropped by inner joins.
This panel catches that — anything in the "Unmatched" column = ASINs sitting in a source feed that the app cannot show because BRAND_MAP_VIEW doesn't classify them.
Loading gaps…
📋 Catalog Admin — Classification Active / Inactive
Toggle classifications off when they're retired or no longer being tracked.
Inactive classifications are dropped at the data layer and do not flow through any tab — they disappear from Item Catalog, Inventory, Sales, Production, Call-Outs, etc.
Default behavior: any classification that hasn't been touched here is treated as ACTIVE. You only need to flip ones OFF. Changes take effect immediately (cache is flushed on save).
Default behavior: any classification that hasn't been touched here is treated as ACTIVE. You only need to flip ones OFF. Changes take effect immediately (cache is flushed on save).
Bulk Excel:
⬇ Download template
Multi-brand. Full-replace per-brand: blank Active = active; only "No"/"FALSE"/"0" marks inactive.
Pick a brand to load classifications…
🔄 Force Refresh — FBA + Warehouse data sources
Trigger an off-cadence refresh of the upstream feeds that power
vw_netsuite_and_fba_inventory_by_child_asin. Use these when you need fresh numbers RIGHT NOW (e.g. after a big shipment receive at the warehouse, or to validate an FBA inventory change in Seller Central). NetSuite catalog sync is NOT included — it has its own daily cadence and shouldn't need manual triggers.
FBA Main Inventory (fulfillable + inbound)
Normal cadence: 6 AM ET daily. Feeds
tbl_amazon_fba_main_inventory_pull_daily.Flow: Synchronous — one click does the whole pull. Takes ~10s.
FBA Reserved (customer orders + FC transfers/processing)
Normal cadence: 4 AM ET daily. Feeds
tbl_fba_reserved_inventory_report.
Flow: 2-step async. Request asks Amazon to generate a report. Collect polls Amazon ~5min later to download it. Both happen automatically on a single click; the buttons below let you force each step manually.
Warehouse On-Hand (NB/Sprint/HOLD/West End/Hillside)
Normal cadence: 5 AM ET daily. Feeds
celigo-netsuite-api.celigo_netsuite.OH_by_Location.Flow: Synchronous — one click does the whole NetSuite saved-search pull. Can take 1-3 min.
Each refresh kicks the puller Cloud Run service in the background. Source tables update when the puller completes — pull cycles typically finish within 1-5 minutes. After a successful puller, the inventory-cascade refresh fires automatically (another ~3 min) so Send-to-FBA, Ledger and Lost Business numbers stay in sync without you having to wait for the nightly 6 AM ET cascade run.
What's needed before flipping a new brand live
- BRAND_MAP_VIEW classification — Brand must already appear in
vw_netsuite_portfolio_or_class_contains_brand_name_custom_mapping. Without it, no SKUs surface. - Projections populated in
tbl_projections— drives over/under-sell flags + DoS math. - Ratios populated in
tbl_ratios— drives Projection Ratios tab + Ratio Drift call-outs. - Rank SKUs set in the source Google Sheet — without these, every classification shows "⚠️ No Rank SKU set".
- Case Packs (optional but recommended) — uploaded via the Case Pack tab; without them, Send-units suggestions don't round to a case-pack qty.
- Item-Status-Basics entries — Season/Status/Demand Planner/Replen come from the item-status-basics tool. Already global; nothing to do unless you want this brand's items annotated.
- FBA Shipments puller — the Cloud Run Job currently runs with
BRAND=Reebok. To pull a second brand's shipments, add a second Cloud Scheduler hitting/pull?brand=<Name>.