Use caseAI agentWorkflow automation

Freight quote requests in four languages, answered in minutes and priced by your own rules

An AI agent for road freight forwarders that reads quote requests in German, Polish, Italian and English, prices lanes by your rules and drafts the reply.

A blueprint, not a client story. The business described is illustrative; the architecture, integrations and trade-offs are real, and this is how I would build it. By Ergini, .

The short version

An AI agent for European road freight forwarders that works the quote mailbox. It reads requests in German, Polish, Italian or English, extracts origin, destination, dates, pallets or loading meters, weight, ADR and temperature needs, and asks the customer for anything missing. Lane history, market data and your margin and floor rules, applied in code, produce the price. Routine quotes go out within set limits, while key accounts, dangerous goods and unusual loads go to a rep. Every outcome is logged for win and loss analysis.

Best for
Road freight forwarders and groupage operators whose sales desk retypes emailed quote requests into rate tools all day, in several languages.
Connects to
Outlook and Microsoft 365, TMS (Soloplan CarLo, Transporeon, CargoWise or similar), Freight exchange data (Timocom, Trans.eu; DAT in the US), HubSpot or the TMS customer record, Truck routing API (PTV or HERE), Teams or Slack
The AI does
Reads each request in whatever language it arrives in, fills the shipment fields, asks when something is missing, and writes the quote email.
People do
Reps own key-account quotes, dispatch signs off dangerous goods and temperature loads, and the desk lead sets margins and floors.
Built as
AI Agent Development, usually $12K - $30K

A quote desk that lives in the inbox

Consider a 25-person road freight forwarder near Augsburg moving full loads and groupage between Germany, Poland, Italy and the Benelux. Around 150 quote requests arrive every working day, most of them at one shared address, in German, Polish, Italian and English. Five people on the sales desk answer them, in between phone calls and carrier problems.

Each request is a small puzzle written in a hurry. 'Augsburg nach Verona, 6 Pal. nicht stapelbar, 4,2 t, Ladung Donnerstag' is complete. 'Can you do the usual to Poznan next week?' is not. The rep works out what is missing, looks up the postcode, converts pallets into loading meters, checks what the lane cost last month, opens the freight exchange to see where the market is, adds the margin that customer usually gets, and writes the reply. Then does it again.

Whoever answers first usually wins the load, and the desk knows it. So the quick, simple requests get answered and the awkward ones wait. The requests that need judgment, a new customer, a dangerous goods load, a lane nobody has run before, get the tired end of the day. And almost nobody records which quotes were lost, or to what price.

A request in Polish, and the quote that went back

A regular customer's dispatcher writes in Polish. The agent asks one question, prices the load by the rules, and hands the draft to the account's rep because this lane is new for this customer.

Quote mailbox, Tuesday 09:07

  1. Customer · Email, Polish

    Dzień dobry, prosimy o wycenę: Wrocław - Bolonia, 8 palet EUR, 5,1 t, załadunek 18.09, rozładunek z windą. Pozdrawiam, Marta

  2. extract_request(language: "pl")Wroclaw PL to Bologna IT, postcodes missing / 8 Euro pallets, stacking not stated / 5,100 kg / loading 18 Sep / tail-lift at delivery
  3. customer_lookup(sender_domain)customer since 2023 / tier B, not a key account / margin floor set / owner: Piotr
  4. ask_missing(fields: ["postcodes", "stackable"])question written in Polish / sent in the same thread / questions may go out automatically
  5. Customer · Email, Polish

    54-610 Wrocław, 40138 Bologna. Nie piętrować.

  6. plan_route(from: "PL-54610", to: "IT-40138", vehicle: "curtainsider with tail-lift")about 1,160 km / tolls computed per country / 3 working days per lane table
  7. loading_meters(pallets: 8, type: "EUR", stackable: false)3.2 loading meters / groupage, not a full load / tail-lift supplement applies
  8. lane_cost(lane: "PL-54 > IT-40", months: 6)4 comparable shipments / median cost per loading meter / exchange data 6 hours old
  9. price(customer: "tier B", loading_meters: 3.2)cost basis plus tier margin, above floor / valid 48 hours, fuel surcharge per floater / auto-send: no, first shipment on this lane for the customer
  10. Agent · Email draft for Piotr

    (Written in Polish.) Thank you, Ms. Marta. Groupage from 54-610 Wroclaw to 40138 Bologna: 8 Euro pallets, not stackable (3.2 loading meters), 5,100 kg, loading 18 September, tail-lift at delivery. Price EUR [price] all-in, transit three working days, valid for 48 hours, fuel surcharge per our current floater. This offer was prepared by our automated quoting assistant and checked by Piotr.

  11. Draft posted to Piotr in Teams with the lane history and margin visible. He sent it unchanged at 10:52, and the quote, inputs and later outcome are logged against the request.
The question went out on its own because asking is cheap. The quote waited for a person because the customer had never shipped this lane with the forwarder, and that limit is a rule, not a model's judgment.

How a quote request becomes a priced reply

