CargoSharks

The product, from the beginning

The whole of one forwarding job, in one record.

CargoSharks is the commercial and operational software a freight forwarder runs its day on: an enquiry arrives, it is priced from your own contracts, it is quoted, awarded, executed, documented and invoiced — and at no point is any of it typed into a second system. It is built in Arabic and English at the same time, and it runs on a database that belongs to you.

Open the live demoBook the 15-day pilotHow we are differentThe home page

01 — Why anyone changes

The problem is not your people

Your rates are in spreadsheets, so a quotation takes a day and a half. Your enquiries are in four mailboxes, so nobody owns them and nobody is timed. Your customers find out where their container is by ringing someone who has to go and find out. And your margin on a job is a number you reconstruct at month-end rather than one you knew when you quoted.

Every one of those is a system-of-record problem. None of them is a training problem, and none of them is fixed by a better spreadsheet. They persist because the job does not live anywhere — it lives in an inbox, a folder, a WhatsApp thread and somebody’s memory, and no two of those agree.

It costs you the jobs you priced too slowly, and the ones you priced too cheaply.

02 — What replaces it

One record. Six states. No exits.

A job enters as an enquiry and leaves as a paid invoice without ever being re-keyed into something else. Each state hands the next one everything it needs, which is the entire point: nothing is retyped, so nothing can be retyped differently.

01

Enquiry

One queue across every branch, one owner, one response clock.

02

Quote

Priced from your own card where one covers the lane; sent to agents where it doesn’t.

03

Award

Acceptance converts the quote. Buy, sell and margin lock to the record.

04

Execution

Milestones, customs stage, containers, free-time clocks, exceptions.

05

Documents

Typed, versioned, attached — released to the customer where permitted.

06

Invoice

Raised from the job’s own cost ledger, in the right entity, currency and language.

Six seeded milestone templates, at their real lengths

Six rows of dots, each a milestone template for one mode and direction, the length of the row being its number of stepsSea FCL · importBooking confirmedCargo receivedVessel departedVessel arrivedDischargedCustoms clearedGate outDeliveredEmpty returned9Sea FCL · exportBooking confirmedEmpty container collectedContainer stuffedGate inCustoms clearedLoadedVessel departedVessel arrivedDelivered9Sea LCL · importBooking confirmedCargo receivedVessel departedVessel arrivedDischargedDevannedCustoms clearedDelivered8Air · importBooking confirmedCargo receivedFlight departedFlight arrivedCustoms clearedDelivered6Air · exportBooking confirmedCargo receivedCustoms clearedFlight departedFlight arrivedDelivered6Land · importBooking confirmedLoadedBorder crossedCustoms clearedDelivered5booking confirmedsteps
Every template opens at booking confirmed and ends at delivered — except the FCL import, which ends at empty returned, the milestone the detention clock stops on. Nine steps by sea and five by road, which is why there is no single “shipment checklist”: it would be too long for the road or too short for the water. Hover any dot for its name.

Two consequences follow from that shape, and they are the two things a forwarder notices first.

What you sold is what you costed. Accepting a quotation opens the job file with the buying and selling rates already attached to it, so the margin on the job is a live figure rather than one reconstructed at month-end from three sources that disagree.

Revisions supersede rather than overwrite. What the customer actually accepted stays recoverable, whatever has happened to the quotation since. That is a property of the database rather than a habit of the people using it — see what holds when people are careless.

Three versions of a quotation, stacked, with the audit trail beside themv1 · supersededv2 · supersededv3 · accepted21 Aug · 11:05nothing is deleted18 Aug 09:12N. Al-Failakawiquote.send19 Aug 14:40N. Al-Failakawiquote.revise21 Aug 11:05M. Haddadquote.accept21 Aug 11:05systemjob.bookwritten by a database trigger, not by the application
A revision supersedes rather than overwrites: what came before is still a quotation rather than a lost draft, and what the customer accepted stays recoverable whatever has happened since. The trail beside it is written by a database trigger, so a change made around the application is recorded too.

03 — Modes

Five modes, each calculated its own way

