Sample output from the Inventory Positioning Analysis with Geographic Demand Mapping prompt in the Sonar AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library
SONAR AI · HYBRID ANALYSIS — NETSUITE + US CENSUS GEOCODER

Inventory Positioning Analysis

Where demand lives vs. where stock sits — with co-purchase (basket) analysis, freight-billing analysis, and a full customer address audit · 12 months of US fulfillment history (Jul 2025 – Jun 2026) · Generated 2026-07-28
Contents
  1. Executive Summary
  2. Flow Map
  3. Stocking Recommendations
  4. Basket-Affinity Analysis
  5. Freight Economics
  6. Delivery-Time Impact
  7. Investment & Payback
  8. Seasonality
  9. Address-Book Audit
  10. Methodology & Limitations
  11. Other Factors & Next Steps

1 · Executive Summary

1,461
US fulfillments analyzed (12 mo)
~28M
Excess unit-miles / year
$43,971
Shipping billed to customers (12 mo)
Unknown
True carrier cost — not in NetSuite
2–4 days
Faster delivery, ~600 shipments/yr
$0
Phase-1 capital (transfers only)

The finding in one sentence: the two coasts are fulfilling each other's backyards. Boston ships BOM100 to San Francisco customers (3,500 units/yr across a 2,692-mile gap) while San Francisco ships PCB100L to Newark, NJ (3,410 units/yr) — despite the Queens warehouse sitting 15 miles from that customer.

The economics are a margin story, not an expense story. Shipping charges billed to customers ($43,971/yr) come from a largely flat-rate table (~$31 per shipment appears on wildly different routes), while carrier cost certainly scales with distance and zones. Since shipping revenue is distance-insensitive and carrier cost is distance-sensitive, every needless cross-country mile comes straight out of margin — invisibly, because actual carrier cost is not captured in NetSuite. The fix is the same regardless of the exact magnitude: position stock near demand.

Top three moves:

  1. Transfer the SAF200 6-SKU kit + PR100-A to Denver. All from San Francisco's deep overstock. Zero capital. Serves Park City (355 shipments/yr — the steadiest demand stream in the network) and most of St Louis's basket from 785 mi instead of 1,735.
  2. Stock the PCB100L 4-SKU basket in the Northeast (Queens or NJ) — PCB100L + SMK001 + KAP001 + COP001, which co-ship in 69 of 69 orders. After resolving the §8 lifecycle question (shipments stopped in April).
  3. Audit BOM100 & SBP100S at Boston for transferable excess to San Francisco — the SF-metro cohort is the single most expensive-looking flow (avg $108/shipment billed, 2,692 mi).

2 · Flow Map — Current vs. Recommended

Solid red arcs = wasteful current flows (ship-from → destination). Dashed green = recommended source. Blue squares = warehouses; circles sized by annual units.

San Francisco WH Boston WH Denver WH New Jersey WH Queens WH San Mateo Seattle Newark 3.4K Park City 3.2K Winchester 1.8K St Louis 2.7K Port Richey / St Pete 2.8K SF metro 4.0K Los Angeles Biloxi Springfield Dublin/Cincy Schematic equirectangular projection · circle area ∝ annual units · only flagged flows drawn
Warehouse Demand cluster (annual units) Current flow (wasteful) Recommended flow

3 · Stocking Recommendations

Recommendations are expressed as baskets, not single SKUs (see §4 for why). Investment = ~3 months territory demand at item average cost.

