How to Onboard a New Carrier From Their Rate Sheet, Without an API

Written by Martin Nivel · Founder of Cargavo Updated 12 min read

Onboarding a carrier without an API means turning the tariff file they emailed you into a structured rate grid, so your engine prices their lanes automatically. In Cargavo, a TMS for freight brokers, that is one carrier record plus one grid per tariff — roughly two hours of entry per carrier. What takes days is not the software: it is getting the carrier to answer the questions their rate sheet leaves open.

How do you onboard a new carrier without an API integration?

You create two records from the tariff they sent you: a carrier record holding the fuel index, option costs and vehicle constraints, and a rate grid holding the zones, brackets and prices. No connection is opened, no IT involvement is needed, and the carrier never has to do anything.

A carrier with no API is not an edge case in road freight, it is the normal case. A regional haulier running twelve trucks has no developer, no EDI department and no plan to acquire either. What they do have is a tariff — an Excel workbook, a PDF, occasionally a scan of a fax — and that file already contains everything needed to price their lanes.

Onboarding without an API means moving that file into two structured records. Cargavo, a TMS for freight brokers and transport commissionaires, enforces the order: a rate grid belongs to a carrier, so the carrier record has to exist first. One carrier can then hold several grids — domestic and export, or two validity periods — each with its own currency drawn from EUR, USD, GBP, CHF, CAD, MAD or PLN.

RecordWhat it holdsWhere it comes fromExample value
CarrierFuel surcharge indexTariff footer or monthly circular9.4 %
CarrierOption costsAccessorial page of the tariffTail lift 28.00 €
CarrierADR and insurance ratesAccessorial pageADR 12 %, minimum 45.00 €
CarrierConstraintsConditions of carriageMax 6 pallets, max 2.40 m length
GridZones and zone mapPostcode annexFR-30 to FR-34 → zone B
GridBrackets and ratesThe rate table itself2,000–2,999 kg → 21.40 €/100 kg
GridTaxable weight and roundingFootnotes1 LDM = 1,850 kg, round up to 10 kg

Notice how the table splits. Everything in the carrier record is a rule that applies to every shipment you buy from that haulier; everything in the grid is specific to one tariff document. That split is why a fuel index change is a single field edit rather than a re-entry of 200 prices, and why replacing next year's tariff does not disturb your option costs.

One operational habit is worth adopting immediately: leave the carrier flagged inactive while you build the grid. An inactive carrier is excluded from pricing, so a half-entered rate matrix cannot leak into a live quote at the exact moment a customer is watching. Flip it active only after the validation pass described further down. The wider comparison of connection methods is in the pillar guide on carrier integration for freight brokers.

How do you tell which rate grid model a carrier tariff is?

Read the column headers and the row labels, nothing else. Zones across the top with weight brackets down the side is weight_zone. Pallet counts down the side is pallet. Loading-metre brackets is mpl_bracket. A single price plus an "above X kg" line is hybrid_weight.

Before you type a single number, classify the sheet. Getting this wrong is the one mistake that cannot be patched later — the grid type determines the shape of the whole rate matrix, and changing it resets the matrix you already entered.

The diagnosis takes about five minutes and needs only two things: what the columns are, and what the rows are.

Columns areRows arePriced onGrid modelTypical carrier
Zone A, B, C, D0–99, 100–299 kgWeightweight_zoneGroupage and LTL networks
Zone or country1, 2, 3, 4 palletsUnit countpalletPallet networks
Zone or country0.1–0.5, 0.6–1.0 LDMFloor spacempl_bracketPart-load hauliers
One column of pricesA threshold plus a rate lineWeight, two regimeshybrid_weightRegional and express

Three complications appear often enough to plan for. First, a workbook with one tab per zone is still a single weight_zone grid — the tabs are columns that someone split. Second, a sheet whose rows read "0–99, 100–299, 300–499" is expressing upper bounds, and a sheet whose rows read "from 100, from 300" is expressing lower bounds; entering one as the other shifts every price by exactly one bracket, which is the single most common silent error in tariff entry. Third, some tariffs carry two models in one document — a weight table for consignments under 2,500 kg and an LDM table above it. That is two grids in Cargavo, both attached to the same carrier, and the engine simply prices whichever one covers the request.

