Goods In Transit

Shipped by the supplier, not yet received · GIT_INBOUND stock type held against the destination location · 2,336 units, AED 512K owned and afloat · this is the balance that neither i2 nor INV1 ever represented at all

Customs hold · day 6 of demurrage. Container MSCU7719 (INB-2026-0702-001, CIC Lulwa, 96 units) arrived Jebel Ali 17-07, 5 free days expired 22-07. Accruing AED 640/day, total AED 3,840, already booked as an estimated demurrage cost component so the broker invoice will be a small revision rather than a surprise. Open PO →
1 shipment silent 14 days. INB-2026-0715-010 · AWB DHL 4429117001 returns 404 from both the unified Tracking API and MyDHL Express. Marked state=exception and permanently removed from the poll queue rather than retried forever. 24 units still sitting in GIT_INBOUND pending a manual decision. Open case →

GIT_INBOUND waterfall · July

Every movement into and out of the transit balance for the month, ending at the balance the ledger holds right now

closes at 2,336
6,0004,5003,0001,5000 Opening GIT_INBOUND on 01-07 · 1,504 units · AED 318K 1,504 Shipped in July · +4,220 units across 6 PI shipments · IN_PRODUCTION -4,220 in the same transactions +4,220 Received at HQ_319 · -3,228 units · RECEIVED_NOT_INVOICED +3,228 in the same transactions -3,228 Short receipt written off to LOST_IN_TRANSIT · -160 units · LBA01 on PO-2026-115 · claim SC-2026-0041 for AED 32,200 -160 Excess receipt reconciliation · Atelier Rossi delivered 752 against 740 shipped · 12 units posted to QUARANTINE, not to STOCK, because they have no purchase price +12 exc Closing GIT_INBOUND on 29-07 · 2,336 units · AED 512K · matches the ledger balance exactly (AC-05.2) 2,336
Opening 01-07ShippedReceivedShortClosing 29-07
Balance Into transit Out to receipt Written off short 1,504 + 4,220 - 3,228 - 160 = 2,336

Customs hold aging and demurrage risk

Band width is AED of goods at risk · the black mark is median age in the bucket · demurrage starts when free days expire, not when the hold opens

AED 640/day accruing
0-5 days · within the free window · 1 shipment · 1,180 units · AED 268K · no demurrage Median age 3 days 3d median AED 268K · 1 shipment · 1,180 u 6-14 days · demurrage accruing · 1 shipment · 96 units · AED 41K · AED 640/day, AED 3,840 accrued Median age 6 days 6d median AED 41K · MSCU7719 · 96 u · AED 3,840 accrued 15+ days · escalated to the broker and to finance · none open none open 0-5d free6-14d accruing15d+ escalated
MSCU7719
AED 3,840
SDEC-2026-0726
AED 0
SDEC-2026-0712 closed
AED 0
Sea freight has no tracking adapter anywhere in the estate. ops2 registers SEAFREIGHT as a courier with source "manual" and no poller, so a container ETA is a human-typed date nobody revises. i3 therefore derives the demurrage clock from the customs entry (arrived_on + free_days) rather than from carrier events, and books the projected accrual as an estimated cost component the moment a hold opens.
All shipments 13
Booked 1
In transit 3
At customs 2
Customs hold 1
Delivered 6
Exception 1
Air 7
Courier 5
Sea 1
DHL 12
Minimalist 11
Lulwa 2
Receive →

Inbound shipments · shipped-not-received register

