Guide · Odoo · Governed AI

How to integrate AI with Odoo to prepare quotations that a person approves before sending them

If someone offers you "AI that quotes on its own", the right question is not which model it uses, but in which state it leaves the quotation, what it can read, what it cannot write and who approves. This guide answers that with Odoo's states and documentation, and with the method we apply at Transgenia.

Short answer. The safe way to integrate AI with Odoo for quoting is an AI-assisted quotation flow with mandatory human approval: the AI reads the customer's request (email, WhatsApp, form or PDF), extracts products, quantities and terms, looks up prices, pricelists and stock in Odoo with read-only permissions, and creates the quotation in the Quotation state, that is, as a draft; it never sends or confirms it. A person reviews, edits and clicks Send by Email or Confirm. The control must live on the server side (state validated before sending, record of who approved, return to review when prices or quantities change), not in a button. On Odoo Online, in addition, the external API is only available on the Custom plan.
Diagram 1. Meta-structure of the guide: requirements and scope, seven steps from request to measurement, states and actions, automation rules, what can go wrong, hypothetical example, our view and sources.
View Mermaid diagram
mindmap
  root(("AI-prepared quotations, approved by a person"))
    Requirements and scope
      Odoo edition and plan
      external API only on Custom plan in Online
      rotated API key
    Seven steps
      request
      structured extraction
      read-only lookup
      draft in Quotation state
      notification
      human approval
      measurement
    States and actions
    Automation rules
    What can go wrong
    Hypothetical example
    Our view and sources
Diagram 1. Meta-structure of the guide. There is one axis: AI prepares, a person decides; everything else is the set of controls that guarantees it.

Requirements and scope

