{{ liveMsg }}
Your account has no role yet — ask an administrator for access. You're signed in, but you won't see or be able to do anything here until a role is granted.
Booking needs the “book” permission — ask an administrator. You can still open and work existing shipments.
{{ error }}
Booked {{ lastBooked.reference }} — draft

What needs me

Nothing needs you right now.
{{ taskSelectedIds.length }} selected
{{ taskBulkResult.done }} resolved · {{ taskBulkResult.refused }} refused
{{ r.ref }} — {{ r.ok ? '✓ ' : '✕ ' }}{{ r.msg }}
No open exceptions.
⛔ Denied-party / sanctions match — human decision required
{{ t.type }}
· {{ t.shipper }} · {{ t.origin }} → {{ t.destination }}
{{ t.detail }}
{{ reasonLabel(t.reason) }} · {{ taskAge(t.createdAt) }} old
{{ p.direction }} · prepared by {{ p.preparedByAgentId ? ('agent ' + p.preparedByAgentId) : ('user ' + (p.preparedBy || '').slice(0, 8)) }} {{ p.status }}
{{ a.proposedAction }}· {{ a.actorId }} {{ a.reversible ? 'reversible' : 'irreversible' }}
Confidence: {{ Math.round(a.confidence * 100) }}%
· {{ a.grounding.chargeCount }} charge(s)
FieldBeforeAfter
{{ d.field }}{{ d.before }}{{ d.after }}
Loading explanation…
Couldn't load the explanation — try again.

Shipments

⛔ {{ triageCounts.sanctioned }} sanctions {{ triageCounts.needReview }} need review {{ triageCounts.active }} active {{ triageCounts.drafts }} drafts
{{ selectedIds.length }} selected
{{ bulkResult.done }} advanced · {{ bulkResult.refused }} refused
{{ r.ref }} — {{ r.ok ? '✓ ' : '✕ ' }}{{ r.msg }}
You don't have access to shipments — ask an administrator for a role that grants it.
No shipments yet — book one above.

{{ detail.reference }}

{{ detail.status }} {{ detail.shipper }} · {{ detail.origin }} → {{ detail.destination }}
{{ blockers.length }} thing{{ blockers.length === 1 ? '' : 's' }} blocking this shipment
  • {{ b.fix }}
    Needs {{ b.action.permission }}.
No blockers — this shipment is ready to operate.
{{ detail.groundingReason }}
Onboarding a party requires an administrator.
{{ detailMsg }}

Review & correct

Extraction confidence: {{ Math.round((lastIngest.shipment.confidence || 0) * 100) }}% — verify each field against the source document.
Correcting a draft requires the edit permission — ask an administrator.
🔒 Parsed fields are locked — this shipment is {{ detail.status }}. A correction is pre-commit only.

Job P&L

Revenue
{{ money(costing.revenue, costing.currency) }}
Cost
{{ money(costing.totalCost, costing.currency) }}
{{ money(costing.actualCost, costing.currency) }} billed + {{ money(costing.accruedCost, costing.currency) }} accrued
Margin
{{ money(costing.margin, costing.currency) }} ({{ costing.marginPct }}%)
Provisional — {{ costing.openAccrualCount }} vendor bill(s) still to land.
{{ fulfilMsg }}

Route

No route planned.

Cargo & containers

No cargo entered.

Milestones

No milestones yet.
{{ m.code }} ETA {{ fmtWhen(m.estimatedAt) }} · actual {{ m.actualAt ? fmtWhen(m.actualAt) : '—' }} {{ m.status }}

Charge lines

No charge lines yet.
{{ c.side === 'Sell' ? 'AR' : 'AP' }} {{ c.chargeCode }} {{ money(c.amount, c.currency) }}

Screening

No screening on record for this shipment yet.
Cannot close: {{ costing.closeBlockers.join('; ') }}
No customs filings provisioned for this shipment.

Documents & EDI

{{ transportDoc.docType }} · {{ transportDoc.loadingLabel }}: {{ transportDoc.portOfLoading }} → {{ transportDoc.dischargeLabel }}: {{ transportDoc.portOfDischarge }} · not ready: {{ transportDoc.missingElements.join(', ') }}
{{ ediOut }}

Documents — view & print

Required: {{ (docReadiness.required || []).join(', ') || '—' }} · present: {{ (docReadiness.present || []).join(', ') || 'none' }} · missing: {{ docReadiness.missing.join(', ') }}
Loading document…

Timeline