Cargavo, a TMS for freight brokers, models exactly these four shapes because they cover what European road carriers actually publish. If the sheet in front of you does not fit any of them, it is usually a spot quote list rather than a tariff, and it belongs in the manual path described in quoting a lane with no rate grid. Full definitions of each shape are in the four types of freight rate grids.

Which tariff rules are not in the rate table itself?

The minimum charge, the taxable weight rules, the rounding step, the next-bracket comparison, the fuel index and the excluded postcodes. None of them appear in a cell. All of them change the price, and the loading-metre floor can change it by a factor of three.

The rate matrix is the part of a tariff everybody enters correctly, because it looks like data. The rules that convert a shipment into a lookup key are written in eight-point type under the table, in prose, and they are where onboarding actually goes wrong.

Here is the checklist, with the field each rule maps to and what happens when it is skipped.

Footnote ruleTypical wordingWhere it goesEffect if skipped
Minimum charge"Minimum 48.00 € per consignment"Grid minimumSmall consignments sold below cost
Loading-metre floor"1 metre of floor = 1,850 kg"Taxable weight, kg per MPLLight bulky freight massively underquoted
Volumetric ratio"1 m³ = 333 kg"Taxable weight, kg per m³Volume-heavy pallets underquoted
Rounding step"Weights rounded up to 10 kg"Rounding step and directionSmall, permanent under-recovery
Next-bracket comparison"The more favourable rate applies"Paying-for, built inYou overquote and lose the load
Fuel surcharge"Index published monthly"Carrier fuel percentageWhole surcharge line missing
Exclusions"Excluding islands and Corsica"Grid geographyQuotes on lanes the carrier refuses
Validity"Valid 01/03/2026 to 28/02/2027"Your review calendarQuoting last year's prices

Two of these deserve a comment. The taxable weight rules are not alternatives, they are a maximum: Cargavo takes the greatest of the actual weight, the loading metres multiplied by the kg-per-LDM figure, and the volume multiplied by the kg-per-m³ figure. Enter both floors when the tariff states both, and the engine will pick whichever governs for each shipment — see chargeable weight for the underlying concept.

The next-bracket comparison, known as paying-for, works in your favour rather than the carrier's: at 980 kg it may be cheaper to be charged as 1,000 kg at the next bracket's lower rate. Cargavo applies that comparison automatically on per-100 kg grids, so you do not enter it — but you do need to know it exists, because a broker who hand-checks a quote against the sheet and finds the engine "used the wrong row" has usually just met paying-for working correctly.

When the footnotes are ambiguous, ask before you guess. That email is covered field by field in the carrier onboarding checklist.

What actually takes time when you onboard a carrier from a rate sheet?

Not the typing. Entering a clean weight_zone tariff takes about two hours, most of it the zone map. The delay is human: one to five business days waiting for the carrier to answer what their own footnotes left unsaid, and longer when the tariff arrives as a PDF scan.

Brokers evaluating a quoting tool usually ask how long onboarding takes and get an answer in weeks. For a rate-grid approach the honest answer separates two clocks that run in parallel: your keyboard time, and the carrier's response time.

StepTypical timeBlocking?What makes it longer
Create the carrier record10 minutesNoAccessorials quoted "on request"
Classify the tariff shape5 minutesNoTwo models in one document
Enter zones and the zone map20–60 minutesNoA 400-line postcode annex
Enter the rate matrix20–45 minutesNoMerged cells, one tab per zone, PDF scan
Enter the footnote rules10 minutesNoRules written in prose, or absent
Ask the carrier your open questions1–5 business daysYesSales rep on the road, holiday season
Validate against past invoices30–60 minutesNoInvoices issued under an older tariff
Assign customers and go live10 minutesNoMargin rules not yet decided

