Expedion × Expeditoo: one logistics group, two products, one source of truth
One French logistics group runs two brands. Expedion ships lots won at auction to the buyer's door; Expeditoo is the carrier network that picks up the jobs the group's own drivers cannot take. PRIONATION built both on one database: an LLM vision model reads the auction invoice, a shared pricing service quotes it, a paid job with no driver after 48 hours is posted automatically to verified carriers, and their delivery updates flow back into the buyer's tracking.
Expedion and Expeditoo belong to the same French group. Expedion is the buyer side: someone who has just won a lot at an auction house sends the auction invoice (the bordereau d'adjudication), gets a fixed delivery price, pays online and follows the delivery. Expeditoo is the carrier side: a web platform where verified transport companies bid on the jobs the group's own drivers cannot take.
PRIONATION built both products — the Expedion app in Flutter and the Expeditoo platform in Next.js — and the integration between them. This page covers how the two share one system, where AI actually sits in it, and what was deliberately left out. Business results will be published once the client has measured them.
Two businesses, one shipment
An auction buyer and a carrier want different things from the same job. The buyer wants one fixed price, a pickup before storage fees start running at the auction house, optional insurance on the lot, and a single place to follow the delivery. The carrier wants a clear brief, a fair price for the run and a guaranteed payment. Expedion serves the first; Expeditoo serves the second.
The group's own drivers handle what they can. The hard part is the overflow: when the fleet is full or the run is specialised, the job has to reach an outside carrier quickly — without anyone re-typing the order, re-quoting it, or losing track of where the lot is.
Reading the auction invoice with a vision model
The slowest step to do by hand is the first one: working out what was bought, where it sits and what it is from a PDF or a phone photo of the auction invoice. Expedion sends that document to an LLM vision model — OpenAI's GPT-4.1 at temperature 0, constrained to a strict JSON schema — with Gemini as a fallback provider. The buyer then reviews the extracted details on a confirmation screen before any quote is made.
The model also reports its own confidence. Below a fixed threshold, the upload is treated as not being an auction invoice at all and the buyer is asked for the right document. If the extraction service is unavailable, the request still goes through with a notice and the slip is checked by a person — an outage slows the funnel down instead of closing it.
One database, one price, one tracking feed
Both products run on the same PostgreSQL database. An Expedion quote and the Expeditoo listing it may become are linked records, not two copies kept in sync — the founding architecture decision, because escalating a job across two databases would have been a distributed transaction waiting to go wrong. Expedion previously ran on Airtable; its 4,656 existing quotes were migrated into the shared database in September 2026.
Prices come from one place too: Expedion's automatic quote reuses Expeditoo's pricing service, so the two products can never quote the same run differently. And when an outside carrier takes a job, their status updates are written back to Expedion, so the buyer follows one delivery feed whether the driver comes from the group's pool or from the carrier network.
Escalation without a dispatcher
When a buyer pays, the quote is stamped with a deadline 48 hours out. Every ten minutes a scheduled job looks for paid quotes that still have no carrier after that deadline and posts each one to Expeditoo as a listing that carries its Expedion reference. Operators can also escalate a job by hand from the admin console, next to assigning a driver, re-pricing a quote or managing storage.
On Expeditoo, carriers send offers with a price, an ETA and a vehicle, and an operator awards the escalated jobs. Carrier verification is document-based — SIRET number, insurance certificate, transport licence, ID and bank details — and an administrator approves each account before it can bid.
Money moves only when a person says so
On the buyer side, payment goes through Stripe Checkout, and the server confirms each session with Stripe before reporting the payment to Expeditoo. On the carrier side, Expeditoo keeps a 10% commission and credits the rest to the carrier's balance. A carrier can request a withdrawal from €20; an operator makes the bank transfer and records its reference. Nothing in the platform moves money automatically.
That rule is deliberate. Automating payouts would have meant choosing a payment rail and a legal framework for paying drivers before the business had settled either — a question that sits with the client's lawyer. A manual step with a recorded reference is slower, but every payout has a person and a bank reference behind it.
Engineering that holds up in production
Expeditoo runs on Next.js with Drizzle and PostgreSQL on Neon, Better Auth, Stripe, Cloudflare R2 for documents and Resend for email, hosted on Vercel; the operator dashboard refreshes from Ably signals rather than polling. Expedion is a Flutter app that signs in through the same auth service with a bearer token — a native app has no browser cookie jar — and keeps a narrow Firebase fallback so accounts created before the migration still work.
The platform is covered by Vitest and Playwright, with 2,655 unit tests passing in the latest recorded run, and Expeditoo is in production at version 2.63. Small constraints shaped real decisions: uploads are capped at 3 MB to stay under the hosting body limit, HEIC photos are refused because the vision API rejects them, and the escalation sweep runs on GitHub Actions because the hosting plan limits scheduled jobs.
What was deliberately not built
Expeditoo began in 2025 as a broader marketplace that also auctioned goods. The 2026 rebuild dropped that: no goods auctions and no public marketplace to browse — every job on the board is a real Expedion shipment. Carrier tracking APIs, auction-house integrations, a native iOS app for carriers and other countries were also left for later.
Several questions stay open on purpose: the commission split on escalated jobs, the vendors for insurance and identity checks, and route publishing and matching. Carriers can already filter the board along a route they drive, but matching comes after bidding by design — bidding is the product, routes make it more efficient later. Each of these is easier to decide once real jobs are flowing through one shared data model.
The transferable lesson
Two products that serve two sides of the same transaction should share a spine, not an integration. Here the spine is one quote record, one pricing service and one tracking feed; the buyer's app, the carrier's board and the operator console are views on top of it.
The AI sits where a person was doing slow, error-prone transcription, it reports its own confidence, and the funnel keeps working when it fails. That is usually the right shape for a first AI feature in an operations business: narrow, checkable, and never alone on the critical path.
Frequently asked questions
What did PRIONATION build for Expedion and Expeditoo?
Both products and the link between them: the Expedion buyer app (Flutter), which reads the auction invoice, quotes a fixed price and tracks the delivery; the Expeditoo carrier platform (Next.js), where verified carriers bid on escalated jobs; and the operator console that runs both.
How does the auction-invoice reading work?
An LLM vision model (GPT-4.1, with Gemini as a fallback) extracts the lot and pickup details into a strict JSON schema with a confidence score. The buyer confirms the details; low-confidence uploads are rejected as not being an auction invoice, and if the service is down a person checks the slip.
When does a job go to an outside carrier?
When a paid quote still has no driver 48 hours after payment, or when an operator escalates it. A scheduled sweep posts it to Expeditoo automatically, and the carrier's status updates are written back to the buyer's tracking.
Are Expedion and Expeditoo separate companies?
No. Both brands belong to the same French logistics group: Expedion is the front door for auction buyers and Expeditoo is the group's carrier network.
Where are the business metrics?
Not published yet. What is documented is engineering-side: 4,656 existing quotes migrated into the shared database, 2,655 unit tests passing, and Expeditoo live in production at version 2.63. Operational results will be added once the client has measured them.
Start with a Diagnostic
Two weeks. €5,000. A mapped bottleneck and a production-ready plan — with no obligation to proceed to a Build.
Start a Diagnostic →