GIT_INBOUND stock type · destination location 13 rows
ShipmentPIPO SupplierModeCarrier AWB / containerPieces ShippedRecvGap LeftETA origETA nowSlip StateCustomsDemurrageLast sync
INB-2026-0723-006 PI-889PO-2026-119 VJ JewelsAIRDHL 44291133028 / 0 6400640 23-0730-0701-08+2d In transitnot lodged012m ago
INB-2026-0719-005 PI-896PO-2026-118 CICAIRDHL 442911884014 / 0 1,18001,180 19-0727-0731-07+4d At customsSDEC-2026-0726 · 3d08m ago
INB-2026-0725-007 PI-891PO-2026-120 ORO LeatherCOUDHL 44291155773 / 0 1800180 25-0703-0803-080d In transitDAP · supplier clears021m ago
INB-2026-0726-008 PI-885PO-2026-113 LC StrapsAIRDHL 44291100994 / 0 2400240 26-0704-0804-080d In transitnot lodged014m ago
INB-2026-0702-001 PI-880PO-2026-112 CIC LulwaSEAManual MSCU7719 · MV Kota1 / 0 96096 02-0703-0812-08+9d Customs holdvaluation query · 6d3,840manual 2d
INB-2026-0728-009 PI-902PO-2026-121 CICCOUDHL 4429121188 · samples1 / 0 000 booked06-0806-08n/a Booked - 0never
INB-2026-0715-010 PI-877PO-2026-108 Brasswork MilanoCOUDHL 44291170011 / 0 24024 15-0722-07unknown+7d ExceptionAWB 404 both APIs0silent 14d
INB-2026-0708-002 PI-871PO-2026-115 CICAIRDHL 442911720924 / 23 1,8001,640160 08-0715-0718-07+3d DeliveredSDEC-2026-0712 · hold 3d018-07
INB-2026-0710-003 PI-864PO-2026-110 Brasswork MilanoAIRDHL 442911664018 / 18 2,1501,880270 10-0719-0724-07+5d ReceivingSDEC-2026-0718 · cleared024-07
INB-2026-0712-004 PI-884PO-2026-117 ORO LeatherCOUDHL 44291177332 / 2 48480 12-0720-0720-070d DeliveredDAP · supplier cleared020-07
INB-2026-0620-094 PI-878PO-2026-116 LC StrapsAIRDHL 442910991222 / 22 3,2003,2000 20-0613-0712-071d early DeliveredSDEC-2026-0709 · cleared012-07
INB-2026-0616-091 PI-869PO-2026-111 Atelier RossiAIRDHL 442910884016 / 16 740752+12 16-0610-0708-072d early DeliveredSDEC-2026-0705 · cleared008-07
INB-2026-0605-088 PI-858PO-2026-109 VJ Jewels LulwaCOUDHL 44291077015 / 5 42040812 05-0625-0626-06+1d DeliveredSDEC-2026-0623 · cleared026-06
Open shipments only · GIT_INBOUND balance 2,33602,336 AC-05.2 identity holds · tolerance 03,840
DHL polling policy. Open shipments are polled every 30 minutes against the unified Tracking API, which is cheap. The side panel and the carton-to-piece match use MyDHL Express with levelOfDetail=all for per-piece weights and dimensions. A transient failure backs off exponentially; a 404 is terminal and sets state=exception so a dead AWB is never polled forever. That distinction between DHLError and DHLNotFoundError is ported directly from ops2 iwms/dhl.py. Accounts are Minimalist 454655276 and Lulwa 454850095, both on API profile apF0jS2iQ2hB7y; account numbers are settings, the API keys are Fly secrets.

Shipped-to-received reconciliation