Freight is not billed on what a shipment weighs. It is billed on the greater of weight and volume, converted by a divisor that differs per mode, rounded up to that mode’s increment, then floored at that mode’s minimum. Approximating one mode with another’s arithmetic is where a rate quietly stops matching the invoice.

01Sea FCL
per container

Volume never enters the calculation. Rated by container type and count, with demurrage, detention and storage clocks running per container against the carrier’s free days.

02Sea LCL
revenue ton

Weight or measure: whichever is greater of cubic metres and metric tonnes. A 1,000 cm³/kg divisor — one cbm to one tonne — with a 1,000 kg minimum.

03Air
chargeable kg

The IATA 6,000 cm³/kg divisor, which is 166.67 kg to the cubic metre. Rounded up to the next half kilo, floored at 45 kg. Weight breaks apply as your carrier states them.

04Land
chargeable kg

A 3,000 cm³/kg divisor, rounded up to the whole kilo, no minimum.

05Courier
chargeable kg

A 5,000 cm³/kg divisor, rounded up to the next half kilo, floored at half a kilo.

One pallet — 120 × 100 × 100 cm, 180 kg on the scale

A column chart showing the chargeable weight of the same pallet in five transport modes04008001200180 kg — what the scale says1,200 kgSea LCL1,000 cm³/kgmin 1,000 kg400 kgLand3,000 cm³/kgmin 0 kg240 kgCourier5,000 cm³/kgmin 0.5 kg200 kgAir6,000 cm³/kgmin 45 kgno volumetric stepSea FCLper container
Same pallet, same weight, five different numbers on the invoice: 200 kg by air against 1,200 by sea LCL — a six-fold spread on a box whose weight never changed. The divisors are settings an administrator can change, not numbers baked into the software: moving an airline from a 6,000 divisor to a 5,000 one is an edit, not a new release.

Milestone sets and free-time rules are per mode in the same way. A sea import and an air import do not share a checklist here because they do not share one in the yard.

04 — The three halves of the day

What each part of it actually does

Commercial, operations, finance. The screens below are captures of the running build, not renderings of one — the same screens you can open yourself in the demo.

Commercial

From enquiry to quotation, in one place

Every enquiry, wherever it came from, with an owner and a clock — and a price that comes from your own contracts.

  • The queue. Enquiries from the web form, from email and from the phone, in one list across every branch. Each has an owner, a status and a response deadline, so how long you are actually taking is measured rather than estimated.
  • The inbox. An enquiry emailed to a branch mailbox is read into a proposal — parties, lane, cargo, what was asked for — which a coordinator accepts or rejects. Nothing becomes an enquiry without a person saying so, and what was proposed is kept beside what was decided.
  • The pricing. Buy and sell rate cards by lane, mode and carrier, with validity dates that make two overlapping cards on a lane unrepresentable rather than merely unlikely.
  • The margin. Buy, sell and margin side by side on every option, before the quotation goes out.
  • The lanes you are quoting blind. The rate-card screen names which lanes have no live buying rate on file and which cards expire inside thirty days. A lane with no buying rate is a lane you are pricing from memory.
The enquiry queue: every enquiry with an owner, a status and a response deadline

Operations

The board tells you what is wrong before the customer does

Live shipments ordered by exception, oldest first — on the principle that the one nobody has looked at is the one the process missed.

  • The job file. Milestones by mode and direction, kept as planned, revised and actual — all three, because the difference between them is the conversation.
  • Customs. Declarations ordered by the window that closes first: type, number, status, duty, broker and clearance deadline, with a duty estimate from the tariff table before the declaration goes in. Holds and inspections sit on the board rather than in a file.
  • Free time. Demurrage, detention and storage clocks per container against the carrier’s free days. When free time runs out the clock writes its own charge line, against the right counterparty, at the right per-diem rate.
  • Consolidation. A master with its houses under it, the manifest generated from them, and the master’s costs apportioned across the houses so each house’s margin is real.
  • Ask it. An assistant that answers questions over your own data — whose free time runs out this week, which invoices are overdue, where a supplier billed more than the job accrued. It sees exactly what the person asking is allowed to see, and nothing else.
