Odoo email and PDF quotations: review products and prices first

Back
Kevin Riedl

10 min read · 5 Nov 2026
Last reviewed

Next
Made on your device, with no Instagram connection. We copy the post link for Instagram’s Link sticker.

A customer asks for three boxes of bolts and five seal kits. The PDF is readable. The commercial decision is still unfinished: how many pieces are in a box, which catalog item matches, and is the customer’s suggested price approved?

Treat Odoo email and PDF quotation review as a controlled transformation. Retain the request, resolve each product and unit against the approved catalog, obtain prices from the agreed authority, and bind approval to the exact draft revision before sending. Ambiguous lines and changed terms return to review instead of becoming guessed commitments.

Research checked: 5 November 2026. Product facts use Odoo’s official 20.0 documentation source. The request, catalog and prices below are synthetic. The downloadable checks have not run against Odoo or an AI model. They specify the behavior an implementation should demonstrate.

What should the intake workflow create?

The intake workflow should create a sales draft that preserves the customer’s request and exposes every unresolved line. Give extraction and draft preparation only the authority they need. Sending a quotation and confirming an order need separate decisions, because an internally reviewed draft is not evidence that the customer has accepted its terms.

Odoo 20 documents separate sending and confirmation actions; confirmation creates a sales order. It also documents a configurable Mandatory Product setting. Requiring a linked product does not establish that the selected item matches the customer’s request.

Define the desired behavior before choosing the intake mechanism. In our proposed policy, a technical intake identity can prepare a draft and attach review evidence. It cannot send, confirm, promise delivery or create new catalog products. An authorized person releases the reviewed quotation through the approved sales process.

Those are requirements to implement and test, not claims about default permissions in an Odoo installation. A hidden button does not establish a restriction on another write path. Ask the implementation owner to demonstrate the result using the actual integration identity and the application’s own controls.

Proposed workflow responsibilities, not native Odoo state names
StepAllowed resultRequired evidence
Capture requestRetain the message and attachments with a request reference.Original content and received revision.
Prepare candidatesSuggest customer, products, quantities and terms.Source location for each suggested value.
Resolve commercial linesSelect approved catalog items, units and prices.Resolved identifiers, pricing context and remaining holds.
Review draftApprove the current revision for the permitted next action.Reviewer, revision and material values reviewed.
Release quotationSend through the authorized sales process.Current approval and the exact document sent.

Which native Odoo features should you demonstrate first?

Demonstrate the required input path and resulting quotation on the installed Odoo version before specifying custom work. Check which app, configuration or module accepts the request, what it creates and which actions remain possible. An available document feature may solve part of the process without establishing product matching or commercial approval.

The PDF Quote Builder documentation describes composing outgoing quotation documents. That page does not establish an intake path for arbitrary customer PDFs.

Bring one real, permitted sample to the demonstration and record the exact output. Does the process preserve the source line? What happens to an unknown product code? Can a prepared line be sent before review? Confirm the specific version, edition, hosting and module requirements for the proposed route; avoid extrapolating from a similarly named app.

Odoo’s pricelist documentation says suggested prices can be overridden on a sales order. Selecting a pricelist therefore does not by itself prove your price-approval rule is enforced.

If an external workflow is needed, confirm its access and hosting fit before implementation. Keep the quotation review contract the same whichever mechanism prepares the draft. This article evaluates the sales decision; it does not claim that every native intake option is absent or that a custom AI workflow is necessary.

What must a reviewer see for every quotation line?

A reviewer needs the original request alongside the resolved commercial line and any reason it remains on hold. Preserve the difference between what the customer wrote, what extraction suggested and what the business approved. That separation makes an incorrect product, unit or price visible without asking the reviewer to reconstruct the entire email thread.

