About the client
The client is a freight forwarding group working across eight European markets. It books road, European road, air, sea and rail cargo, runs three brands with a separate CRM behind each one, and takes 1,500 to 2,000 orders a month across all of its offices.
The challenge
Every order starts as an email. The customer writes the loading address, the goods, the dates and the price in plain text, usually with a PDF, a scan or a spreadsheet attached. A forwarder reads that email and types the same order into the CRM by hand. In one market alone, 20 people were doing this for more than 30 orders a day.
We put manual entry at 10 to 15 minutes an order, which makes the group’s monthly volume worth 250 to 500 hours of typing. That range is our estimate, not a figure the client measured.
The first version we built for them was a visual workflow of 46 nodes, and it handled one email at a time. Twenty forwarders sending at once was more than it could take, so the tool never reached daily use.
The solution
We rebuilt the agent as custom code on a dedicated server in Germany, and carried nothing over from the workflow tool.
A mail worker polls each mailbox. Every email is written to a run log first, so one message is processed exactly once and a retry never creates a second order. The body and the attachments are cleaned and read, scans and office documents included. An extraction agent pulls the freight mode, the ordering company, the loading and unloading places, the goods, the dates and the price, and a rules layer checks all of it against the client’s own freight rules and field names before a value reaches the CRM.

When something is missing, the agent asks the sender by email and waits up to 14 days for the answer. A reply on the same thread goes back into the same order, and a change the customer sends later updates the order in place. Once the order is created or changed, the sender gets the order number back.
The address an email was sent to decides which of the three CRMs receives the order and which language the reply is written in, one mailbox per market and eight in total.

The agent answers in nine languages, formally in Lithuanian, Latvian, Estonian, Polish and Czech, and informally in Danish, Swedish and Finnish. Orders are accepted only from the client’s own email domains, and each mailbox is switched on by an administrator in the dashboard.
AI agent capabilities
Reads order emails together with their attachments, including scans and spreadsheets
Covers five freight modes: road, European road, air, sea and rail
Creates the order in the right CRM and sends the order number back
Updates an existing order when the customer changes something
Asks the sender for what is missing instead of guessing, and holds the thread open
Reads a relative date such as “next Monday” against the customer’s own message, not the forward
Remembers each company’s places, contacts and standing instructions
Asks before booking when the email is a price request, a tender or a rate offer
Replies in nine languages, in the language the sender used
Tools & infrastructure used
Custom application code, no workflow tool
Dedicated server in Germany, HTTPS and nightly database backups
PostgreSQL for orders, the run log and per-company memory
Microsoft 365 mailboxes over OAuth2, so no mailbox passwords are held
Gemini 3.8 Flash for reading the email and its attachments
The client’s CRM API, three instances
A dashboard with sign-in through the client’s own Microsoft accounts
The results
One system across eight markets, three brands and five freight modes, where the first version covered one office and one CRM
Built for 1,000 emails a business day and 6,000 orders created or changed a month
1,097 automated tests, all passing
24 of the client’s own order emails run through one by one, with every mistake found and fixed
250 to 500 hours a month of manual order entry the system takes over