NS sales order — Path 1 · fulfill from inventory

SO entry → classify line as inventory → reserve → pick + pack + stage → Item Fulfillment → ★ Finance alert (STUB) → CustInvc → CustPymt → close

The simplest of the three paths. Items already on hand at the fulfillment location — no production, no PO. The team reserves qty against the SO, warehouse picks/packs/stages, Item Fulfillment is created carrying createdfrom = so.id, and the customer PO# (otherrefnum on the SO) threads forward to the Item Fulfillment and the Customer Invoice via NS standard linkage. Workflow sub-contract: so_lifecycle_inventory_path (dispatched from sales_order_lifecycle master).

PATH 1 REAL otherrefnum threads SO → IF → Invoice ★ Finance alert pending NS automation

Pipeline — Path 1 deep view (field-level)

idle
Path 1 inventory — deep field-level view with customer PO# threading 01 / Email intake 02 / SO entry · capture otherrefnum = customer PO# 03 / Inventory check + reserve 04 / Pick · pack · stage 05 / Item Fulfillment created (createdfrom + otherrefnum) 06 / ★ Finance alert (STUB) 07 / Invoice · payment · close EMAIL INTAKE — orders@globalfoodsolutions.co / danielle@globalfoodsolutions.co SAMPLE customer: Driscoll Foods (NS customer #2147) customer PO# in body: "PO# 72622" STATUS: REAL customer email intake orders@ / danielle@ body carries customer PO# (e.g. "72622") EXTERNAL · INTAKE i SALES ORDER (NS SalesOrd) — captures customer PO# as otherrefnum. NS RECORD: SalesOrd FIELDS WRITTEN bodyFields.tranid = "1217" (NS-assigned SO number) bodyFields.otherrefnum = "72622" (customer PO#) bodyFields.entity = 2147 (customer_id) bodyFields.total = 18420.00 bodyFields.trandate = 2026-05-26 D1 TABLES write: transactions (SalesOrd) · so_lines sync: hot-tier 2min STATUS: REAL Sales Order created in NetSuite bodyFields.otherrefnum = "72622" · tranid = "1217" entity = 2147 (Driscoll) · total = $18,420 D1 mirror: transactions + so_lines (2-min sync) BACKEND · NS SalesOrd · THREAD START i CLASSIFY LINE — operator classifies so_line as inventory_item. LOGIC items.itemtype = "InvtPart" AND items.dropship = false ACTION dispatch to so_lifecycle_inventory_path sub-contract STATUS: REAL (operator) · STUB (auto-classify) classify line · itemtype = InvtPart dropship = false · on-hand > 0 dispatch so_lifecycle_inventory_path SECURITY · classifier · sub-contract dispatch i INVENTORY CHECK — verify quantity available. TABLES READ inventory_balance.quantityavailable >= so_line.qty items.cost (for landed cost) SAMPLE item_code "DRC-MILK-2PCT" qty_avail = 320, so_qty = 240 → OK STATUS: REAL inventory check inventory_balance.quantityavailable ≥ so_line.qty per location_id DATABASE · inventory_balance i RESERVE QTY — debit reserved_qty against SO. SQL UPDATE inventory_balance SET reserved_qty = reserved_qty + so_line.qty WHERE item_code = ? AND location_id = ? STATUS: REAL reserve qty against SO inventory_balance.reserved_qty += qty per item_code + location_id DATABASE · reserved_qty i GENERATE PICK LIST — per zone. SURFACE: warehouse pick form STATUS: REAL generate pick list per warehouse zone BACKEND · pick form i PHYSICAL PICK + SCAN — warehouse staff. STATUS: REAL physical pick + scan item_code + qty per line BACKEND · warehouse i PACK + LABEL + PALLETIZE. STATUS: REAL pack · label · palletize shrink wrap + BOL BACKEND · warehouse i STAGE FOR CARRIER. STATUS: REAL stage for carrier dock door assignment BACKEND · staging i ITEM FULFILLMENT CREATED — carries createdfrom + inherits otherrefnum from SO. NS RECORD: ItemShip (item_fulfillments) FIELDS WRITTEN bodyFields.createdfrom = 1217 (NS internal id of the SO) bodyFields.otherrefnum = "72622" (inherits from SO via NS std linkage) bodyFields.status = "Shipped" bodyFields.shipped_at = datetime('now') D1 WRITES INSERT item_fulfillments UPDATE inventory_balance SET quantityavailable -= qty STATUS: REAL Item Fulfillment created createdfrom = 1217 (SO id) · otherrefnum = "72622" (threads from SO) BACKEND · item_fulfillments · PO# THREAD → i ★ FINANCE ALERT (STUB) — fires on Item Fulfillment status='Shipped'. EVENT INSERT events (event_type='so.finance_alert_fired',entity_type='item_fulfillment') NS WORKFLOW pending deploy next round (Mike to build) STATUS: STUB (event fires now; NS workflow build pending) ★ automation alert → Finance fires events.so.finance_alert_fired · STUB until NS workflow deploys FINANCE · ★ KEY HANDOFF i CUSTOMER INVOICE (NS CustInvc) — carries customer PO# via otherrefnum. NS RECORD: CustInvc FIELDS WRITTEN bodyFields.tranid = "INV-9981" bodyFields.otherrefnum = "72622" (threaded from SO) bodyFields.createdfrom = 1217 (SO id) bodyFields.total = 18420.00 bodyFields.terms = "Net 30" D1 WRITES INSERT customer_invoices · invoice_lines · v_customer_ar_aging recompute STATUS: REAL Customer Invoice posted otherrefnum = "72622" createdfrom = 1217 (SO id) total = $18,420 · Net 30 D1: customer_invoices + invoice_lines BACKEND · CustInvc · PO# THREAD i MONITOR PAYMENT TERMS — track aging. VIEW: v_customer_ar_aging BUCKETS: current / 30 / 60 / 90+ STATUS: REAL monitor terms v_customer_ar_aging bucket = current due_date = 2026-06-25 DATABASE · AR aging i PAST DUE → DUNNING (loopback). WORKFLOW: ar_aging_action_plan HITL: dunning email send STATUS: REAL workflow · HITL send past due → dunning ar_aging_action_plan 30 / 60 / 90+ buckets loopback until paid SECURITY · HITL email i PAYMENT APPLIED (NS CustPymt). NS RECORD: CustPymt FIELDS bodyFields.appliedto = "INV-9981" bodyFields.amount = 18420.00 D1 WRITES customer_payments + payment_applications STATUS: REAL Customer Payment applied appliedto = "INV-9981" amount = $18,420 payment_applications row DATABASE · CustPymt i SO CLOSED. SQL: UPDATE transactions SET status='Closed' WHERE id=1217 EVENT: order.closed STATUS: REAL SO → Closed status = 'Closed' event: order.closed BACKEND · close i loop: 30 / 60 / 90+ days until paid LEGEND Path 1 inventory lanes ★ Finance handoff (STUB) HITL / dunning