PriorityBasket (anchor + companions)Stock atAnnual demandTransit gainCapitalNotes
PHASE 1PR100-A (+ I360-Impeller, NS-SCCT, NS-SA-EIA-Inv already at Denver)Denver3,194 u / 355 shpts−1 day$0 — transfer ~800 u from SF (7,665 avail)Companion coverage already good. One gap: I360-Assembly (2234) is at zero network-wide — purchasing issue, not positioning.
PHASE 1SAF200 kit: SAF200 + CTL200 + FRM200 + BLD200 + FWH200 + FSP200Denver292 u anchor + kit−2 days$0 — all 6 SKUs transferable from SF depth (BLD200: 4,932; FWH200: 9,385; FSP200: 1,620)Ships as a kit in 28/28 co-orders — move all six or don't move any.
PHASE 1SBP100S + ASY107S (co-ship 35×)San Francisco480 u−4 daysLikely $0 — audit Boston excess firstCOM002S/COM003S companions already at SF (39/120).
PHASE 2PCB100L basket: PCB100L + SMK001 + KAP001 + COP001 (co-ship 69/69 orders)Queens3,410 u anchor−4 days~$110K (4 SKUs; anchor $99K)GATE Resolve April demand-stop (§8) first. Companions currently SF-only (SMK001: 13,680; KAP001: 682; COP001: 9,000) — likely transferable, cutting capital substantially.
PHASE 2BOM100 + COM001/2/3/4 (co-ship 89×)San Francisco3,944 u anchor−4 days$34.7K anchor; companions mostly at SF but COM002 (96) and COM004 (85) are thin — top upHighest billed-freight flow ($108/shipment avg from Boston).
PHASE 2SSP100CTP/CTSM + SSP100P/SM assembliesNew Jersey1,200 u−2 days$13.6KPackaging companions (cartons 7,480 / labels 49,920) already at NJ. But demand is project-spiky (§8) — consider transfer-on-demand instead of stocking.
PHASE 3CTM200 + OPR001/OPR002 (62×)Queens410 u−4 days$38.4K + companionsOPR001/002 at SF (157) and Boston (40), zero at Queens. Service play only.
PHASE 3Gauge family (items 105–122)NJ / Queens~470 u / 8 SKUs−3 days~$82KHigh unit cost, thin volume — weakest case, defer indefinitely.

4 · Basket-Affinity Analysis

For each recommended SKU, 12 months of sales orders were queried for items appearing on the same order (≥3 co-occurrences). The result shapes the recommendations fundamentally: these items are baskets, not loners — and stocking an anchor without its companions converts clean single-origin orders into permanent 2-origin splits.

AnchorShips withOrders togetherCompanion stock at target?Verdict
PCB100LSMK001, KAP001, COP00169 / 69 — alwaysNone at Queens/NJ — all three SF-only4-SKU MOVE Anchor alone would split every order
SAF200CTL200, FRM200, BLD200, FWH200, FSP20028 / 28 — alwaysNone at Denver; all six deep at SF6-SKU KIT Transfer as a set — still $0 capital
BOM100COM001, COM002, COM003, COM00489 — alwaysMostly yes at SF; COM002 (96) & COM004 (85) thinAnchor purchase + top up two companions
CTM200OPR001, OPR00262Zero at Queens (SF 157, Boston 40)3-SKU move if pursued
SBP100SASY107S (35×); COM002S/003S (25×)35COM-S items at SF; ASY107S zero avail at SFInclude ASY107S in the Boston→SF transfer audit
PR100-AI360-Assembly, I360-Impeller, NS-SCCT, NS-SA-EIA-Inv21Impeller (42), NS-SCCT (20), EIA (15) already at DenverBest-prepared target. FLAG I360-Assembly: zero at every warehouse
SSP100CTP/CTSMSSP100P/SM assemblies + cartons/labels10–13Packaging already at NJ (49,920 labels, 7,480 cartons); assemblies notMove assemblies together; packaging solved
Why this matters: the naïve version of this project ("move the top SKU by unit-miles") would have made service worse for PCB100L and SAF200 customers — every order would arrive in two boxes from two coasts. Basket-adjusted, the moves are bigger but honest. Bonus finding: I360-Assembly (item 2234) has zero available at all seven warehouses despite appearing in 21 PR100-A co-orders — an active backorder generator hiding in plain sight, worth a purchasing review regardless of any repositioning.

5 · Freight Economics

What the billing data shows

NetSuite holds 2,408 shipping-charge (ShipItem) lines on the 12 months of fulfillments, totaling $43,971. Regressing per-shipment charge against shipping distance across the flagged routes yields a slope of $0.0044 per mile — statistically flat. Peabody MA, Tempe AZ, Wilmette IL, Buffalo WY — radically different distances, identical $31.00 charge. A handful of outliers exist (SF-metro-from-Boston averages $108.06; San Mateo one-offs at $1,304), but the dominant pattern is a flat-rate table.

The decisive fact

ShipItem charges are what customers are billed, not what carriers charge the business. True carrier cost is not recorded in NetSuite. This has two consequences:

1. A precise "freight savings" number is unknowable from NetSuite data alone. Any modeled figure — whether from public carrier-rate heuristics or from the billing data — measures the wrong thing. Public-rate modeling suggests a magnitude in the $8K–$31K/yr range, but that is an estimate, not a measurement.