Minimum proposed review packet for one sales line
EvidenceExampleDecision it supports
Source referenceRFQ-204.pdf, page 1, line 1.Can the reviewer locate the request?
Customer wording“3 boxes BOLT-M8-20, 100 pieces each”.What quantity and item were requested?
Catalog resolutionApproved product identifier and selected variant.Does the line refer to the intended sellable item?
Unit conversion3 boxes × 100 pieces = 300 pieces.Is the priced quantity expressed in the correct unit?
Price contextCustomer, currency, applicable date and approved rule.Why is this the permitted unit price?
ExceptionTwo catalog candidates or a requested price change.Who must resolve the remaining question?
Approval referenceReviewer and draft revision.Does the approval cover the current line?

Keep customer identity review separate from product resolution. A recognizable company name is insufficient when there are several customer accounts with different terms. Use the customer-field ownership and matching guide if HubSpot participates in that customer handoff.

A model can propose a match, but the review packet should retain the candidate and the reason it was selected. An unknown customer part number needs an approved mapping or clarification. It should not quietly become a new catalog item because creating a line is easier than resolving its meaning.

How do units and prices change a draft quotation?

Resolve units and price authority before treating a draft amount as a quotation total. A correct text extraction can still produce the wrong commercial amount if a box becomes one piece or a target price becomes an approved price. Keep unresolved lines visible and label any subtotal that excludes them as incomplete.

Consider the fictional request RFQ-204. It contains three lines. The example catalog and approved prices are invented for the calculation; they are not Odoo defaults, market prices or model outputs.

Synthetic request and line-review outcome
Customer requestReview decisionIllustrative calculationRemaining action
3 boxes BOLT-M8-20, 100 pieces each.Use 300 pieces of the approved catalog product.3 × 100 × EUR 0.18 = EUR 54.00.Confirm packaging and applicable price.
2 filter cartridges FX-2.FX2-A and FX2-B remain plausible catalog variants.No price or line total selected.Ask which variant is required.
5 seal kits SK-4, target EUR 12 per kit.Keep the requested price separate from the approved example price of EUR 15.5 × EUR 15 = EUR 75.00; requested amount is EUR 60.00.Approve the commercial price or negotiate the request.

The first and third lines give a partial subtotal of EUR 54.00 + EUR 75.00 = EUR 129.00. That excludes the unresolved filter line, tax and shipping. Showing EUR 129.00 as the complete offer would hide the unfinished decision.

The kit price difference is EUR 15.00 across five kits. A workflow that copies the customer’s target price into the approved unit-price field makes that concession without a business decision. Preserve both values so the reviewer can see what approval would change.

Now remove “100 pieces each” from the first line. The document still says three boxes, but the conversion is unresolved. Hold the line unless an approved catalog or customer agreement establishes the pack size. A model’s familiar-looking estimate is not that agreement.

If a revised request changes three boxes to four, re-evaluate the quantity and pricing context. At the same illustrative rate, 400 pieces would be EUR 72.00, but the applicable rule may also need review. Do not carry the earlier approval forward merely because the product code stayed the same.

When must an approved quotation return to review?

An approved quotation should return to review whenever a material value covered by that approval changes. Define those values explicitly: customer account, product or variant, quantity, unit, price, currency and commercial terms. Compare the approved revision with the current draft at release, and require another decision when they no longer match.

In our proposed policy, an approval authorizes sending one specific draft revision. It does not authorize order confirmation, a substituted product or a later price change. Keep the exact released document with its revision so a reviewer can establish what the customer received.

Apply the guard wherever release can occur. A user-interface check cannot protect a separate integration call if that call can bypass the rule. Ask for a demonstration of the prohibited action using the intake identity, then inspect the business record and outgoing message evidence.

There is also a difference between a duplicate request and a new revision. A forwarded copy of the same request should be linked to its existing intake record under the agreed identity rule. A changed attachment requires comparison and a new review decision. The Odoo and n8n recovery guide covers retry and duplicate-effect handling after that business distinction is made.

How do you accept the workflow without inventing AI accuracy?

Accept the workflow by inspecting its business outcomes on an agreed set of requests, including ambiguous and changed inputs. Measure model behavior only after running the selected model on those inputs. A designed checklist is useful for specifying expected behavior, but it cannot establish extraction accuracy, reviewer time or the reliability of an unexecuted connector.

