At a glance
- Validate before the order posts, not after: match the customer, ship-to, item, unit of measure, price, and credit status against the ERP's own master data.
- A validation rule table below sets out ten checks — field, check, source of truth, and action on fail — to start from for your own build.
- Start every order in a not-yet-confirmed status, and let a reviewer move it to open or confirmed; never post straight to a status that's ready to ship.
- A new ship-to address goes to a reviewer, not straight onto the order; add it through your own customer-maintenance process if it's genuinely new.
- A parallel run ends when every exception you handle has gone through correctly across more than one ordering cycle for your highest-volume customers, not on a fixed calendar date.
What fields must be validated before an order posts?
A sales order should post only after the fields that drive fulfillment, invoicing, and credit have been checked against your ERP's own records, not just read off the page. The table below sets out ten checks: what to validate, the system of record for that check, and what the workflow does when the check fails.
| Field | Check | Source of truth | Action on fail |
|---|---|---|---|
| Customer identity | Buyer name or account number matches an existing customer | ERP customer master | Escalate to confirm or create the customer |
| Ship-to address | Delivery address matches one already on the customer record | ERP customer master (ship-to list) | Hold for reviewer approval before adding a new address |
| Item or SKU match | Item description or customer part number resolves to one item record | ERP item master and cross-reference | Escalate; never substitute a closest-looking item |
| Unit of measure | PO unit matches a unit the item actually supports (each, case, pallet) | ERP item master UoM table | Hold; a wrong unit silently multiplies or divides the quantity |
| Unit price | PO price matches the customer's active price list or contract | ERP price list or contract record | Escalate for the price-exception decision |
| Quantity | Quantity meets the item's minimum order and pack-size rules | ERP item master | Hold and ask the customer, or round only per a documented rule |
| Requested date | Date is on or after the earliest date the item can ship | Inventory availability or lead-time table | Hold and propose an alternate date to the reviewer |
| Currency | PO currency matches the customer's billing currency on file | ERP customer master | Escalate; a mismatched currency changes the amount due |
| Credit status | Customer account has no open credit hold | ERP credit management or customer record | Route to credit or collections before proceeding |
| Duplicate PO number | PO number hasn't already been entered for this customer | Existing sales orders for that customer | Flag as a possible duplicate; don't create a second order |
Validating your own business rules is separate from what the ERP itself enforces. NetSuite's REST web services expect the create request to contain "values for at least each mandatory field of the given record type" [1], so the create step depends on NetSuite's own required fields as well as the ones your table checks.
Where that data lives is specific to the ERP. Business Central's sales order schema carries separate ship-to and bill-to address fields, and a currencyId field that specifies which currency the sales order uses [3] — real fields like billToName, shipToName, and sellToAddressLine1 [4], not free text.
The email-to-ERP order workflow
The validation table above is one stage in a longer pipeline, from a purchase order landing in an inbox to a confirmed order ready to ship. None of it requires replacing the ERP itself; where an older system has no modern API, automating legacy systems without migration covers the broader options.
- Receive and classify
Monitor the order inbox and classify each message: a new PO, a change, or something else.
- Extract the content
Pull the customer, ship-to, item lines, quantities, unit of measure, price, date, and PO number.
- Match against ERP master data
Look up the customer, ship-to address, and each item record by record, not with one fuzzy match.
- Run the validation table
Check every field the way its row above says to, one check at a time.
- Create a draft order
Submit the record through the ERP's own create operation, in a not-yet-confirmed status.
- Route exceptions
Send anything on hold to a reviewer queue with its reason code and every candidate value side by side.
- Reviewer confirms or corrects
The order desk resolves exceptions; only then does the order move to confirmed or open.
- Acknowledge to the customer
Send a confirmation referencing what was actually booked, once the order is confirmed.
- Log the record
Keep the document, extracted values, validation results, and reviewer decision together.
The create step differs by ERP. NetSuite's REST web services describe themselves as giving CRUD — create, read, update, delete — operations over records in general [2]; the rows below map that onto a sales order, but confirm exact fields against your own version's documentation.
| ERP | What the workflow creates against | What to confirm first |
|---|---|---|
| NetSuite | SuiteTalk REST web services create operation for the sales order record | The request is expected to include a value for every mandatory field before the create call [1] |
| Dynamics 365 Business Central | The salesOrder API resource's own create (POST) method | Which documented status (Draft, In Review, Open) a newly created order shows, and who moves it on [3] |
| SAP Business One | Check SAP's own integration documentation for your Business One version (object and fields vary by version) | The exact object and fields, confirmed with your SAP partner |
| Epicor Prophet 21 | Check Epicor's own integration documentation for your Prophet 21 version (fields vary by version) | Field names and required values, confirmed with your Epicor partner |
Should the agent create draft or confirmed orders?
Create every order sourced from email or a PDF as a draft, never as a confirmed, ready-to-ship order. Business Central's own sales order schema already models this distinction: its status field is explicitly "Draft," "In Review," or "Open" [3] — the order exists in the system before anyone has confirmed it's correct.
Pick an ERP status that lets downstream checks — credit, tax, warehouse allocation — run without reserving inventory or sending a confirmation, and confirm how your ERP treats it before go-live. Moving a draft to confirmed should require a named reviewer, every time, regardless of how clean the extraction looked.
- Narrow full review to the fields a given customer or order type has a history of getting wrong, instead of reviewing every field on every order.
- Keep a named reviewer required for any order the table flags for a credit hold, a mismatched price, or a new ship-to, however long the workflow has run.
- Keep a sampled audit of orders that passed with no exceptions, so a quiet failure doesn't go unnoticed.
How do you handle a new ship-to address?
Treat any delivery address that doesn't match one already on the customer's ERP record as new, and never create it automatically — the order holds instead, the same way a mismatched price or item does.
- What the reviewer sees: the requested address next to every address already on file for that customer, not just a yes-or-no result.
- What the reviewer decides: whether it's a near-duplicate, such as a dropped suite number, or a genuinely new location.
A genuinely new address gets added through your own customer-maintenance process, not through the order-entry workflow itself. That keeps address governance in one place, so the next order to that address matches cleanly.
How long does a parallel run take?
There's no fixed number of weeks that fits every rollout. A parallel run is long enough once every exception category the validation table handles — a credit hold, a price mismatch, a new ship-to — has occurred and been handled correctly, across more than one ordering cycle for your highest-volume customers.
- Run the new workflow alongside the existing manual process, not instead of it, until that bar is met.
- Compare every order the workflow would create or hold against what a person actually did with the same PO, and give every difference a reason, not a shrug.
Where to start: a first scoped workflow
Start with one ERP and one order type, not every customer and format at once. A strong first candidate is the highest-volume, lowest-variation order type — a standing reorder of catalog items from an established customer — which proves the workflow quickly without the edge cases a custom order brings.
- Every field above has a documented source of truth and action on fail, agreed with the order desk.
- The ERP connection creates orders in a draft or not-yet-open status only; nothing in the workflow confirms an order itself.
- A reviewer queue shows the PO image, the extracted values, and the reason for every hold, in one place.
- The parallel run has covered every exception category, with every difference explained.
- A rollback path exists: the order desk can return to entering these orders by hand if the workflow is paused.
The same hold-and-escalate pattern runs through document review with human approval, built around a legal or compliance playbook instead of an ERP validation table.
When this doesn't apply
- Your order volume is low enough that a person keys every PO in a few minutes, and errors are rare; the review infrastructure costs more to build than it saves.
- Nearly all of your purchase orders already arrive through EDI or a customer portal that writes into the ERP directly, and email or PDF is the exception.
- The documents arriving aren't firm purchase orders yet — they're quotes or RFQs under negotiation, which belong in your sales process, not an order-entry pipeline.
- Your ERP itself runs on an interface with no usable API; start with legacy finance workflow automation for the integration patterns that apply there.
Frequently asked questions
What happens when a PO has a price the contract doesn't allow?
The order holds at the price check instead of posting at either number. The reviewer sees the PO's price next to the contract or price-list price, decides whether to honor the contract price, call the customer about a quoting error, or approve a documented exception, and that decision is recorded against the order.
Can the workflow write the order directly into NetSuite?
Yes, through NetSuite's own REST web services create operation. That interface expects a value for every field NetSuite's schema marks mandatory, so a build still needs every ERP-required field filled in, not only the fields your own validation table checks.
What happens if the extracted item number doesn't match anything in the ERP?
The line holds rather than posting against the closest-looking item. The reviewer sees the PO's description and part number next to the closest matches the item master returns, and picks the correct item, adds a cross-reference for next time, or rejects the line as unrecognized.
Does this replace EDI for customers who already send structured orders?
No. A customer already sending structured EDI or portal orders doesn't need this workflow; it exists for purchase orders that still arrive as an email or a PDF attachment. We recommend running both side by side: structured feeds where they exist, and this workflow for everyone else.
How do you handle a PO that arrives as a scanned image instead of a text PDF?
It goes through the same extraction step, reading the scan the way it reads a text-based PDF, with lower expected confidence on fields the scan quality makes hard to read. Fields below your confidence threshold are treated as unresolved rather than guessed, and route to a reviewer with the image attached.
Related reading
- Document review with human approval applies the same hold-and-escalate pattern to contracts.
- Legacy finance workflow automation covers patterns for a finance platform with no modern API.
- Automating legacy systems without migration goes deeper on an older system's existing interfaces.
- Handling missing data in document automation generalizes the abstain-and-escalate logic above.
- AI agent implementation describes how a workflow like this is scoped and handed over.
Sources
- [1] — NetSuite Applications Suite, "Creating a Record Instance" (REST web services) (accessed 2026-09-30)
- [2] — NetSuite Applications Suite, "Overview of SuiteTalk REST Web Services" (accessed 2026-09-30)
- [3] — Microsoft, "salesOrder resource type" (Business Central API reference v2.0) (accessed 2026-09-30)
- [4] — Microsoft, "Get salesOrders" (Business Central API reference v2.0) (accessed 2026-09-30)
More in Document intelligence
340B Program Documentation: Where AI Agents Reduce Audit Risk (Not Replace Compliance Officers)
How AI agents can assemble 340B program documentation, from split-billing records to contract pharmacy files, while your compliance officer keeps each decision.
Pharmacy ChainsChargeback and Returns Dispute Document Automation for E-Commerce Brands
Chargeback and returns dispute automation for e-commerce: a step-by-step dispute-document workflow and evidence table, with submission kept with your staff.
Ecommerce OperationsJoint Interest Billing and Land/Lease Administration Document Automation for Independent Energy Operators
Joint interest billing automation for independent operators: a lease-to-distribution workflow showing what an agent drafts and what staff approve.
Utilities and Energy Companies