A prototype we built for wholesale order desks. September to December 2025.
Order emails that turn themselves into quotations
An order arrives as an email, and somebody reads it, checks stock, retypes the lines into a quotation and remembers to reserve the stock. This prototype reads the email, matches the lines to a catalogue, reserves the stock, drafts the quotation and logs every decision it made.
3quantities per stock item: on hand, available and reserved
5screens in the hosted demo, from the inbox to the audit trail
A capture of the prototype, sample data.
The situation
An order arrives as an email. Somebody reads it, opens the stock system, checks what is available, retypes the lines into a quotation and remembers to reserve the stock. Wholesale order desks do this all day, and every prospect asking about automating it wanted to see the reading step working before believing it. So we built the whole desk, and left a log of what it decided.
What we built
A parser that takes the body of an order email, or an attachment, and returns a customer, a reference, a requested date and a set of lines
Line matching against a product catalogue, so a customer's own wording resolves to a stock item or is handed back as unmatched
Stock kept as three separate quantities, on hand, available and reserved, so an order can reserve without pretending it has shipped
Quotations generated from the parsed lines, each with one state and one available action
An audit trail that logs the parse, the quote and the reservation, including the ones that failed
An in-browser version of the reading step on this page, so a visitor can paste a sample order and watch it parse
The screens
Sample data.Captures of the prototype on sample data.
Email processing
The inbox side. Threads on the left each carry a state (new, parsed, processing) and, once parsed, the order they produced. On the right is the box an operator pastes a message into, and the control that takes an attachment instead.
Threads on the left, the parser on the right.
Stock
What an order actually moves. Each item carries three separate quantities, on hand, available and reserved, which is the distinction a spreadsheet loses first; the tabs beside it hold movements, suppliers and the reorder alerts.
Inventory, with on hand, available and reserved kept apart.
Quotations
The quotes the parsed emails became. The state on each row decides the action offered beside it: a draft can be sent, a sent quote can be accepted, an expired one offers nothing until it is reissued.
One state per quote, and one action per state.
Audit trail
Every action lands here with the actor, the operation and the item it touched, filterable by category, severity and date, and exportable. The failures are logged beside the successes rather than swallowed.
Every action, with who did it and what it touched.
Home
The prototype's home screen; the tiles are demo interface, sample data.
The prototype's home screen; the tiles are demo interface, sample data.
Email processing
What changed
The reading step, the part every prospect wanted to see before believing it, runs in the hosted demo and in the browser on this page. An order email becomes order lines, reserved stock and a quotation without anyone retyping it.
Try it
Sample data.Three invented order emails from fictional customers at example.com, and a five item catalogue held in this page. The parse runs in your browser and nothing is sent anywhere.
The message
Load one of the invented messages, or paste one of your own. Real text is fine: it stays in this tab.
A clean order. Everything the parser wants, in the shape it wants it.
A forwarded thread. Three quantity shapes, one item that is out of stock, one line nobody can read.
No order in it. A complaint, not a purchase order. Nothing should be drafted from it.
Headers are skipped. A line beginning with a dash is treated as an order line, and one that cannot be read is reported rather than guessed at.
3 lines read, 0 for a person, quotation QUO-0812 drafted
What the system would do
Sample data.
The header it read
Customer
Priya Raman
Reply address
priya.raman@example.com
Company
Harbour Row Supplies
Reference
PO-40812
Requested date
12 Sep 2025
The lines it read
Sample data.
Sample data. Order lines read from the message, with the quantity, the catalogue price and what the system would do with each.
Item
Qty
Line
What happens
Widget A (WID-A-001)
12
$300.00
12 reserved against this order
Widget C (WID-C-003)
30
$1,050.00
30 reserved against this order
Connector kit (CNK-D-004)
6
$75.00
6 reserved against this order
Quotation subtotal $1,425.00at catalogue prices, on every line that matched an item, including the ones there is no stock for. Availability is the column beside it, not a reason to leave a line off a quote. Sample figures.
What it would write to the audit trail
EMAIL_PARSED on the incoming message
QUOTE_DRAFTED on QUO-0812, 3 lines
STOCK_RESERVED on WID-A-001, 12 of 125 available
STOCK_RESERVED on WID-C-003, 30 of 65 available
STOCK_RESERVED on CNK-D-004, 6 of 40 available
What a person still has to deal with
Nothing on this message. That is what a clean order looks like, and it is the minority of them.
The parser reads order lines and nothing else. An instruction written in prose, such as asking for whatever is in stock, is left for a person by design rather than acted on.
Read next
Transcend Ltd, a UK wholesaler in perfumes and FMCG
The CSV or JSON export an ads-ops person opens every morning, aggregated per campaign, compared against the previous day, with what to look at first pulled to the top. 40 minutes of a person's morning, and a spreadsheet, before the prototype.
Workbook upload, validation rules, transforms, reports and notifications, with a simulated marketplace upload as the worked example, built in February 2026 for a prospect whose order workbooks were rejected by hand. 5 required fields checked on every row: order, customer, mobile, city and quantity.