one row per closed shipment line · this is the gap that becomes either a claim or an excess 12 rows · 2 open claims
SKUShipmentPO ShippedReceivedAccepted ShortExcessVariance DispositionClaimCost impactLedger effect
LBA01INB-2026-0708-002PO-2026-115 160001600-100.0% never arrivedSC-2026-0041 open32,200GIT → LOST_IN_TRANSIT
MSR31-07INB-2026-0708-002PO-2026-115 300300298000.0% 2 QC rejectRTS-2026-0119390RNI → QUARANTINE
CDW01INB-2026-0708-002PO-2026-115 480480478000.0% 2 QC rejectRTS-2026-0119262RNI → QUARANTINE
MIN-2159INB-2026-0708-002PO-2026-115 200200196000.0% 4 QC rejectRTS-2026-0119852RNI → QUARANTINE
MST-CRM-42-BLKINB-2026-0708-002PO-2026-115 120120118000.0% 2 QC rejectRTS-2026-01192,008RNI → QUARANTINE
XTRA-STRAPINB-2026-0710-003PO-2026-110 9608408401200-12.5% 2 cartons unopenedreceiving in progresspendingstill GIT_INBOUND
MSR31-08INB-2026-0710-003PO-2026-110 1,1901,0401,0401500-12.6% 3 cartons unopenedreceiving in progresspendingstill GIT_INBOUND
PP02INB-2026-0712-004PO-2026-117 484832000.0% 16 in QC 5-bucketQC openpendingRNI held
MSR31-07INB-2026-0620-094PO-2026-116 1,6001,6001,598000.0% closedsettled262RNI → STOCK
XTRA-STRAPINB-2026-0620-094PO-2026-116 1,6001,6001,598000.0% closedsettled168RNI → STOCK
JRY01INB-2026-0616-091PO-2026-111 740752748012+1.6% excess to QUARANTINEcommercial decision0GIT → QUARANTINE
JRY02INB-2026-0605-088PO-2026-109 420408402120-2.9% credit note issuedSC-2026-0033 settled3,096GIT → LOST_IN_TRANSIT
Excess never posts to STOCK. Atelier Rossi delivered 752 units against 740 shipped. Those 12 units have no purchase price, so admitting them to sellable stock would create units at cost 0, which is exactly the i2 failure this whole module exists to close. They post to QUARANTINE and wait for a commercial decision (accept and invoice, or return). Short units go the other way: they are written off GIT_INBOUND to LOST_IN_TRANSIT so the transit balance closes cleanly, and the money sits on a supplier claim rather than on a stock valuation.

The rule this page enforces

GIT_INBOUND is a stock type held against the destination, not a place. HQ_319 / GIT_INBOUND = 2,336 means "2,336 units destined for HQ_319 that are currently on an aircraft or in a container". It is is_sellable=false and is_countable=false, it appears in the live pivot as its own column, and it feeds days-of-cover so the reorder engine stops ordering goods that are already afloat.

AC-05.2 · the identity checked nightly

balance(sku, dest_loc, GIT_INBOUND)
  = SUM(qty_shipped on open shipments)
  - SUM(qty_received against them)

per (sku_id, dest_location_id)
tolerance 0 · a breach is a P1

RFID reconciliation is suspended for this stock type, and that is deliberate, not a gap. No i3 reader can see a unit that is inside a container over the Indian Ocean, so the unit-versus-quantity identity would fail by construction. It resumes at the receipt, which is the first moment the unit is inside a gate's read range (AC-05.8). A reconciler that reports drift on GIT_INBOUND or IN_PRODUCTION is misconfigured.

The gap this page closes

No system in the estate represents shipped-but-not-received as a balance. i2's schema has no GIT concept at all: grep 0001_initial.sql and the v2 PRD and neither word appears. INV1's api_receive_production posts factory output straight into a warehouse and skips transit entirely. ops2 computes in_transit = shipped_open - received_open inside pi_ladder, but it is read-time arithmetic on a PI page, not a balance any other system can query.

The business consequence is that for the two to eight weeks a container is on the water, AED 512K of owned inventory is invisible to valuation, invisible to days-of-cover, and invisible to the reorder engine, which therefore reorders goods that are already afloat.

i3 posts it. Shipping a PI line writes -qty @ IN_PRODUCTION and +qty @ GIT_INBOUND in one transaction. Receiving writes -qty @ GIT_INBOUND and +qty @ RECEIVED_NOT_INVOICED. The waterfall above is that ledger, read back.

Silence is a symptom, not a state (R-05.25). A GIT line whose ETA passed more than 3 days ago with no receipt raises a P2 and appears on the exception queue. Without that rule an untracked shipment sits in the balance forever and quietly inflates days-of-cover.

Connected to

POs + PI → PO detail → Production → Shipment register → GRN + QC → GRN events → Cartons → Return to supplier → Suppliers → Drift → Live inventory → Stock health → Cash + valuation → Ops health → Reports →