{{ 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.
{{ 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' }}
Why: {{ formatBasis(a.basis) }}
No basis recorded.
Confidence: {{ Math.round(a.confidence * 100) }}%
· {{ a.grounding.chargeCount }} charge(s)
| Field | Before | After |
|---|---|---|
| {{ d.field }} | {{ d.before }} | {{ d.after }} |
Loading explanation…
Basis: {{ formatBasis(respondExpl.basis) }}
No basis recorded.
| Field | Before | After |
|---|---|---|
| {{ d.field }} | {{ d.before }} | {{ d.after }} |
Agent run: {{ respondExpl.runTrail.agentRunId }} · {{ respondExpl.runTrail.steps.length }} step(s)
{{ s.method }} {{ s.path }} → {{ s.statusCode }}
Run trail: {{ (respondExpl.runTrail && respondExpl.runTrail.reason) || 'run trail unavailable' }}
Asking the agent…
AI
AI-generated — check it against the basis above.
{{ respondAnswer.answer }}
{{ respondAnswer.reason || 'The agent couldn’t generate an explanation right now.' }} — the basis and diff above remain.
Couldn't load the explanation — try again.
Shipments
⛔ {{ triageCounts.sanctioned }} sanctions
{{ triageCounts.needReview }} need review
{{ triageCounts.active }} active
{{ triageCounts.drafts }} drafts
{{ 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 }} · {{ detail.incoterm }}
{{ 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 }}
Fulfilments
{{ m.type }} {{ m.quantity }}
{{ (m.occurredAt || '').slice(0,10) }}
Invoices awaiting issue
{{ p.direction }}{{ p.status }}
prepared by {{ (p.preparedBy || '').slice(0, 8) }}
Route
No route planned.
{{ l.origin }} → {{ l.destination }}
{{ l.type }} · {{ l.mode }} · {{ l.carrierName }}
{{ l.status }}
{{ route.completedLegs }}/{{ route.totalLegs }} legs
· now: {{ route.currentLegDescription }}
· {{ route.blockers.join('; ') }}
Cargo & containers
No cargo entered.
{{ cg.description }}
{{ cg.pieces }} pcs · {{ cg.weightKg }} kg · {{ cg.volumeM3 }} m³
{{ bx.containerNo }}
{{ bx.isoType }} · check digit invalid
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.
⛔ {{ sc.role }} — denied-party match. Cargo cannot move; human decision required (licence path only).
{{ sc.screenedName }} · matches {{ sc.matchName }} ({{ sc.matchList }})
{{ sc.role }}
Potential match — adjudicate
{{ sc.screenedName }} · matches {{ sc.matchName }} ({{ sc.matchList }})
{{ sc.role }}
Not screened — no denied-party list loaded
{{ sc.screenedName }}
{{ sc.role }}
{{ sc.status }}
{{ sc.screenedName }}
Cannot close: {{ costing.closeBlockers.join('; ') }}
No customs filings provisioned for this shipment.
ICS2 — EU advance security (ENS)
ENS
{{ ics2.status }}
MRN {{ ics2.mrn }}
· cargo cannot load until accepted
missing: {{ ics2.missingElements.join(', ') }}
ISF (10+2) — US import security filing
ISF
{{ isf.status }}
deadline: {{ isf.deadlineStatus }}
missing: {{ isf.missingElements.join(', ') }}
AMS — US ocean cargo manifest
AMS
{{ ams.status }}
deadline: {{ ams.deadlineStatus }}
missing: {{ ams.missingElements.join(', ') }}
ACE — US entry (3461)
ACE
{{ ace.status }}
summary deadline: {{ ace.summaryDeadlineStatus }}
missing: {{ ace.missingElements.join(', ') }}
ACAS — US air cargo advance screening
ACAS
{{ acas.status }}
deadline: {{ acas.deadlineStatus }}
missing: {{ acas.missingElements.join(', ') }}
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…
No invoice issued yet — {{ docMsg }}
{{ docMsg }}
— issued; this is the frozen document of record.
— this document is not ready; it will print marked with its gaps.
Tiller Freight
{{ docTitle }}
{{ docNumber }}
NOT FOR RELEASE — {{ (docView.blocks || []).join('; ') || 'not yet releasable' }}
DRAFT — NOT READY
Missing: {{ (docView.missingElements || []).join(', ') || '—' }}
VOIDED
ISSUED · TELEX RELEASED
ISSUED
— {{ issuedDoc.transportNumber || '—' }}
Issued by {{ issuedDoc.issuedBy }} · {{ fmtWhen(issuedDoc.issuedAt) }}
{{ issuedDoc.originalsCount }}/{{ issuedDoc.originalsCount }} originals issued
·
Shipped on board {{ issuedDoc.onBoardDate }}
Shipper
{{ docView.shipper }}
Seller
{{ docView.seller }}
Assured
{{ docView.assured }}
Customer
{{ docView.customer }}
Consignee
{{ docView.consignee }}
Buyer
{{ docView.buyer }}
Deliver to
{{ docView.deliverTo }}
{{ docView.loadingLabel }}
{{ docView.portOfLoading || '—' }}
Origin
{{ docView.origin }}
{{ docView.dischargeLabel }}
{{ docView.portOfDischarge || '—' }}
Destination
{{ docView.destination }}
Mode
{{ docView.mode }}
Incoterm
{{ docView.incoterm }}
Freight terms
{{ docView.freightTerms }}
Document number
check digit invalid
| Description | Pieces | Weight (kg) |
|---|---|---|
| {{ c.description || '—' }} | {{ c.pieces != null ? c.pieces : '—' }} | {{ c.weightKg != null ? c.weightKg : '—' }} |
| Total | {{ docView.totalPieces }} | {{ docView.totalWeightKg }} |
| Charge | Amount |
|---|---|
| {{ l.chargeCode }} | {{ money(l.amount, l.currency) }} |
| Total | {{ money(docTotal, docTotalCurrency) }} |
| Mixed currency — no single total; each line is shown in its own currency. | |
Customs
{{ docView.customsStatus }}
Charges
{{ docView.chargesStatus }}
Cover clause
{{ docView.clause }}
Cover basis
{{ docView.coverageBasis }}
Insured value
{{ money(docView.insurableValue, docView.currency) }}
Premium
{{ money(docView.premium, docView.currency) }}
Valid until
{{ fmtWhen(docView.validUntil) }}
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.
Drop documents here (email, PDF, image, CSV) — or
{{ d.name }}
{{ 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.
FX rates need attention —
{{ f.from }}→{{ f.to }}
{{ f.freshness === 'Missing' ? 'missing' : 'stale (' + f.ageDays + 'd)' }},
| Account | Debits | Credits | Balance |
|---|---|---|---|
| {{ r.accountCode }} {{ r.accountName }} | {{ money(r.debits, trialBalance.currency) }} | {{ money(r.credits, trialBalance.currency) }} | {{ money(r.balance, trialBalance.currency) }} |
| Out of balance by | {{ money(trialBalance.outOfBalanceBy, trialBalance.currency) }} | ||
| Revenue | |
|---|---|
| {{ l.accountName }} | {{ money(l.amount, income.currency) }} |
| Expenses | |
| {{ l.accountName }} | {{ money(l.amount, income.currency) }} |
| Net profit | {{ money(income.netProfit, income.currency) }} ({{ income.netMarginPct }}%) |
| Assets | |
|---|---|
| {{ l.accountName }} | {{ money(l.amount, balance.currency) }} |
| Liabilities | |
| {{ l.accountName }} | {{ money(l.amount, balance.currency) }} |
| Retained earnings | {{ money(balance.retainedEarnings, balance.currency) }} |
| Balances | {{ balance.balances ? 'yes' : 'NO — ' + money(balance.outOfBalanceBy, balance.currency) }} |
| Bucket | Open ({{ aging.currency }}) |
|---|---|
| {{ bucket }} | {{ money(amt, aging.currency) }} |
| Total exposure | {{ money(agingTotal, aging.currency) }} |
| {{ aging.excludedInvoices }} invoice(s) not included — no FX rate: {{ aging.exclusions.join('; ') }} | |
| Position ({{ workingCapital.currency }}) | |
|---|---|
| Receivables (owed to us) | {{ money(workingCapital.receivableTotal, workingCapital.currency) }} |
| Payables (we owe) | −{{ money(workingCapital.payableTotal, workingCapital.currency) }} |
| Net position | {{ money(workingCapital.netPosition, workingCapital.currency) }} |
| Net excludes {{ workingCapital.excludedInvoices }} invoice(s) with no FX rate — the true position is not fully captured: {{ workingCapital.exclusions.join('; ') }} | |
| Movement | |
|---|---|
| {{ l.description }} {{ l.activity }} | {{ money(l.amount, cashFlow.currency) }} |
| Opening cash | {{ money(cashFlow.openingCash, cashFlow.currency) }} |
| Closing cash | {{ money(cashFlow.closingCash, cashFlow.currency) }} |
| Unclassified: {{ cashFlow.unclassified.join('; ') }} | |
Analytics
You don't have access to analytics — ask an administrator for a role that grants it.
Quote win rate
{{ pct(quoteWinLoss && quoteWinLoss.winRatePct) }}
{{ quoteWinLoss.accepted }}/{{ quoteWinLoss.accepted + quoteWinLoss.declined }} decided
On-time delivery
{{ pct(deliveryPerf && deliveryPerf.onTimePct) }}
{{ deliveryPerf.onTime }}/{{ deliveryPerf.measured }} measured
Carriers — on-time vs what we are on the hook for
| Carrier | Legs | On time | Committed |
|---|---|---|---|
| {{ c.carrierName }} | {{ c.legsCompleted }} | no basis {{ c.onTimePct }}% | {{ money(c.committedCost, carriersCurrency) }} |
No completed legs yet.
Lanes — where the money is made
| Lane | Shipments | Margin | % |
|---|---|---|---|
| {{ l.shipments }} | {{ money(l.margin, lanesCurrency) }} | {{ l.marginPct === null ? '—' : l.marginPct + '%' }} |
No billable shipments yet.
{{ lanesExcluded }} shipment(s) excluded — no FX rate.
Demurrage watch
No demurrage tariffs yet — add one to watch free-time risk.
Free-time policy
| Container | Free days left | Days accruing | Status |
|---|---|---|---|
| {{ r.containerNo }} | {{ r.accruing ? '—' : r.freeDaysRemaining }} | {{ r.accruing ? r.chargeableDays : '—' }} | {{ r.accruing ? 'accruing' : 'expiring soon' }} |
No containers at risk under this policy.
Payment run
Nothing to pay — no vendor is net-payable.
| Vendor | Payable | Less AR | Net to pay |
|---|---|---|---|
| {{ vendorName(v.vendorId) }} | {{ money(v.payable, paymentRun.currency) }} | {{ v.receivable > 0 ? '−' + money(v.receivable, paymentRun.currency) : '—' }} | {{ money(v.netPayable, paymentRun.currency) }} |
| Total to pay ({{ paymentRun.currency }}) | {{ money(paymentRun.totalNetPayable, paymentRun.currency) }} | ||
{{ paymentRun.incompleteVendors }} vendor(s) with an untranslatable balance — net may differ.
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.
| SKU | Owner | UoM | On 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
On hand by bin
| Bin | On hand |
|---|---|
| {{ (b.binLocationId || '').slice(0,8) }} | {{ b.onHand }} |
Movement ledger
No movements yet.
| When | Type | Qty | Ref | Note |
|---|---|---|---|---|
| {{ (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.
| Ref | Item | Qty | Status | |
|---|---|---|---|---|
| {{ 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.
| Ref | Item | Qty | Status | Booking | |
|---|---|---|---|---|---|
| {{ 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 }}