TL;DR
The Sales Order Agent keys orders from incoming requests. What it reads, what it passes over, and where it stops and hands the work to a person.
It reads the email — subject, body and attachments — then searches your item catalogue across seven tables. What it skips is the more interesting half: a relevance model discards messages before processing, a second check discards non-sales attachments, and it refuses to identify a customer by name at all.
What does it actually read?
The email first, in three parts. Microsoft's description of the trigger:
"the agent analyzes the email—including subject line, body, and attachments (if configured)—to identify quote requests and extract relevant details. Attachments can be PDF or image files."
*Note "if configured".* Attachment reading is a setting, so an agent that appears to ignore a purchase-order PDF may simply not have been asked to open it.
Then your catalogue, in three passes. Microsoft calls it "a multi-layer strategy to find the best matching items":
| Pass | What it matches on | Microsoft's own note |
|---|---|---|
| Exact identifier | item number, vendor item number, GTIN, cross-references | "Exact identifier matches have the highest confidence" |
| Semantic attribute | colour, material, size from the customer's message | "AI to rank candidates by relevance" |
| Broader fuzzy search | everything | "falls back to a global search across all items when the direct and attribute-based searches don't produce results" |
And it reads across seven tables to do it — Items, Item Variant, Item Reference, Item Attributes, Item Category, Item Translation, Item Identifier — plus extended text lines.
Which makes item-data quality the lever, and Microsoft says so plainly: "the quality of product information in Business Central affects its effectiveness… You can improve the agent's ability to find products by enhancing descriptions, attributes, categories, and extended text." That is a data job, not an AI job, and it is the one thing on this page you can act on tomorrow.
What does it refuse to read?
Two filters, and both run before any processing happens.
"The agent validates incoming messages and attachments against a relevance model before it processes them. The relevance model filters out messages that are outside the agent's scope. For example, it filters out offers to sell, discount requests, or attempts to access internal data."
Read that third example again. Attempts to access internal data is not a relevance problem — it is a prompt-injection defence, sitting in a paragraph about scope.
The second filter is about attachments:
"A separate check runs on attachments to ensure non-sales-related documents don't trigger unnecessary processing. For example, if a customer attaches terms and conditions or a privacy policy alongside a purchase order, the agent processes only the purchase order and ignores the non-sales attachments."
And for anyone building on this: "The agent's prompt instructions, including the relevance and item-search rules, are included in the Sales Order Agent extension source code. Partners can inspect these prompts." That is unusually open — the filtering rules are readable rather than opaque.
How does it decide who the customer is?
By email address, and by nothing else — deliberately.
"For security, the agent identifies contacts exclusively by matching the sender's email address to the E-Mail field on contact cards. It doesn't search by contact name, company name, or other fields when establishing the security context. This restriction prevents unauthorized parties from impersonating a customer by using a similar name."
This is the sharpest design decision on the page. Name matching would be more forgiving and more useful — and it would let anyone who can spell a customer's name request that customer's pricing. Microsoft gave up the convenience.
The scope rule that follows from it: "The agent ensures that a request from one customer can't be about another customer's requests" — once identified, the agent filters to documents belonging to that customer alone.
The practical consequence is a support call waiting to happen, and Microsoft names it: "If you can see a contact in your contact list but the agent reports it as not found, check whether the contact's E-Mail field matches the address the customer sent from."
Does a person see the message before the customer does?
Yes. Every time — and this is stronger than it first appears.
The overview section describes human involvement softly: "Involvement might be needed in specific scenarios, for instance to review outgoing messages… based on configured preferences." Read alone, that sounds like a setting.
It is not. Further down the same page:
"The agent always involves designated Business Central users to review and approve all outgoing messages before it sends them to customers."
### The process flow settles it Microsoft's general flow alternates every single time: agent prepares → Reviewer reviews/confirms → agent sends. It happens for the quote email, for the order confirmation, and for the incoming request. There is no send step in that flow without a review step in front of it.
So the human checkpoint is on the outbound boundary, and it is not yours to remove. For the agent that writes to people outside your company, Microsoft hard-wired the gate rather than shipping it as a preference — which is the same internal-versus-external line that runs through where the built-in agents stop.
Why does it always create a quote first?
Because a quote is inert, and Microsoft explains the reasoning rather than just stating the rule:
"The agent always creates a sales quote as the first step, even when the customer asks for an order. Sales quotes have no impact on planning, reservations, availability calculations, or cash flow forecasts, which makes them a safe intermediate document for AI-assisted processing."
That is the most transferable idea on the page. The agent is not trusted with a document that moves supply; it is given one that moves none of those four things, and a person promotes it. If you build an agent against any ERP, look for your equivalent of the quote — the document that records intent without consuming anything.
Whether the customer ever sees it is the configurable part, and the setting names are published: "To configure the agent to go straight to orders, turn off Send quotes for confirmation and turn on Make orders from quotes in the agent setup."
What actually bites in practice?
Three things, all documented, none of them about extraction accuracy — unlike the Payables Agent, whose published limits are about the documents themselves.
Forwarding breaks identification. "When you forward an email to the agent's mailbox, the agent uses the forwarder's email address (not the original sender's) for contact lookup. If an internal team member forwards a customer's email, the agent doesn't automatically identify the customer." The fix is the Use another contact once option, which links a contact to that task only — "without modifying any master data". Use it, rather than creating a contact per forwarding address.
New item data is not instantly searchable. "It might take up to 15 minutes for newly entered data to become searchable as the system reindexes the tables in the background." An item created this morning and quoted this morning looks like a model failure and is a timing one.
And the agent resumes with a backlog. When it exhausts its Copilot Credits it "stops processing new emails but stays active and scheduled", and when credits return it "automatically resumes and processes all unprocessed emails that accumulated during the outage." That is a queue draining into a review inbox, and Microsoft's own advice is to "deactivate the agent when you don't need it running."
About Cognilium Cognilium builds AI optimization apps for Microsoft Dynamics 365 — companion apps that optimize the pricing, inventory, warehouse and planning decisions your ERP manages but can't optimize. Dynamics is your system of record. Cognilium is your system of intelligence. https://cognilium.ai · https://www.linkedin.com/company/37180269/
Agentic ERP. We build turnkey AI optimization apps for Dynamics 365 — sidecar applications that run in your own Azure tenancy and solve the calculations a standard ERP is not built to compute. Built on Azure OpenAI, Microsoft Fabric and Copilot Studio. We build these on request, against your data and your environment.
More on the boundary between what Copilot does and what you build: Agentic ERP on Dynamics 365.
If an agent is going to read your customers' email, the filters and the identity rules matter more than the extraction. Bring one week of your own inbound requests to a 15-minute call.
Sources
- Sales Order Agent overview — Business Central · fetched and read in full 2026-09-15 · page states Last updated on 2026-07-23
- Payables Agent Overview — Business Central ·
ms.date2026-05-03
Sources and fact-check
| # | § | Claim | Tier | Primary source | Verdict |
|---|---|---|---|---|---|
| 1 | 1 | "analyzes the email—including subject line, body, and attachments (if configured)"; "Attachments can be PDF or image files" | T1 — verbatim, Microsoft's own em-dash preserved | sales-order-agent | PASS |
| 2 | 1 | The three-pass item search, each pass quoted | T1 — verbatim ×3 | Same page | PASS |
| 3 | 1 | The seven tables searched | T1 — read from Microsoft's own table, names reproduced exactly | Same page | PASS |
| 4 | 1 | "the quality of product information… affects its effectiveness" and the improvement list | T1 — verbatim | Same page | PASS |
| 5 | 2 | The relevance model, its purpose, and all three named examples | T1 — verbatim | Same page | PASS |
| 6 | 2 | "attempts to access internal data" is a prompt-injection defence | T2 — ours. Microsoft files it under relevance and does not use that term. Our reading, and it reads as ours | — | PASS |
| 7 | 2 | The attachment check and the terms-and-conditions example | T1 — verbatim | Same page | PASS |
| 8 | 2 | "Partners can inspect these prompts" | T1 — verbatim | Same page, Tip | PASS |
| 9 | 3 | Email-address-only identification, no name matching, anti-impersonation rationale | T1 — verbatim, the full Note | Same page | PASS |
| 10 | 3 | "a request from one customer can't be about another customer's requests" | T1 — verbatim | Same page | PASS |
| 11 | 4 | Outbound review is always, not a preference | T1 — verbatim, plus the process flow | Same page | PASS — see the correction note |
| 11b | 4 | The flow alternates prepare → review → send every time | T1 — read off Microsoft's published general flow, and bounded to it in the body. ⚠️ Microsoft adds that "The actual flow might vary depending on factors such as follow-up requests, changes or cancellations in review, blocking issues" — *so the flow is corroboration; the load is carried by the unconditional always… all outgoing messages sentence* | Same page | PASS |
| 12 | 5 | Quote always first; quotes touch no planning, reservation, availability or cash flow; "safe intermediate document" | T1 — verbatim | Same page, Note | PASS |
| 13 | 5 | The two named settings, Send quotes for confirmation and Make orders from quotes | T1 — verbatim. Not invented navigation — Microsoft publishes both strings | Same page | PASS |
| 14 | 6 | Forwarding uses the forwarder's address; Use another contact once links per task "without modifying any master data" | T1 — verbatim ×2 | Same page | PASS |
| 15 | 6 | "up to 15 minutes… as the system reindexes" | T1 — verbatim. A digit, in the body only | Same page | PASS |
| 16 | 6 | Credit exhaustion behaviour, backlog on resume, and Microsoft's deactivate advice | T1 — verbatim ×3, stated as engineering | Same page, Billing for use | PASS |
| 17 | 6 | "a queue draining into a review inbox" | T2 — ours, a consequence of 11 and 16 | — | PASS |
Tier summary: 15 × T1 (all verbatim), 2 × T2 — 0 × T4.
### 🔴 CORRECTION MADE BEFORE PUBLICATION — claim 11 inverted the draft's advice The first draft of this article told readers that review of outgoing messages is a preference to set deliberately. It cited the Operation section, which says involvement "might be needed… based on configured preferences." The same page says otherwise, further down: "The agent always involves designated Business Central users to review and approve all outgoing messages before it sends them to customers." And the general flow puts a `Reviewer: Reviews/confirms` step before every send. The defect was not the quotation — it was verbatim and correctly transcribed. The defect was stopping. The first draft was written from the page's opening sections; the settling sentence is in a later section of the same page. Fetching is not reading, and this is the second time in this cluster that the answer was further down a page already on disk. The corrected version is the better article. Microsoft hard-wired the human gate on the outbound boundary is a stronger and more citable finding than check your settings.
🔴 No pricing, per the founder ruling of 2026-09-15. Copilot Credits appear here only as operational behaviour — the agent stops, stays scheduled, and drains a backlog on resume. No rate, no pack size, no total, no currency anywhere in this article.
No unbounded absence claimed. The strongest negative statements — it doesn't search by contact name, it ignores non-sales attachments — are Microsoft's own sentences about its own product, not our inference from not finding something.
Status labels. The agent itself carries no preview banner on this page; Microsoft says "The agent is readily available in the product", and that is what the article relies on rather than a `[GA]` label we would be asserting ourselves. The capable-to-promise item-availability capability is linked as "Item availability in Sales Order Agent (preview)" and is deliberately not covered here, so no preview capability is described as shipped.
No figures of ours. No volume, no accuracy, no customer, no result.
Rule 2b sweep — generated by `_audit/sweep.py`, not typed. Case-insensitive, whole-word, over the published span (--- DRAFT --- → ## Fact-check, both lifted blocks included): is not ×6, always ×6, all ×5, every ×4, only ×3, no ×3, none ×2, doesn't ×2, can't ×2, there is no ×1, nothing ×1, nobody ×1, cannot ×1, most ×1. `description` carries: every — swept against the body.
Two hits were repaired rather than explained, per Rule 2c — a disposition is an action:
| hit | was | now |
|---|---|---|
| nothing | "it is given one that moves nothing" | "moves none of those four things" — Microsoft names four (planning, reservations, availability calculations, cash flow forecasts). Nothing claimed more than the source |
| nobody | "the failure nobody diagnoses correctly" | "looks like a model failure and is a timing one" — the original was an unbounded claim about every practitioner, and we have measured nothing about how anyone diagnoses anything |
Every remaining hit is either Microsoft's own word or bounded in its own sentence — always and all are verbatim from the outbound-review rule and the quote-first rule; there is no send step is bounded to that flow; most transferable is bounded to on the page; none of them is bounded to the three items listed beside it.
`validate-voice` reports two AVOID hits in "OUR prose", and both are Microsoft's. "doesn't automatically identify the customer" and "automatically resumes and processes all unprocessed emails" are inline verbatim quotations. *The gate detects blockquotes and not inline `"…"` quotations, so it files them under our prose. Kept as quoted, both matched against the source text — permitted reason 2.* Recording the blind spot here because it will recur in every article that quotes inline.
Share this article
What Microsoft ships, what it does not, and the layer we build where a general assistant runs out.