One agent with a small set of tools. It reads and writes language; prices, limits and customer rules are code it calls but cannot change.

  1. 01 Trigger · Microsoft Graph

    A request arrives

    A Microsoft Graph subscription on the quote mailbox picks up each new email, including forwards from reps' own inboxes and PDF transport orders.

  2. 02 AI model · Structured output

    Read it into shipment fields

    The model extracts origin and destination, dates, pallet type and count or loading meters, weight, stackability, ADR details (UN number, class, packing group), temperature range and equipment needs such as a tail-lift, in whatever language the request is written.

  3. 03 Plain code · Routing API, TMS

    Normalize and identify

    Postcodes are geocoded and checked against each country's format, pallets are converted to loading meters, and the customer is identified from the sender's domain and the TMS. A repeat of a request already in progress is merged into it.

  4. 04 Decision

    Can this be quoted as it stands?

    Rules check completeness and scope before any price exists.

    • Postcode, date, quantity or stacking missing then one short question to the customer, in their language and thread
    • Key account, ADR, temperature-controlled, or a new customer then a rep or dispatcher takes it, with every field already filled
    • Complete and routine then on to pricing
  5. 05 System · TMS, Timocom or Trans.eu, PTV or HERE

    Look up cost and market

    Lane history from the TMS, current exchange data where available, distance and tolls for the truck route, and any rates agreed with this customer.

  6. 06 Plain code

    Price it by the rules

    Cost basis plus the margin for the customer's tier, never below the floor, with fuel surcharge, tail-lift and other supplements from the tariff table, and a validity period. The model never proposes a number.

  7. 07 AI model

    Write the quote

    The reply goes out in the customer's language and restates the shipment, so a misreading surfaces before a truck is booked. It says that an automated assistant prepared it.

  8. 08 Person · Teams or Slack

    A rep approves what exceeds the limits

    Quotes above a value threshold, under a margin target, or for a customer's first shipment on a lane arrive in Teams as a one-click approval with the lane history attached.

  9. 09 Result

    The outcome is logged

    Each quote is stored with its inputs, price and validity. Replies that say yes, too expensive, or nothing at all are classified and written back, so win and loss by lane can be counted instead of guessed.

Where freight requests trip up automation

Places that are not where they seem

'Frankfurt' is two cities, a Polish postcode written without its dash is still valid, and an Italian industrial zone can share a postcode with half a province. Addresses are geocoded and checked against each country's postcode format, and an ambiguous match becomes a question, never a guess.

Pallets, loading meters and stacking

Eight Euro pallets that can be stacked and eight that cannot are different shipments. Conversion runs in code (0.4 loading meters per Euro pallet loaded lengthwise, 33 to a full trailer), and a missing pallet type or stacking rule is asked for. Chargeable weight uses your own loading-meter factor, not a textbook one.

The market moves after the quote

Spot rates swing with the season, the day of the week and a closure at a border. Every quote carries a validity period, the fuel surcharge follows your floater, and when the exchange data behind a price is older than your limit, the agent drafts instead of sending.

The same request, three times

A customer emails the shared address, then a rep directly, then chases after lunch. Requests are fingerprinted on lane, date and quantity within a time window and merged, so one quote goes back. If the quote address also receives invoices and complaints, shared inbox triage sorts those out before the agent sees them.

Tail-lifts, ramps and delivery slots

A shop without a loading dock needs a tail-lift, and a distribution center may need a booked slot. 'Hebebühne', 'winda' and 'sponda idraulica' all mean tail-lift and the extraction knows it, but when the delivery site is unclear, the question is asked before the price is set.

Convincing new customers

Freight fraud often begins with a plausible first-time shipper. New senders are checked in code, VAT number through VIES, domain age, free-mail addresses, a company registry lookup, and a person approves the account and its credit terms before any truck moves.

What the agent may send on its own, and what it may not

Autonomy is granted per kind of request, and each kind earns it separately. The limits are configuration that the desk lead can tighten in minutes.

Missing informationAsks the customer directly, in their languageAutonomous from day one, because a question commits nothing
Routine lane, known customer, complete requestDrafts the quote for the rep to sendAfter four weeks of drafts sent unchanged, it sends within value and margin limits
A customer's first shipment on a laneDrafts, with the lane history attachedStays a draft; the next shipment follows the routine rule
Key accountFills the fields and drafts for the account ownerNever sends on its own
ADR or temperature-controlledExtracts UN number, class and packing group, or the temperature range, and hands overNever sends on its own
New customerRuns the checks and hands overOnly after a person approves the account and its credit terms
Automated quotes say plainly that an assistant prepared them. Article 50 of the EU AI Act has required that kind of openness from AI systems dealing with people since 2 August 2026.

Who owns which part of a quote

The AI model

  • Read requests in any language

    Dispatchers write in shorthand, in four languages, with abbreviations no TMS import has ever seen.

  • Write questions and quote emails

    Short and in the customer's language, restating the shipment so errors surface early.

  • Classify replies to quotes

    'Za drogo' and 'passt, bitte buchen' are outcomes, and outcomes belong in the log.