Add the non-blocking rows and you get roughly one hour and 55 minutes to two hours and 50 minutes of work per carrier. That is the number to plan against. Everything else on the list is waiting, and the only lever you have on waiting is asking all your questions in one email instead of three.

Two situations genuinely cost more, and it is fair to say so. A tariff delivered as a scanned PDF has to be read cell by cell rather than copied, which roughly doubles the matrix entry — an eight-zone, twelve-bracket table is 96 numbers to transcribe and then proofread. And a carrier whose zones are defined by named regions rather than postcode ranges forces you to build the postcode mapping yourself, which is the one task that can exceed an afternoon.

Be clear about what Cargavo does today: entry is structured and guided in the grid builder, not an automatic parse of an arbitrary spreadsheet, because no parser reliably reads a workbook with merged cells and a hand-written note in the margin. Assisted onboarding, where the tariff is set up for you, is included from the Growth plan at 149 €/month. The mechanics of moving a spreadsheet into grid shape are covered in rebuilding an Excel rate sheet into a TMS, and the plan limits are on the pricing page.

What does the first quote off a newly entered carrier grid look like?

The calculation order is taxable weight, bracket lookup, margin, fuel, options. On the worked example below the carrier costs 547.74 € and the customer is quoted 711.33 €, a gross margin of 163.59 €. Skip one footnote and the same quote goes out at 348.49 €.

Take a real onboarding. The carrier sent a French domestic weight_zone tariff, per 100 kg, with a 48.00 € minimum charge and this excerpt for zones A to C.

Weight bracket (kg)Zone A (€/100 kg)Zone B (€/100 kg)Zone C (€/100 kg)
0–9962.0068.5074.00
100–29944.1048.6053.20
300–49938.2041.9045.80
500–99931.7034.9038.10
1,000–1,99925.4027.6030.20
2,000–2,99919.8021.4023.30
3,000–4,99917.4018.9020.60

The footnotes say: 1 loading metre = 1,850 kg, 1 m³ = 333 kg, weights rounded up to the next 10 kg, fuel surcharge 9.4 % this month, tail lift 28.00 € per delivery. The shipment to price is 3 pallets of 1.20 × 0.80 × 1.10 m, 620 kg gross, delivery in zone B, tail lift required.

  • Loading metres: 1.20 × 0.80 = 0.96 m², divided by 2.4 = 0.40 LDM per pallet, so 1.20 LDM for three.
  • LDM floor: 1.20 × 1,850 = 2,220 kg.
  • Volumetric floor: 3 × 1.056 m³ = 3.168 m³, × 333 = 1,054.9 kg.
  • Taxable weight: the greatest of 620, 2,220 and 1,054.9 = 2,220 kg, already a multiple of 10.
  • Transport, purchase: 22.20 × 21.40 = 475.08 €, above the 48.00 € minimum.

From there the engine applies the customer's 22 % margin to the transport line using p/(1−m), then the fuel surcharge on the resulting base, then the options at their sell price.

LinePurchaseCalculation (sell)Sell
Transport475.08 €475.08 ÷ (1 − 0.22)609.08 €
Fuel surcharge 9.4 %44.66 €609.08 × 0.09457.25 €
Tail lift28.00 €Customer option price45.00 €
Total547.74 €711.33 €

Gross margin 163.59 €, or 23.0 % of the sale — above the 22 % target because the fuel surcharge rides on the marked-up base and the tail lift carries its own margin. Now delete one footnote. Leave the LDM floor blank and the taxable weight stays at 620 kg, which lands in the 500–999 bracket at 34.90 €: transport 216.38 €, sell 277.41 €, fuel 26.08 €, tail lift 45.00 €, total 348.49 €. The carrier still invoices 547.74 €. That single unentered field costs 199.25 € on one shipment, and it repeats on every light bulky consignment until someone reads an invoice carefully. Loading metres are explained in LDM pricing, and you can check the geometry with the loading metre calculator.