The operations board: live shipments ordered by exception, oldest first

Finance and documents

What you are owed, how late it is, and who to ring

Job costing, invoicing and receivables across entities and currencies — and every document the job issues, versioned.

  • Currency, handled properly. Money is decimal throughout and rounds per currency at the line, because the Kuwaiti dinar carries three decimal places and a system that rounds everything to two corrupts every Kuwaiti amount it touches. Each charge line stores its own rate and the moment it was taken.
  • Separated duties. Draft, approved, issued, part-paid, paid, credited — and only Finance may issue, void or credit. An operations manager who can issue invoices is the segregation-of-duties failure an auditor asks about first.
  • Supplier bills. A scan, or a bill emailed in by a partner you already know, is read into lines and matched against what the job accrued. The variance is on screen before anyone approves it — which is where the argument with the agent belongs, not after the customer has been invoiced.
  • Documents. House bill of lading or air waybill, delivery order, packing list, customs pack, consolidation manifest. Bilingual, numbered from the issuing branch’s own series, released per document — released ones appear to the customer, drafts do not.
Receivables grouped by how late they are, largest exposure first

05 — The two that fall out

The clock nobody starts, and the decimal nobody keeps

Everything in this category quotes, books and invoices. These two are what quietly does not survive the trip from a demo to a Kuwaiti operation — the first because it needs a scheduled job rather than a screen to look at, the second because it needs a currency the product was not designed around.

One container: five free days, then KWD 28.000 a day

A step chart showing demurrage accruing day by day once free time ends0120240360480free timefirst charge line · KWD 28.000KWD 448.000day 036912151821days since dischargeKWD
The counter is started by a milestone arriving, not by somebody remembering. The first five days are free because the carrier said so; on the sixth a charge line is written against the job itself, for the amount that will later appear on a supplier invoice. Where a carrier’s tariff escalates rather than running flat, that is just a different rate table, not a different calculation. These are the demo’s own figures.

3 of 11 seeded currencies carry three decimals

  • KWD3 dp
  • BHD3 dp
  • OMR3 dp
  • USD2 dp
  • EUR2 dp
  • GBP2 dp
  • AED2 dp
  • QAR2 dp
  • SAR2 dp
  • INR2 dp
  • CNY2 dp

What this system stores

KWD 12.345

All three decimals kept, from the database through to the invoice

What a system built for dollars stores

KWD 12.35

The fils is not a rounding error, it is money in circulation: five of them on every line

The Kuwaiti and Bahraini dinar and the Omani rial carry three; the other eight carry two. This is the difference that never shows up in the home market of a system built for dollars and adapted afterwards: a global rounding to two corrupts every Kuwaiti amount it touches. Open any invoice in the demo — counting the decimal places is the fastest check on this page.

06 — Language

Bilingual, not translated

2,727 interface strings in Arabic and English, kept in sync, with right-to-left in the layout rather than bolted onto it. The quotation your customer opens in Arabic reads the way an Arabic document should, because it was built that way rather than mirrored.

The dashboard in English: four figures, the map, and the assistant, laid out left to right
English — left to right
The same dashboard in Arabic: the same four figures and the same map, laid out right to left
العربية — من اليمين إلى اليسار

Every product in this market was built in English and had Arabic added afterwards. You can tell within about four seconds, and so can your customer.

07 — Ownership and enforcement

Your database, your brand, your data

One deployment per customer — your own database in your own instance, not a shared table with a customer column in it. Inside that deployment, branch separation is enforced by the database rather than by application code that can forget one query: ask for another branch’s shipment and it comes back not found, because the row is never in the answer.

Three separate databases, one per customer and region, against a single shared table carrying a customer columnWhat we buildA forwarderKuwaitAnotherUAEA thirdEUno tenant identifier in the schema, because there is no second tenant in the databaseThe shape we did not buildtenant_idevery query must remember it — and one that does not is enoughrespectable engineering, and a different promise
One database per customer, in their own instance, in a region they choose and that goes into the contract. Inside it, branches are separated by row-level security in the database rather than by application code: ask for another branch’s shipment and it comes back not found, because the row is not in the answer at all.