Plain code

  • Geocode, convert pallets, compute distance and tolls

    Physical facts, computed the same way every time.

  • Apply margins, floors and supplements

    Pricing rules sit in a table the desk lead controls, where no email can talk them down.

  • Decide what may be sent automatically

    Limits per customer tier, value and lane history, never the model's confidence.

A person

  • Key accounts and first-time lanes

    Relationships and new lanes are where a rep's judgment earns its keep.

  • Dangerous goods and cold chain

    ADR and temperature obligations need a qualified dispatcher's decision.

US freight AI, your TMS vendor's roadmap, or a build?

The well-funded products in this space, Vooma, HappyRobot and Parade among them, are built for US truckload brokers: English email, DAT rates, US load boards and US TMSs such as McLeod. If that is your business, buy one of them. Vooma's own figure is about five minutes saved per quote, a vendor claim but a fair picture of the unit of value.

European road forwarders are largely underserved. Requests arrive in German, Polish, Italian and Czech, rates come from Timocom or Trans.eu rather than DAT, and the TMS is CarLo, Transporeon or CargoWise. Your TMS vendor may add quoting features, and if they arrive and fit, use them. Until then a custom agent wins because the valuable parts are yours: the language mix, the lane history and the pricing rules.

Build it so the TMS stays the system of record and the agent sits in front of it, reading and writing through whatever interface the TMS offers. If the vendor ships something better later, the extraction and pricing rules move with you. The AI agent development page explains how I scope agents like this one, and the email automation post goes deeper into the inbox side.

How you would know it is working

A blueprint has no results to report, so here is what I would measure from the first week instead, on your own data.

Time to first quote
Minutes from request received to quote sent, by request type and by hour of the day.
Quotes sent without a rep
Counted only when the quote was not corrected or withdrawn afterwards.
Win rate by lane and response time
From the logged outcomes: which lanes you win, at what margin, and how much speed changes it.
Margin compliance
Quotes below target margin or floor. Zero for automated quotes, and explained for manual ones.
Questions per request
How often the agent must ask for missing data, per customer, which also shows who needs a better request template.

What a build like this costs

This is built as AI Agent Development, which runs $12K - $60K overall. A build like this one usually lands in the single-purpose agent tier: $12K - $30K, 2-5 weeks. The first working version runs on your real data well before the end of that window.

What it costs to run

Extraction and drafting cost a few cents per request, so 150 requests a day is a modest monthly line. Routing and geocoding APIs bill per call and are cached per lane. Freight exchange data comes from the subscription you already pay for.

What moves the price

  • Which TMS and how open it is: a documented API, a database you can read, or only exports and screens
  • How many languages and request formats, including PDF transport orders and Excel tender sheets
  • The pricing rules: one margin table, or tiers, floors, seasonal supplements and per-customer agreements
  • Rate data access: whether your freight exchange subscription includes an interface, or lane history alone carries the pricing

Who this is for

  • Road freight forwarders and groupage operators in Europe with a shared quote mailbox and requests in several languages
  • Sales desks where experienced reps spend their mornings converting pallets to loading meters and retyping postcodes
  • Forwarders on CarLo, Transporeon, CargoWise or similar, for whom US freight AI tools do not fit
  • Owners who cannot say which lanes they win or lose, or at what price

Questions people ask about this

Can AI answer freight quote requests automatically?

Yes, for routine requests from known customers, inside limits you set. The agent reads the request, asks for anything missing, and prices it by your rules in code. It only sends on its own when customer, lane and value fall inside those limits; key accounts, dangerous goods, temperature loads and new customers always go to a person.

How do I automate freight RFQ emails in several languages?

Extract into a fixed schema instead of translating. The fields (postcodes, dates, pallets, weight, ADR details, tail-lift) are the same in every language, so the model reads Polish, German or Italian directly into them. Replies go back in the customer's language with the shipment restated, so any misreading surfaces before a truck is booked.

Does it work with our TMS?

If the TMS has an API, the agent reads customers and lane history and writes quotes and orders through it. If it only offers exports or a readable database, the agent works from those and hands accepted quotes to the TMS. CarLo, Transporeon and CargoWise each need their own connector, which is a large part of the scoping.

Will it quote dangerous goods?

It prepares them but does not quote them. The agent extracts the UN number, class and packing group and flags the shipment, and a qualified dispatcher decides on vehicle, driver certification and price. Temperature-controlled loads work the same way. Those rules live in code, so no email can talk the agent into quoting them.

What happens after a customer accepts a quote?

The agent classifies the reply, marks the quote as won and creates the order in the TMS for dispatch to plan, or hands it to the rep where the TMS has no write interface. Loads to Switzerland or the UK also need export paperwork, which customs declaration drafting covers.

How long until the agent sends quotes on its own?

Usually one to two months after launch, one kind of request at a time. It drafts everything at first, and a request type earns automatic sending once reps have sent its drafts unchanged for several weeks. Some types, key accounts and dangerous goods among them, never get there, and that is by design rather than a gap.

Sources