BOL / dock receiving

Zoho email templates + attachments replace Monday board updates for Heartland and Quaker dock docs. Paperwork lands in mailbox storage, OCR locks critical fields, then NetSuite writes the item receipt. Fulfill stays held until the ship RESTlet is live.

Contract locked 2026-09-10 No live Saves until prove Sites: Heartland · Quaker

1 The job

Dock and office humans stop updating Monday boards for Heartland/Quaker receiving paperwork. Instead they fire a Zoho email template with the signed BOL and packing list attached. That email is the arrival event. Studio OCR extracts fields; after an agree-lock on critical values, NetSuite creates the item receipt. Fulfillment remains held until shipItemFulfillment is deployed.

Zoho template + attachments Mailbox + Studio copies OCR agree-lock NetSuite Item Receipt Fulfill (held)

Seven steps, dock to NetSuite

1

Human opens Zoho template

Receiving, Shipping, or BOL template — pick the lane that matches the paperwork.

Stage 1 · Human
2

Fill blanks + attach signed docs

Action, Site, PO/SO, BOL#, When ET, Carrier, Trailer, Lots, Temp. Attach signed BOL and packing list.

Stage 1 · Human
3

Send to lane mailbox

receiving@ / shipping@ / bol@ @globalfoodsolutions.co — Zoho keeps the thread searchable forever.

Email = backup storage
4

Bots Mail Bot labels + pings

Labels BOL | Receiving | Shipping. One lane ping with label + action. SMTP Done from matching alias. Slack OFF.

Stage 1b · Bots
5

Studio OCR trio + agree lock

pdf-inspector classifies → digital or scan trio → ≥2/3 agree on critical fields → audit → lock under locks/.

Stage 2 · Hard gate
6

NetSuite Item Receipt

MCP transform PO → Item Receipt. Lots, FS body fields, BOL attach, BOL# in memo. Locs Heartland=4, Quaker=18.

Receive path
7

Fulfill — held

Blocked until shipItemFulfillment RESTlet is deployed. Draft lives on Studio at lanes/rl_ship_item_fulfillment.js.

Held

Agree lock hard gate

≥2/3 OCR engines must agree on critical fields. Audit writes, then agree lock under locks/. Only then does NetSuite get a write.

Fulfill held

Item receipt path is the active target. Fulfill waits on RESTlet deploy — draft on Studio lanes, not live.

What happens after you hit Send

You send one email with the paperwork. Here’s the backside walkthrough — what the bots check, what gets locked, and what you hear back. No NetSuite login required.

Pilot shadow ON No live Saves Heartland loc 4 Quaker loc 18

A Front of house — you

Four short steps. That’s the whole human side.

  1. Open the Zoho template Receiving, Shipping, or BOL — pick the lane that matches the paperwork.
  2. One order ref per email No slash multi-line refs. Locked preference — multi-ref stays needs-you.
  3. Attach signed BOL + packing list PDF preferred. Temp / lot supplements if you filled them.
  4. Send to the lane mailbox receiving@ / shipping@ / bol@ @globalfoodsolutions.co

B Backside theater

After Send, the bots take the stage. Plain-English walkthrough of each beat.

1

Mailbox catches it

Bots Mail Bot labels BOL | Receiving | Shipping, stores copies under mailbox attachments, and pings the matching lane bot.

Stage 1b · Bots
2

OCR reads the pages

Studio classifies digital vs scan. Three engines read the same PDF so no single reader owns the answer.

Stage 2 · Studio
3

Agree lock

≥2/3 must agree on critical fields (PO/SO, item, qty, site, lots). Disagree → needs-you, no write.

Hard gate
4

Match NetSuite

Find the PO (Received) or SO (Shipped). Always check related Item Receipt / Item Fulfillment first so we never duplicate.

Lookup only
5

Shadow compare (pilot now)

Build a diff pack vs human NetSuite. No Saves until Michael unlocks prove. Team still does manual NetSuite on real orders.

Shadow · no Save
6

Done bounce

When the lane finishes cleanly, SMTP Done from the matching alias. Slack is OFF for this lane. Ambiguous or conflict → needs-you to Michael — never a silent invent.

SMTP Done

C What you’ll see / hear

Three outcomes. Holds aren’t random — each one has a reason.

Done

Lane processed cleanly

Pilot: compare pack only. You get SMTP Done from the matching alias. No live NetSuite Save yet.

Needs you

Human judgment required

Miss, multi-ref slash, location conflict (e.g. Heartland vs Quaker), related IR already exists with mismatch, or loc 17 Delta Pak legacy.

Held

Fulfill path waiting

Ship / fulfill stays held until shipItemFulfillment RESTlet is deployed. Draft lives on Studio lanes — not live.

D Mini example story

Shadow sample · sanitized No live Save claimed

Shipped email → SO match → hold on location conflict

  1. Shipped email arrives with order ref like 26150979329.
  2. Backside matches SO14109 · Reinhart · Coal Township.
  3. OCR agrees on PO/SO, item, and qty.
  4. Related Item Fulfillment is empty in NetSuite while Monday said shipped → monday_ahead_of_ns flag in the compare pack.
  5. Location conflict: Heartland on the BOL vs Quaker on the SO → needs-you, hold Save.

