Blog Order entry No. 03
Automating sales order entry from customer POs
Most B2B suppliers receive the bulk of their orders the same way: a PDF attached to an email, sent to a shared mailbox. This article describes a workflow for getting those orders into your system without retyping them, and without losing the checks a good order desk applies.
The shape of the workflow
- Collect the attachments from the order mailbox.
- Read each one into structured data.
- Match the customer and the products to your own records.
- Decide: post automatically, or send to a person.
- Create the sales order.
- Keep a record of what happened to each order.
Steps 1, 3, 5 and 6 are ordinary integration work. Step 2 is the hard one, and step 4 is the one that decides whether you can trust the rest.
1. Collecting attachments
Most mail platforms can forward or expose attachments to a script. Common options are a rule that forwards to an automation tool, a scheduled job that reads the mailbox over IMAP or the Microsoft Graph API, or the attachment trigger in an integration platform you already use. Keep the original email with each order so a person can see the context if needed.
Skip what is clearly not an order: email signatures, logos, terms and conditions. File type and size filter most of these. A model will also tell you when a document does not look like an order; VioPO returns is_purchase_order: false in that case.
2. Reading the order
Send each PDF or image to the extraction API. With VioPO that is one request to POST /v1/extract, and the response holds the header, parties, addresses, lines and totals in a fixed format.
3. Matching to your records
The order tells you what the customer printed. Your system needs its own ids.
- Customer. Match on VAT number or company number first, then on the account reference the customer uses for you, then on name. Names alone are unreliable: "Northgate Joinery Ltd" and "NORTHGATE JOINERY LIMITED" are the same customer.
- Delivery address. Match against the customer's known delivery addresses by postcode, then by street. A new delivery address is worth a person's look.
- Products. If the customer prints your part numbers, match on those. If they print only their own, keep a cross-reference table per customer. Build it as you go: each time a person resolves an unknown part number, save the pair.
- Units. Convert the customer's unit to yours. Watch for pack sizes: "box of 200" against a product you sell each.
4. Deciding what to post
This is the step that makes automation safe. Post an order automatically only when all of these hold:
- every arithmetic check passed (line amounts, lines to subtotal, total);
- there are no warnings;
- the customer, the delivery address and every product matched;
- prices agree with your price list or the quoted prices, within a tolerance you choose.
Everything else goes to a review queue, with the PDF and the extracted data side by side, and the reason it was held. In most order books a minority of orders need a look, and the order desk spends its time on those instead of on typing.
5. Creating the sales order
Use your ERP's import or API. Put the customer's PO number in the field your system prints on delivery notes and invoices, so it flows through to the documents the customer expects.
6. Keeping a record
Store the request id, the decision and who approved it. When a customer queries an order months later, you want to see what was read, what was posted, and why.
Start small
Run the reading step alongside your current process for a week or two. Compare what was read with what your team keyed. You will see quickly which customers' orders read cleanly and where your matching tables need work.
VioPO is not open yet. You can see its output on three sample orders now, and join the waitlist to hear when you can send your own. The Free plan at launch reads 50 pages a month.