PointWhat you needWhat this guide does not cover
Odoo editionCommunity or Enterprise. The quotation model (sale.order) and its states exist in both. Studio (automation rules) is paid: on Odoo Online, installing it switches the database to the Custom plan.Third-party approval modules from the Odoo app store: they exist, but we do not evaluate them here.
Deployment and planSelf-hosted or Odoo.sh: the external API is available. Odoo Online: "Access to data via the external API is only available on Custom Odoo pricing plans"; it is not available on One App Free or Standard.Plan and AI prices: they go in a separate guide on cost factors.
VersionOdoo 19 uses the JSON-2 API with an API key as a bearer token. Earlier versions use JSON-RPC or XML-RPC; both are scheduled for removal in Odoo 22.Odoo earlier than 13 (outside the scope of Transgenia's service).
CredentialsAn API key created by a user with minimal permissions (Preferences, Account Security, New API Key) and rotated at least every three months.We never ask for keys in forms or chat.
AI layerClaude or ChatGPT via API, or an MCP server (for example, Transgenia's open server in read-only mode) so the agent queries Odoo with scoped tools.Agents that write directly to the ERP without a draft state: we do not recommend them.
PeopleA salesperson who approves, a pricing owner and someone who defines the acceptance criteria.Replacing the salesperson. AI prepares; the person decides.

Step by step: from the request to the approved quotation

1. Define what counts as a request and where it comes from

Email, WhatsApp, web form, PDF or Excel. To start, choose a single channel and a single product category. A scoped pilot lets you measure errors before scaling.

2. Extract structured data, not prose

The AI turns the customer's text into a record with customer, lines (product, quantity, unit), delivery date and terms. If a piece of data is missing or there are two compatible products, the agent asks; it does not fill in on its own. Model providers offer structured outputs for this; use them.

3. Query Odoo with read-only permissions

The agent looks up the customer in Contacts, maps each line to the catalog (reference, variant, unit), reads the assigned pricelist, taxes and availability. Odoo computes prices, discounts and taxes; the AI does not invent or recalculate amounts. With an MCP server in read-only mode, any write attempt is refused before it reaches Odoo.

4. Create the quotation in the Quotation state

A technical account different from the agent's, with permission to create quotations and nothing else, records the draft with a visible tag ("Generated by AI") and a note in the chatter indicating the source request and the date. The initial state is Quotation. Nothing is sent.

5. Notify the salesperson with the summary and the warnings

An activity in Odoo or a notice to the team channel with the link to the draft, the ambiguous products, the insufficient stock and the terms outside policy.

6. Human review and approval

The salesperson edits quantities, prices or terms and decides. Only then do they click Send by Email or Confirm. According to the Odoo 19 documentation, on confirmation "the quotation is confirmed, and the status changes to Sales Order" and "it officially turns into a sales order, which can then be invoiced and paid for".

7. Measure before scaling

Percentage of drafts approved without changes, errors by type (product, quantity, price), salesperson time per quotation and quotations that required clarification. With those numbers you decide whether to extend the channel or the category.

Diagram 2. The seven steps: request, extraction, read-only lookup, draft in Quotation state, notice to the salesperson, human approval with edits, send or confirm, and measurement.
View Mermaid diagram
flowchart TB
    S1["1. Customer request: email, WhatsApp, form or PDF"] --> S2["2. AI extracts structured data and asks when something is missing"]
    S2 --> S3["3. Read-only lookup in Odoo: customer, catalog, prices, stock"]
    S3 --> S4["4. Technical account creates the quotation in Quotation state, with tag and note"]
    S4 --> S5["5. Activity or notice to the salesperson with the warnings"]
    S5 --> S6{"6. Does the person approve?"}
    S6 -- "Edits" --> S4
    S6 -- "Yes" --> S7["Send by Email or Confirm: a person only"]
    S7 --> S8["7. Measure: approved unchanged, errors, time, clarifications"]
Diagram 2. The full flow. The only path to Send or Confirm goes through a person; the integration never gets there.

States and allowed actions

State in OdooWho can move it thereWhat is allowed
Quotation (draft)The integration, with a technical account with minimal permissionsCreate and edit lines, tag "Generated by AI", leave a note in the chatter
Quotation SentOnly a person, with Send by EmailForbidden for the agent; the server validates that the AI cannot invoke the action
Sales OrderOnly a person, with Confirm (or the customer from the portal, if configured)Forbidden for the agent; it triggers deliveries and invoicing
CancelledA personRecord the reason

Two rules that are not optional. First: the server validates the state before executing the send; an approve button in the interface is not a control if the integration can bypass it. Second: if someone changes prices or quantities after approval, the quotation goes back to review and who approved each version is recorded.

Diagram 3. Quotation states in Odoo: the integration only creates the draft; Send by Email, Confirm and Cancel are reserved to a person; a price change returns the quotation to review.
View Mermaid diagram
stateDiagram-v2
    [*] --> Quotation: the integration creates the draft
    state "Quotation (draft)" as Quotation
    state "Quotation Sent" as Sent
    state "Sales Order" as Order
    Quotation --> Sent: person, Send by Email
    Quotation --> Order: person, Confirm
    Sent --> Order: person, or customer from the portal
    Quotation --> Cancelled: person
    Sent --> Quotation: prices or quantities change, back to review
Diagram 3. States and who can move them. The integration enters at a single point, the draft; every other transition is human.

Where Odoo's automation rules fit

Studio's automation rules "allow the execution of one or more predefined actions in response to a specific trigger". There are five trigger categories (values updated, email events, timing conditions, custom and external) and actions such as update record, create activity, send email or SMS, send WhatsApp, execute code or send a webhook. They serve to notify the salesperson when a tagged draft arrives or to return a quotation whose total changed to review. They do not replace the server control: the documentation recommends activating developer mode for the filters and, on Odoo Online, installing Studio switches the database to the Custom plan.

Diagram 4. Server-side controls: read-only agent, scoped technical account, state validation on the server, record of who approved, idempotency per source message and return to review when prices change.
View Mermaid diagram
flowchart TB
    A["AI agent: read-only permissions"] --> B["Separate technical account: create quotations only"]
    B --> C["Server validates the state before sending"]
    C --> D["Person approves; who approved is recorded"]
    D --> E["Send or confirm"]
    B -. "idempotency key per source message" .-> B
    D -. "if prices or quantities change" .-> C
Diagram 4. The controls that are not optional. An approve button in the interface is not a control if the integration can bypass it.

What can go wrong

Hypothetical example

This example illustrates a proposed flow; it does not report a client's results or figures. A distributor receives by email: "I need 20 boxes of medium nitrile gloves and 5 of large gloves, delivery on Thursday, invoice to the usual RFC". The AI extracts two lines, the date and the invoicing instruction; it finds two presentations of the medium glove and asks which one; with the answer, it looks up stock and the customer's pricelist and creates the quotation in the Quotation state with the "Generated by AI" tag and the note "source: email of October 13". The salesperson receives an activity, sees that there are 18 boxes of the medium one available, adjusts to 18 and 7, and sends. The invoicing instruction is not executed: accounting issues the invoice when it is due. If a price were missing or the agent had no permission to read the pricelist, the flow would stop asking for validation. Checking stock is not reserving it.

What we think at Transgenia

About the tool we use: MCP-Odoo-Tools is an open-source MCP server (MIT) with 28 tools, Odoo 10 to 19 coverage in Community, Enterprise and Online, a read-only mode and a privacy notice (Transgenia does not proxy or store the data; results go to the MCP client and the model provider). It is on PyPI as odoo-mcp-tools 1.4.0 and as the "Odoo Tools" plugin in the Claude directory, where, according to the directory administration panel with data through October 11, 2026, it has 506 cumulative installs, 203 active accounts in 28 days and 0 errors in 15,651 loads.

Sources

Every technical fact in this guide rests on a public source checked on October 12, 2026. The plugin figures are Transgenia's and are labeled as such.

Frequently asked questions

Can the AI send the quotation to the customer if a person already reviewed a similar one?

Not in our method. Each quotation is a separate commercial decision: prices, availability and terms change. The agent leaves it in the Quotation state and a person executes the send. The server validates that state before allowing the send, so the integration cannot bypass it.

In which Odoo state should an AI-prepared quotation stay?

In Quotation, the initial state of the sale.order model, with a visible tag and a note in the chatter indicating its origin. The Quotation Sent and Sales Order states are reserved to a person: the first with Send by Email, the second with Confirm, which according to the Odoo 19 documentation turns the quotation into an invoiceable sales order.

What permissions does the AI agent need in Odoo?

Read access to contacts, products, pricelists and stock, and nothing else. The draft is created by a separate technical account with permission to create quotations, without access to confirm, deliver or invoice. With an MCP server in read-only mode, every write is refused before it reaches Odoo.

Does it work on Odoo Online?

Only if the plan includes the external API: according to the Odoo 19 documentation, data access through the external API is available only on the Custom plan, not on One App Free or Standard. On self-hosted and Odoo.sh that restriction does not exist.

Does it work the same with Claude as with ChatGPT?

Yes. The model extracts structured data and asks when there is ambiguity; the control of the flow (draft state, permissions, server validation) does not depend on the model. Claude Code runs local MCP servers, which is why the Odoo plugin runs there; ChatGPT connects through the OpenAI API or each provider's connectors.

What happens if the customer asks for a product that does not exist in the catalog?

The agent must not invent it or silently pick "the closest one". It creates the draft with the pending line and an internal note indicating the item not found, or asks before creating anything. The salesperson resolves it.

Are Studio's automation rules enough to enforce the approval?

They serve to notify (create an activity, send an email or a WhatsApp message) and to return a quotation whose total changed to review. They do not replace the server validation of the state before sending. Studio is paid: on Odoo Online, installing it switches the database to the Custom plan.

How do I avoid duplicate quotations when the integration retries?

Use the identifier of the source message or email as an idempotency key: if a draft with that origin already exists, another one is not created. It is one of the controls we test before opening the channel.

Does the approved quotation generate the invoice automatically?

No. Confirming an order must not stamp anything on its own; invoicing follows accounting's authorized flow, with its own review. Separating the commercial confirmation from the CFDI avoids invoices issued because of a misread message.

Which Odoo version do I need?

Odoo 19 offers the JSON-2 API with an API key; earlier versions use JSON-RPC or XML-RPC, which are scheduled for removal in Odoo 22. Transgenia's open MCP server covers Odoo 10 to 19; the implementation service is offered for 13 to 19.

What should I prepare before requesting an assessment of this flow?

The channel through which requests arrive, real examples of requests, the Odoo version, edition and plan, the current pricelists, who approves quotations today and which acceptance criterion you would use for the pilot. Access is agreed during the assessment; do not share credentials.

How do you measure whether the flow works?

With four numbers per week: drafts approved without changes, errors by type (product, quantity, price), salesperson time per quotation and requests that required clarification. Without measurement with evidence we do not publish figures or extend the scope.

Next step

If your company already runs Odoo and receives quotation requests by email or WhatsApp, first review the AI implementation and Odoo integration offer and, if you are a trading company or distributor, the Odoo for trading companies page, where the three guides are gathered. Then request an assessment: we define the process, the permissions and the acceptance criteria before quoting.

About the author and Transgenia

Efraín Carreón Ortiz is CEO of Centrum Transgenia, a Mexican technology boutique. He holds the official Claude Code badge (Claude Partner Badge) issued by Anthropic, verifiable on Credly.

Transgenia is an OpenAI Select Partner within the OpenAI Partner Network and a registered partner in Anthropic's Claude Partner Network. Team: Víctor Estrada Bello, Chief PMO; Danild Johan Zambrana López, Chief Technology Officer; Jaime Lozano Castañeda, Chief Marketing Officer; Efraín Carreón Ortiz, Director General (Chief Executive Officer).

Let's talk: contacto@transgenia.org, WhatsApp +52 55 8034 0405, 15-minute call or the contact page.

Keep reading

← Back to Blog
Transgenia, Verified IT agency on Vai.me