NS records created / updated · field-level detail

StepNS recordFieldSample valueStatus
2SalesOrdbodyFields.tranid"1217"REAL
2SalesOrdbodyFields.otherrefnum — customer PO# (thread start)"72622"REAL
2SalesOrdbodyFields.entity2147REAL
2SalesOrdbodyFields.total18420.00REAL
4–5(none)inventory_balance.reserved_qty += qtyD1 UPDATEREAL
10ItemShipbodyFields.createdfrom1217 (SO id)REAL
10ItemShipbodyFields.otherrefnum — inherits from SO"72622"REAL
10ItemShipbodyFields.status"Shipped"REAL
11(event)events.event_type"so.finance_alert_fired"STUB (NS workflow pending)
12CustInvcbodyFields.otherrefnum — threads from SO"72622"REAL
12CustInvcbodyFields.createdfrom1217 (SO id)REAL
15CustPymtbodyFields.appliedto"INV-9981"REAL
16SalesOrdbodyFields.status"Closed"REAL

Customer PO# threading on Path 1

The customer PO# ("72622" in the running example) is threaded by:

Single-grep recipe: grep "72622" across transactions.otherrefnum + item_fulfillments.otherrefnum + customer_invoices.otherrefnum lights up every record in this SO chain.

Sub-contract structured detail

CTR so_lifecycle_inventory_path · risk 2 REAL

Sub-contract dispatched from sales_order_lifecycle master when an so_line classifies as inventory_item. Single SO can dispatch multiple sub-contracts if lines differ in type.
Fan-out targets
reserve · pick · pack · item_fulfillment · finance_invoice_review · invoice_customer · payment_apply · close_so
Tables touched
inventory_balance · item_fulfillments · customer_invoices · invoice_lines · customer_payments · payment_applications · transactions · events
Threading invariant
CustInvc.otherrefnum == SO.otherrefnum (warn in verify_checks)