2. The margin argument is stronger than the savings argument. Shipping revenue is flat (~$31) regardless of distance, while carrier cost certainly is not. A $31-billed parcel trucked 2,555 miles from SF to Newark almost certainly costs more than $31 to ship; the same parcel from Queens (15 mi) almost certainly costs less. Every wasteful mile is a silent margin transfer to the carrier — invisible in NetSuite precisely because the cost side isn't captured.

What can be said with confidence

Recommended instrumentation (closes the gap permanently)

  1. Start capturing actual carrier cost per fulfillment — a custom transaction body field (e.g. custbody_actual_freight_cost) populated from carrier invoices or a shipping-platform API (ShipStation/EasyPost/carrier webhooks). Even 60 days of data would calibrate this entire analysis.
  2. Alternatively, pull one quarter of carrier invoices (CSV) and match to fulfillments by tracking number/date — a one-time exercise whose matching can be automated.
  3. Then re-run this model with real costs: the ranking of moves will hold, and the dollars will be defensible for budgeting.

6 · Delivery-Time Impact

Ground transit approximated at ~500 mi/day. Improvements by cohort:

Demand cohortShipments/yrCurrent routeEst. daysProposed routeEst. daysΔ
Newark, NJ (PCB100L basket)14SF → NJ (2,555 mi)5Queens → NJ (15 mi)1−4
SF metro (BOM100, SBP100S)~42Boston → SF (2,692 mi)5SF local (<10 mi)1−4
NYC metro (CTM200, SPL001, gauges)~40Boston/SF → NYC2–5Queens local1−1 to −4
Winchester / Nicholasville, KY~25SF → KY (2,067 mi)4–5NJ → KY (567 mi)2−2.5
Park City, UT (PR100-A)355SF → UT (615 mi)2–3Denver → UT (355 mi)1–2−1
St Louis, MO (SAF200 kit + multi)~95SF → MO (1,735 mi)4Denver → MO (785 mi)2−2
FL Gulf Coast (SSP100, BOM100)~36SF/Boston → FL5NJ → FL (966 mi)2–3−2

Roughly 600 shipments/yr improve by 1–4 business days. Split-order reduction (§4) compounds this: fewer, fuller boxes arriving sooner.

7 · Investment & Payback

PhaseScope (basket-complete)CapitalBenefit caseVerdict
PHASE 1Transfers only: PR100-A (~800 u) + SAF200 6-SKU kit → Denver; Boston excess audit for SBP100S/ASY107S/BOM100 → SF~$0 + one-time transfer freight−1 to −4 days on ~490 shipments/yr; split reduction for St Louis; margin leak reduction (unquantified but real)Do now. No inventory risk — stock is already owned, just mispositioned.
PHASE 2PCB100L 4-SKU basket → Queens (gated on §8 lifecycle check); BOM100 + companion top-up → SF; SSP100 assemblies → NJ (or transfer-on-demand)~$60–150K depending on how much is transferable vs. purchased−4 days on the two biggest Eastern flows; removes the largest unit-mile block (~20M)Pilot after Phase 1 + carrier-cost instrumentation (§5) proves the margin case with real numbers.
PHASE 3CTM200 3-SKU basket → Queens; gauge family → NJ/Queens~$120K+Service-level only; thin volumeDefer. Revisit only with carrier-cost data and/or customer SLA pressure.
Carrying-cost framing (the key nuance): capital figures are working capital, not expense; the real cost is carrying (~15–25%/yr). Because total network demand is unchanged, the goal is repositioning — the network should hold roughly the same total units, placed differently. Phase 1 embodies this perfectly: it moves existing overstock (SF holds 7,665 PR100-A against ~3,200/yr total demand) to where the demand actually is, simultaneously fixing overstock and mispositioning.

8 · Seasonality & Demand-Pattern Check

Monthly shipment units for key items, Jul 2025 – Jun 2026. Pattern matters: flat demand justifies permanent stocking; spiky demand suggests project-driven buying that shouldn't drive stocking decisions.

PR100-A FLAT — IDEAL

Park City: 23–32 shipments/mo, all 12 months. Textbook steady demand.
270 · 280 · 270 · 278 · 284 · 256 · 284 · 252 · 284 · 270 · 388 · 218 u/mo

BOM100 GROWING, WINTER-HEAVY