No events yet.
{{ e.actorType }} {{ e.eventTypeCode }} {{ e.kind === 'ESTIMATED' ? 'estimate' : 'actual' }} {{ fmtWhen(e.occurredAt) }} · {{ e.actorId }} superseded by a later actual

Onboarding

Getting started — configure your tenant's master data
{{ setupState.parties.done ? '✓' : '○' }} Onboard parties{{ setupState.parties.count }} configured
{{ setupState.ports.done ? '✓' : '○' }} Add ports / locations{{ setupState.ports.count }} configured
{{ setupState.rateCards.done ? '✓' : '○' }} Add rate cards{{ setupState.rateCards.count }} configured
{{ setupState.deniedParties.done ? '✓' : '○' }} Load a denied-party list{{ setupState.deniedParties.count }} entries
Reference data is present, but no denied-party list is loaded — no shipment can be screened to depart yet.
Operationally ready — master data is configured and a denied-party list is loaded.
Parties (a tenant's own vocabulary — grounds intents immediately)
No parties yet.
{{ p.legalName }} {{ p.creditStatus }}
aka {{ p.aliases.join(', ') }}
limit {{ money(p.creditLimit, p.creditLimitCurrency) }} {{ p.creditLimitCurrency }}
Adding a party requires an administrator.
Locations
No locations yet.
{{ l.code }}{{ l.name }}
Denied-party list — required before any screening can assert 'clear'
{{ deniedMsg }}
Loading a denied-party list requires screening authority.

Users & roles

{{ adminMsg }}
Users & roles
No users yet.
{{ u.email }}{{ u.status }}
{{ roleName(rid) }} no roles

Rate cards

{{ adminMsg }}
Rates / tariffs
No rate lines — add one so lanes price.
{{ r.mode }} {{ r.originPort }}→{{ r.destinationPort }} {{ r.basis }} · {{ money(r.amount, r.currency) }} {{ r.currency }} · fuel {{ r.fuelSurchargePct }}%

Inbox — the work arrives

You don't have access to ingest documents — ask an administrator for a role that grants it.
{{ lastIngest.rejected.length }} document(s) were rejected and NOT extracted:
{{ r.name }} — {{ r.reason }}
Extracted a draft — {{ lastIngest.shipment.reference }} confidence {{ Math.round((lastIngest.shipment.confidence || 0) * 100) }}%
{{ lastIngest.sourceText }}
Shipper · {{ lastIngest.shipment.grounded ? 'grounded ✓' : 'not matched — review' }}
Open the draft to see every parsed field and correct any of them; a party correction re-screens on the spot.

The books

You don't have access to the books — ask an administrator for a role that grants it.
Chart of accounts not seeded — nothing posts to the ledger.

Analytics

You don't have access to analytics — ask an administrator for a role that grants it.

Demurrage watch

No demurrage tariffs yet — add one to watch free-time risk.

Payment run

Nothing to pay — no vendor is net-payable.

EDI inbox

Paste an inbound EDIFACT IFTMIN (a partner's booking) or an X12 214 (a carrier status).
{{ edi.result }}
{{ edi.error }}

Stock on hand

No stock on hand — register an item or receive goods.
SKUOwnerUoMOn hand
{{ s.sku }} {{ vendorName(s.ownerPartyId) }} {{ s.uom }} {{ s.onHand }} low stock

{{ item.sku }} — {{ item.description }}

On hand {{ item.onHand }} {{ item.uom }} · Available (ATP) {{ availability ? availability.available : '…' }} at/below reorder point
Movement ledger
No movements yet.
WhenTypeQtyRefNote
{{ (m.occurredAt || '').slice(0,10) }} {{ m.type }} {{ m.quantity }} {{ m.reference || '—' }} {{ m.note || '—' }}
{{ itemMsg }}

Goods receipt orders

Ladder: Open → Received → PutAway (posts +) → Completed.
No goods-receipt orders.
RefItemQtyStatus
{{ o.reference || o.id.slice(0,8) }} {{ o.itemId.slice(0,8) }} {{ o.quantity }} {{ o.status }} · posted
{{ orderMsg }}

Goods issue orders

Ladder: Open → Picked → Packed → Issued / PGI (posts −, no-oversell) → Completed.
No goods-issue orders.
RefItemQtyStatusBooking
{{ o.reference || o.id.slice(0,8) }} {{ o.itemId.slice(0,8) }} {{ o.quantity }} {{ o.status }} · PGI posted {{ o.shipmentId.slice(0,8) }}
{{ orderMsg }}
{{ orderMsg }}