Point: this is exactly why the backside show-and-tell exists — so the team understands holds aren’t random. The bots stopped because the paperwork and the SO disagreed on site.

E Quick FAQ

Is Monday going away for Heartland/Quaker paperwork?
Yes for this intake — email is the arrival event and the backup storage.
Does this book Dock Scheduler appointments?
No — that’s a different bot / script 2540.
Can the bot invent an order?
Never. No Done without a verified Save — and Saves are off in pilot.
One email, one order ref?
Yes. Multi-ref stays needs-you until the habit shifts.

Pilot reminder

Shadow compare is ON. Live NetSuite Saves stay off until Michael unlocks prove. Dock and office still post real receives / ships manually in NetSuite for now.

Intake — Zoho template

Click the template, fill the blanks, attach signed paperwork, send. That is the whole human step.

Template blanks

Action
receive | fulfill | log
Site
heartland | quaker
PO / SO
document number
BOL#
bill of lading
When ET
arrival / event time
Carrier
carrier name
Trailer
trailer ID
Lots
lot codes + expiry
Temp
temperature reading

Lane mailboxes

Send to the matching alias. Copy buttons for the dock/office team:

Stage 1b — Bots Mail Bot

  • Labels: BOL | Receiving | Shipping
  • One lane ping with label + action
  • SMTP Done from the matching alias
  • Slack is OFF for this lane

Attachments required

  • Signed BOL (PDF preferred)
  • Packing list
  • Any temp / lot supplements the human filled

First-live handoff lesson — Delta Pak

Delta Pak Monday ship forwards are needs-you — they are not Heartland/Quaker receive-template traffic. Do not route those forwards through this receive intake lane. Escalate to Michael; keep them off the Zoho receive template path.

Not this lane — Dock Scheduler

Dock Scheduler appointments (script 2540) belong to the Scheduling bot. Appointment booking is a separate flow — do not mix with BOL / receiving intake.

OCR → agree lock

pdf-inspector classifies the attachment. Digital PDFs and scans take different engine trios. Critical fields need ≥2/3 agreement before anything touches NetSuite.

Digital Digital trio

  1. pdf-inspector
  2. liteparse
  3. opendataloader

Scan Scan trio

  1. Docling
  2. MinerU
  3. pdf-inspector PP-OCRv6

Agree lock — hard gate

≥2/3 engines agree on critical fields → audit trail written → agree lock under locks/. Only after the lock does NetSuite receive a transform. No lock, no write.

End-to-end flow

Human · Zoho template Fill blanks · attach BOL / packing · send
Action · Site · PO/SO · BOL# · When ET · Carrier · Trailer · Lots · Temp → receiving@ / shipping@ / bol@
EMAIL BACKUP
Bots Mail Bot Label BOL | Receiving | Shipping · lane ping · SMTP Done
Slack OFF. Immutable copies also land under Documents/GFS-bots-mailbox/attachments/.
CLASSIFY
pdf-inspector classifies Routes to digital trio or scan trio
Digital: pdf-inspector · liteparse · opendataloader. Scan: Docling · MinerU · pdf-inspector PP-OCRv6.
≥2/3 AGREE
Agree lock under locks/ Audit → lock → only then NetSuite
Hard gate. Critical fields must agree. No lock means no MCP transform.
MCP TRANSFORM
Item Receipt PO → IR · lots · BOL · locs 4 / 18
custcol_gfs_lot_code / expiry · FS body · BOL# memo · Heartland=4 · Quaker=18 · loc 17 = Michael
Fulfill (held) shipItemFulfillment RESTlet
Draft: lanes/rl_ship_item_fulfillment.js — not deployed.

NetSuite receive

After agree lock, MCP transforms the PO into an Item Receipt. Same IR fields as the Dock Fulfillment Suitelet.

Topic Rule
Transform MCP: PO → Item Receipt
Lots custcol_gfs_lot_code / expiry
Body fields FS (food-safety) body fields on the IR
BOL attach Signed BOL file attached to the IR; BOL# written in memo
Heartland loc 4
Quaker loc 18
Loc 17 Legacy — needs Michael; do not auto-route
Drop ship Not loc 4 or 18 — do not force Heartland/Quaker

Fulfill — held

  • Held until shipItemFulfillment RESTlet is deployed
  • Draft on Studio: lanes/rl_ship_item_fulfillment.js
  • Do not invent a fulfill path around the RESTlet

Parallel human UI

  • Dock Fulfillment Suitelet still works
  • Script: customscript_gfs_dock_inspection
  • PIN on the floor
  • Writes the same IR fields as this lane

Prove ladder

Climb in order. No skipping. No live Saves until the watched receive Save step clears.

  1. Zoho templates Receiving / Shipping / BOL templates live and used by dock/office
  2. OCR-only test Classify + trio extract + agree lock — no NetSuite write
  3. Watched receive Save Single watched IR Save under supervision — prove field map
  4. RESTlet deploy shipItemFulfillment from Studio draft → account
  5. Fulfill Only after RESTlet is live and proved

Locked design · no live Saves

Contract, field map, and OCR design locked 2026-09-10. Prove ladder is open. No live NetSuite Saves until watched receive Save clears.

Contract
Locked · 2026-09-10
Field map
Locked
OCR design
Locked
Live Saves
Blocked until prove
Fulfill
RESTlet not deployed