Oct–Dec ~1,000/mo → Jan–Mar ~2,200/mo. Trend up; size the SF position on recent months, not the annual average.
Oct 804 · Nov 1,422 · Dec 986 · Jan 2,368 · Feb 2,130 · Mar 1,998 no Jul–Sep or Apr–Jun activity recorded

PCB100L GATE — APRIL STOP

1,200–2,100 u/mo Oct–Mar, zero after March 2026. Resolve before the $110K basket move: seasonality, lost customer, or product transition?
Oct 1,220 · Nov 1,540 · Dec 1,330 · Jan 1,900 · Feb 1,210 · Mar 2,130 ⚠ zero shipments Apr–Jun 2026 — investigate before buying

SSP100CTP / CTSM SPIKY — PROJECT-DRIVEN

Feb–Apr burst (940 u in March), then quiet. Prefer transfer-on-demand over stocking.
Feb 120 · Mar 940 · Apr 20 (CTP); CTSM similar Feb–Mar only

9 · Address-Book Audit — All 400 US Addresses

Every active US customer address (400 total) was validated: ZIP/state consistency against USPS prefix ranges, format checks, and placeholder detection, supplemented by US Census geocoder spot checks. 93 addresses flagged — a 23% defect rate. No records were modified; this is a findings inventory for review.

SeverityCountIssueExamplesImpact / suggested handling
HIGH15ZIP leading zero lost ("1824", "2816", "8330")Cust 229 Chelmsford MA "1824"→01824 · Cust 391 Tewksbury MA "1876"→01876 · Cust 528 Mays Landing NJ "8330"→08330Breaks carrier label validation & rate lookup. Classic spreadsheet-import artifact concentrated in MA/RI/NJ/CT. Mechanical to fix once approved.
HIGH19ZIP/state contradiction"Seattle, WA 40010" (KY ZIP) · "Dublin, OH 90010" (LA ZIP) · "Pendleton, AK 97801" (that's Pendleton Oregon) · "Las Vegas, NE 45644" (NV intended? OH ZIP)Cannot tell which field is wrong — needs human review per record, ideally against the customer's real location.
MED23State spelled out ("California", "Wisconsin", "Washington DC")Customers 3476–3500 — one contiguous import batchBreaks state-filtered saved searches, reports, and tax logic that expect 2-letter codes. One bad import; batch-normalizable.
MED2Missing ZIP entirelyCust 516, 518 (San Francisco)Undeliverable as-is.
LOW3Placeholder / test data · PO Box"123 Main St, Anywhere CA" · "123 Germany, Austria CA" · PO Box 351321Inactivate test records; confirm PO Box is billing-only.
INFO29Intersection-style addresses ("West 96th and Central Park West")All NYC-metroSome carriers accept these; USPS standardization does not. Fine for now; blocks any future address-automation project.
INFO2Cosmetic (lowercase city; addr1 contains full city/state/zip)"san mateo" · Cust 510 Lakewood NJNormalize whenever touched.
Why it belongs in this report: positioning analysis is only as good as the coordinates, and 23% of the address book can't be reliably geocoded or rate-shopped. The 15 leading-zero ZIPs and the 23 spelled-out states are mechanical, low-risk fixes when the business is ready to approve them; the 19 ZIP/state contradictions need a human eye. Until then, treat any per-customer distance/zone calculation involving flagged records as suspect.

10 · Methodology & Limitations

Data pipeline

  1. NetSuite (SuiteQL): 1,461 US item fulfillments (type ItemShip, Jul 2025–Jun 2026) joined to transactionshippingaddress + transactionline for item, quantity, and actual ship-from location; inventoryitemlocations for availability; item records for cost/weight; sales-order line co-occurrence for basket affinity; ShipItem lines for billed freight; full customeraddressbook for the audit.
  2. External (US Census Bureau Geocoding API): warehouse and top ship-to addresses geocoded to lat/long; city-centroid coordinates for smaller cohorts.
  3. Computation: haversine distance from each ship-to to every warehouse; excess miles = (distance from actual ship-from) − (distance from nearest warehouse); flows >100 excess miles flagged and ranked by excess unit-miles; linear regression of billed freight vs. distance; USPS ZIP-prefix rule validation.

Limitations — read before acting

11 · Other Factors & Suggested Next Steps

Recommended sequence: (1) Phase-1 transfers — zero capital, immediate service gains; (2) start capturing carrier cost; (3) resolve the PCB100L lifecycle question; (4) revisit Phase 2 in a quarter with real cost data and a proven Phase-1 result.