How do you check a new carrier grid is right before you quote a customer?

Run five deliberate probes — a bracket boundary, a shipment under the minimum, a light bulky pallet, five postcodes across zones, and ten past invoices. Each targets a specific entry error, and a failure tells you which field is wrong rather than that something is wrong.

Testing a new grid by quoting a random shipment proves almost nothing: most requests land in the middle of a bracket where every version of the grid gives a plausible answer. Probe the edges instead, because that is where entry errors live.

ProbeWhat to quoteExpectedIf it fails
Bracket boundary999 kg, then 1,000 kgRate moves to the next rowBrackets entered as lower bounds
Minimum charge30 kg to zone B48.00 €Minimum left blank
Light bulky3 pallets, 620 kgTaxable weight 2,220 kgLDM floor left blank
Zone coverage5 postcodes, one per zoneEach returns a priceno_zone — mapping incomplete
Ceiling5,500 kgout_of_rangeA rate was invented above the table
Past invoices10 delivered shipmentsWithin about 1 % of the invoiceRounding step or fuel index wrong

The typed failures matter here. Cargavo, a TMS for freight brokers, does not return a blank screen when a price cannot be produced; it returns a reason — no_zone, out_of_range, on_request, constraint or invalid_grid. During validation those labels are a diagnostic. A no_zone on a postcode you know the carrier serves means the zone map is incomplete. A constraint failure means you entered a carrier limit — max pallets, max length, max loading metres — that this shipment breaches, which is the system doing its job rather than a bug.

The past-invoice test is the one that catches everything else, and it is worth doing on real paper. Pick ten delivered consignments moved with this carrier under this tariff version, re-price them, and compare against what was actually invoiced. Differences cluster into a short list: a rounding step you did not enter, a fuel index that changed between the shipment and today, an accessorial that was on the invoice but not in the request, or a paying-for comparison the carrier does not actually apply. A systematic gap of a few euros on every line is almost always rounding; a gap on one line only is almost always an accessorial.

Leave the grid inactive until every probe passes, then flip both the grid and the carrier to active. On the systematic version of margin protection once you are live, see margin-safe freight quoting.

How do you put a newly onboarded carrier in front of your customers?

Set the margin rules, activate the carrier, and it enters the comparison on every matching request automatically. Your customers never choose it and never see it: the portal shows one sell price under your brand, with no carrier name, buy rate or margin attached.

Going live is deliberately anticlimactic. Once the carrier and its grid are active, every quote request that matches the geography is priced against this grid alongside your existing ones, and the results are ranked. Nobody has to remember that a new option exists, which is the entire point of onboarding into a rate engine rather than into a folder.

Three decisions remain, and only the first one is really a decision.

  • The margin rule. Percentage margins use p/(1−m) so the result is a true margin on the sale rather than a markup on cost; absolute margins add a fixed amount. Rules can sit on the customer, on the grid, or on an individual bracket, which is how a strategic account and a spot customer end up at different sell prices on the same carrier. The trade-off between the two forms is in percentage versus fixed margin rules.
  • The option sell prices. A tail lift that costs you 28.00 € needs a sell price on the customer's pricing configuration. If none is set, Cargavo falls back to the purchase cost and flags a warning rather than inventing a number — so the quote is never wrong, but it is sold at zero margin on that line until you fix it.
  • Nothing about the portal. There is no per-carrier switch to publish, because the customer portal never exposes carriers at all.

That last point is worth stating plainly, because it is the reason brokers can onboard freely without renegotiating anything with their customers. In Cargavo, a TMS for freight brokers and transport commissionaires, the buy price, the margin and the carrier's identity live in a private financial record attached to the quote, governed by broker-only access rules — not merely hidden in the interface, but unreadable by a customer account. Your customer sees a sell price, a reference in the Q-YYYY-NNNN series and a validity date. Which haulier you bought from is your commercial position, and it stays yours; see showing a price without revealing your buy rate.

