Your TMS, ERP or EDI flow speaks to Tendered through one shared contract. Map your columns once; every door lands the same way. Your engineer's AI agent can build the whole connection from the skill file.
| Shape | In plain words |
|---|---|
| Party | A company on a movement: the shipper you ran it for (customer), the forwarder above you when the row is a subcontract (forwarderCustomer), the subcontractor who ran it (carrier). |
| Lane | Exact loading and unloading — city and postcode, a country on both ends ("Lille 59000, FR → Essen 45127, DE") — with its equipment. |
| Rate | A stated rate is always scoped: it sits on a lane (exact loading and unloading, per trip) or on a corridor (zone to zone at the two-digit postcode level, a country on both ends, per km). The basis follows the precision. A shipment row carries its own lane, so the scope travels with the number. |
| Shipment | One executed movement: the lane, the day it ran, what was billed (shipperRateEur) and what was paid (carrierCostEur) as two separate fields, references, the truck, the driver, and the planned and actual hours of loading and unloading. |
Only what is known travels — absent fields stay empty, and every held-back or unreadable row comes back counted, by position, with its reason in words.
Each connection's door is its own unguessable token, minted inside Tendered, shown once and stored hashed. An unknown token answers 404 with nothing else said.
Post a sample, read what parsed, fix, repeat — then point the real sends at the webhook door. A sample batch (every company fictional, each rate on its own named lane):
[
{
"origin": "Lille 59000, FR",
"destination": "Essen 45127, DE",
"equipment": "Tautliner",
"date": "2026-07-14",
"shipperRateEur": 980,
"customer": "Nordwind Spedition",
"km": 320,
"sourceReference": "SHP-104233"
},
{
"origin": "Gent 9000, BE",
"destination": "Lyon 69007, FR",
"equipment": "Frigo",
"date": "2026-07-15",
"carrierCostEur": 1140,
"customer": "Bellamare Foods",
"km": 780,
"sourceReference": "SHP-104234"
}
]
The dry run's answer — counts, field names and reasons; your values stay yours:
{
"ok": true,
"dryRun": true,
"line": "2 rows read · 1 would land as executed shipments · 1 would be held back. Dry run — the workspace stays as it was.",
"rowsRead": 2,
"wouldLand": 1,
"duplicatesInBatch": 0,
"fieldsRecognised": [
"carrierCostEur",
"customer",
"date",
"destination",
"equipment",
"km",
"origin",
"shipperRateEur",
"sourceReference"
],
"columnsUnread": [],
"skipped": [
{
"row": 2,
"reason": "Carries what the carrier was paid. Executed history holds what the shipper was charged."
}
]
}
| Their column says | It lands as |
|---|---|
| From · Loading place · Pickup · Abgangsort | origin |
| To · Delivery city · Dropoff · Empfangsort | destination |
| Load date · Shipment date · Datum · Execution date | date |
| Sell rate · Revenue · Invoiced · Verkaufspreis | shipperRateEur |
| Buy rate · Carrier cost · Unit_Cost · Einkaufspreis | carrierCostEur |
| Rate · Price · Preis · Amount · Freight | a money value — a person confirms which side it is |
| Client · Shipper · Account · Kunde | customer |
| Order number · Consignment · Auftragsnummer | reference |
| ID · Record id · UUID | sourceReference |
| Trailer type · Vehicle type · Body type | equipment |
| Distance · Mileage · KM | km |
| Currency · CCY · Währung | currency |
Columns are mapped once per connection and remembered. A money column that names no side (Rate, Price, Preis, Amount) waits for a person to say whether it is the billed side or the paid side.
Connections with outbound enabled receive tender results as JSON: when a round closes or an award is accepted, the tender's lanes, the awarded companies, their splits and agreed volumes — the sender's own data only. Deliveries retry with backoff, and every run in either direction is a sync-log line the workspace can read.
Hand it the integration skill file — the contract, the doors, the dry-run loop and the mirroring semantics in one page — and it builds your side against us. Agents can also work a workspace directly over the Model Context Protocol; access is minted inside Tendered, in Setup.
Published by freight desks on Tendered.