The audit trail writes itself

Eighty database triggers, so a change that goes around the application is still recorded. Editing the audit is revoked from every account in the system — your administrator’s and ours alike.

Nothing is ever deleted

Records are superseded, closed or deactivated. The permission to delete does not exist on the account the application runs as.

The region is yours to pick

Kuwait, the UAE, Saudi Arabia or the EU, chosen by you and written into the contract rather than into a support ticket.

Your brand. Nowhere ours.

No colour, logo or company name is written into the product anywhere. The operator is a setting, so your customer never sees a supplier badge on anything.

Support cannot look without a grant

Access is granted by your administrator, scoped to named branches, against a ticket reference, and it expires on its own. A banner shows while it is open, and one click revokes it.

Verified, not asserted

88 tables, 197 policies, 80 audit triggers — counted against a live PostgreSQL 18.6, not estimated from a design document.

Seven seeded roles, six keys an auditor asks about

RoleIssue an invoiceCredit oneApprove a supplier billSplit a master costBook a jobClose one
Administratorgrantedgrantedgrantedgrantedgrantedgranted
Financegrantedgrantedgrantedgrantednot grantednot granted
Operations Managernot grantednot grantednot grantedgrantedgrantedgranted
Coordinatornot grantednot grantednot grantednot grantedgrantednot granted
Salesnot grantednot grantednot grantednot grantednot grantednot granted
Customs Brokernot grantednot grantednot grantednot grantednot grantednot granted
Read Onlynot grantednot grantednot grantednot grantednot grantednot granted
The two empty rows are not an oversight: Sales prices and closes enquiries and never issues an invoice, and a Customs Broker files declarations and never books a job. The Operations Manager issues nothing and approves no supplier bill — which is the separation an auditor asks about first. Administrator holds every key by design, including keys added later, so that a new transition cannot ship unreachable.

How each of those is implemented, and what is still open, is written out in the privacy policy and the data-processing addendum — both drafts, both pending review by counsel, and both honest about where the code and a standard clause disagree.

08 — The boundary

The whole of one job. Not a piece of everything.

This is the section the instinct says to bury, and it is the one that makes the rest of the page believable. Five things are outside the product by decision rather than by accident, and none of them is coming.

One record, six states, no exits — and what is deliberately outside it

An unbroken bar showing the six states of a job, and detached blocks beneath it for what is deliberately outside the productEnquiryQuoteAwardExecutionDocumentsInvoiceone record — never re-keyed into a second systemWarehouse managementPurchase ordersNative mobile appsKuwait customs filingMaster carrier documentsoutside the product by decision — not on the roadmap
The upper bar is unbroken because the job never leaves it: each state hands the next one everything it needs, so nothing is retyped and nothing can be retyped differently. The lower blocks are not a roadmap and not a shortfall — they are five decisions, each with a paragraph saying why. Somebody who genuinely needs one of them should know that today rather than in week three.
  • Warehouse managementInventory, locations, pick and pack. That is a product in its own right, not a module you bolt onto a forwarding platform.
  • Purchase orders and vendor managementIt sits on top of a working job platform, not beside one. Until the job platform is working, it has nothing to sit on.
  • Native mobile applicationsProof of delivery already works from a phone browser — signature, photographs, recipient and location. An app to do the same thing is a second thing to keep in step.
  • Direct customs filing in KuwaitClearance runs through MicroClear, which is not an API a forwarder can buy. We track declarations and estimate duty; we do not file them, and we are not planning to.
  • Master carrier documentsA master bill is the carrier’s document, issued on the carrier’s stock. House documents are ours, and those we generate.

What is in the product today, and what is on the roadmap with dates against it — UAE e-invoicing, Saudi ZATCA, the agent portal, WhatsApp, scheduled reports, live carrier tracking — is kept in one place rather than two: the boundary section above, which is read straight off the specification’s own build-status table.

The fastest way to judge this is to open it.

The demo is the build, running on a seeded dataset, with three sign-ins so you can see what your customer and your agent see as well as what you see. Nothing you do in it touches anything.