Adding a carrier therefore changes what your customers pay, never what they see. The accepted quote converts into a shipment in the S-YYYY-NNNN series exactly as before. More onboarding material is collected in the carrier onboarding guides.

What can you not do without a carrier API or EDI connection?

Four things: check live capacity, refresh the tariff automatically, transmit the booking to the carrier, and receive a tracking feed. A rate grid gives you pricing, not connectivity. For a brokerage buying from regional hauliers, pricing is what was missing anyway.

Rate-grid onboarding is a deliberate trade: you gain the ability to price every carrier you buy from, including the ones that will never build an integration, and you give up the things that only a live connection can provide. Being precise about the boundary is what makes the approach trustworthy.

CapabilityNeeds a connection?What you do instead
Price a lane instantlyNoThe rebuilt grid prices it
Compare carriers on one requestNoEvery active grid is evaluated
Check live capacity or spaceYesPhone the carrier, as today
Receive a new tariff automaticallyYesEdit the grid when it arrives
Send the booking to the carrierYesEmail or their own portal
Pull a tracking feedYesRecord the status yourself

The tariff refresh row is the one that needs a habit rather than a workaround. A grid does not know its tariff expired, so the validity date belongs in your calendar: when the carrier issues a new version, you edit the rates in place, and the fuel index is a single field you update when the monthly circular lands. For a broker running eight to fifteen carriers, that is a short recurring task, not a project.

It is equally important to say what Cargavo, a TMS for freight brokers, is not. It is not a load board or freight exchange, so it will not find you a carrier for a lane you have no tariff on — that request follows the manual path instead. It is not a procurement or tendering marketplace, not a fleet management or dispatch system, and not an accounting package. It prices what you have negotiated and tracks what you sold.

Which leaves a fair summary of the trade. If your carriers are large integrators publishing real APIs, a connected approach buys you capacity and tracking that a grid cannot. If your carriers are the regional hauliers most brokerages actually depend on, there is no API to connect to, and the tariff file is the integration — see quoting regional carriers that have no API. Ten grids are included on Starter at 49 €/month, 50 on Growth at 149 €/month and 200 on Scale at 399 €/month, with a 14-day free trial and no credit card.

Frequently asked questions

How do I onboard a carrier that has no API?

Create a carrier record for the fuel index, option costs and constraints, then enter their tariff as a structured rate grid. Nothing is connected and the carrier does nothing — the Excel or PDF tariff they already send you is the integration. Cargavo supports this from the Starter plan at 49 €/month, which holds 10 grids.

How long does it take to set up a new carrier in a TMS from a rate sheet?

About two hours of entry for a clean weight_zone tariff: 10 minutes for the carrier record, 20 to 60 minutes for the zone map, 20 to 45 minutes for the rate matrix and 10 minutes for the footnote rules. The unpredictable part is waiting one to five business days for the carrier to clarify their own small print.

What do I need from a carrier before I can quote their rates?

The rate table, the postcode-to-zone annex, the accessorial prices, the fuel surcharge index and the validity dates. Without the zone annex the grid returns a no_zone failure on every destination, and without the taxable weight footnotes the prices will be wrong on light bulky freight.

Can I rebuild a carrier rate sheet from Excel automatically?

Cargavo uses a guided structured grid builder rather than an automatic parse of an arbitrary spreadsheet, because merged cells, one tab per zone and hand-written margin notes defeat generic parsers. Assisted onboarding, where the tariff is entered for you, is included from the Growth plan at 149 €/month.

Do my customers see which carrier I onboarded?

No. The carrier identity, the buy price and the margin live in a private financial record attached to the quote, readable only by broker accounts. The customer portal shows a sell price, a Q-YYYY-NNNN reference and a validity date under your own branding.

What happens when the carrier sends a new tariff version?

You edit the existing grid rather than rebuilding it, because the carrier record with its option costs and constraints is separate from the rate matrix. A fuel index change is a single field. Put the tariff validity date in your calendar, since a rate grid has no way to know its prices expired.

Related guides

More guides on this topic — Carriers & onboarding