The 12-case quotation review matrix includes the worked lines, missing pack size, unknown customer codes, currency ambiguity, repeated requests, changed attachments and prohibited send/confirm attempts. Every execution state starts as NOT_RUN.

  1. Choose the intake scope. Name the supported document types, languages, customers and catalog families. Keep unsupported requests in a manual queue.
  2. Approve the expected commercial result. Have a responsible sales reviewer establish product, unit, price and hold decisions before evaluating model suggestions.
  3. Retain the full review packet. Save source locations, proposed values, final decisions and the draft revision for each line.
  4. Inspect blocked transitions. Demonstrate that held lines and a stale approval cannot release a quotation under the agreed policy.
  5. Record corrections and effort. After a real run, measure how much work reviewers perform and which errors survive to the final draft.
  6. Decide the next scope from observed failures. A recurring variant ambiguity may need catalog work or customer clarification before a different model.

For mapping suggestions across a larger import, use the separate Odoo AI mapping validation guide. This acceptance packet concerns the quotation’s commercial lines, not a general benchmark for document extraction.

Pair every prohibited action with a valid action that succeeds. A workflow that refuses every send is safe from sending the wrong quotation, but it has not completed the sales task. The release evidence must show the correct reviewed document reaching the permitted next step.

What would we automate first?

We would start with a narrow catalog and a draft-only intake role, then make one reviewer complete the entire commercial review with source evidence visible. Expand after observing the actual corrections and exceptions. Demonstrate native capabilities first and commission only the missing behavior that has a clear owner and acceptance condition.

The custom-versus-off-the-shelf decision guide helps compare a module with a maintained workflow. For Wavect’s API integration service, bring one representative request, its approved quotation and the exceptions that currently take the most review. That defines a concrete first delivery.

Odoo email and PDF quotation FAQ

Is this the same as an Odoo purchase RFQ?
This guide concerns a seller receiving a customer’s request and preparing a sales quotation. A purchase RFQ concerns your organization requesting a supplier’s offer. Keep those directions explicit in the scope, examples and permissions. Similar document names do not establish the same product, price or approval responsibilities.
May an unknown customer product code create a new catalog item?
Only if your approved process separately permits catalog creation and defines its review. In this proposed intake scope, an unknown code remains unresolved until a responsible person selects an existing item or approves a mapping. Creating a plausible product record would conceal the missing decision and could affect later ordering and fulfillment.
Is a high confidence score enough to release a quotation?
No. A model’s score does not establish customer identity, commercial authority or the current approval revision. Use it as one signal if it has been evaluated for the actual task. The release decision must still satisfy the product, unit, price and state rules your business approved, with unresolved lines held for review.
How should a forwarded request or revised PDF be handled?
Retain a business request reference and compare the content revision. A forwarded copy can belong to the existing intake, while a changed quantity or attachment requires review of the difference. Do not use a new email identifier as the only reason to create another quotation, or an old subject line as proof that nothing changed.
Can the intake promise availability or a delivery date?
Include those commitments only when the workflow has an approved source and rule for them. A customer’s requested date is not evidence that you can meet it. Show the request separately from the proposed commitment, retain the relevant availability check and route uncertainty to the person responsible for delivery promises.
Does the sample measure a model’s accuracy?
No. The example and CSV are synthetic specifications with expected outcomes, not results from a model or Odoo installation. A real evaluation requires representative permitted inputs, a selected model and configuration, independent expected answers and observed business outcomes. Report those results only after execution, with the sample size and unresolved cases visible.

Build the product, not just the backlog

If this article maps to a real product decision, Wavect can help you scope, build, harden, or lead the software work with senior founder-level judgment.

Useful service paths:

Inbox, without the noise

Follow the work that matters to you

Get a short email when we publish something new. Follow the whole blog or only the problems you care about.

What would you like to receive?
Choose your topics

Free, double opt-in, no tracking pixels.

Back
Kevin Riedl

10 min read · 5 Nov 2026
Last reviewed

Next

Get the next Delivery and QA field note

One concise email when we publish. No tracking pixels, and no inbox filler.

Free, double opt-in, no tracking pixels.