Odoo 20 speaks AI. Now what?
You saw the demo at the booth, or you got our flyer. Here is how to run it on your own Odoo: a quotation drafted from one sentence, sent only after HQ approves, every step logged. Free on the airlock Solo tier. About 20 minutes in the Control Room.
- 01
You say it
“Make an offer for Janssen, 200 units, list price.” Said to the ElevenLabs voice agent, or typed in Claude or ChatGPT (or any AI client).
- 02
airlock checks the rules
The agent reaches Odoo only through airlock. Reads and drafts are allowed. Sending is not, yet.
- 03
The quote exists in Odoo
Contact found, product found, quotation created on your Odoo pricelist, request logged in the chatter.
- 04
HQ approves
post_customer_message pauses. HQ gets a Microsoft Teams or Slack card, reads the parameters, approves in the airlock Control Room.
- 05
Sent and logged
Odoo posts the message on the quote and notifies its followers, normally including the customer. Who asked, what ran, who approved, when: in airlock History.
One rule does the work: post_customer_message, the tool that messages the customer, is set to Require Approval. Everything before it runs at machine speed. Nothing leaves the company without a person.
- Odoo 17 or later
- An airlock org, free Solo or Teams
- Microsoft Teams or Slack, optional
- ElevenLabs, optional, for the voice call
- Any AI client
Ten steps, about 20 minutes. Everything happens in the airlock Control Room, or from the AI client you connect in step 5.
Sign up at control-room.air-lock.ai. The Solo tier is free, forever: one user, unlimited agents and skills, no card. The first person from your email domain becomes the admin, and the steps below need that role. Solo is strictly one person: to add colleagues, start the Teams trial (15 days, no card).
Integrations, pick Odoo from the catalog, enter your instance host and database name. Then each person who will use it opens the integration's page and saves their own Odoo login and API key (in Odoo: Preferences, Account Security, New API Key). Their agent gets their Odoo rights, never more.
An Odoo API key carries its user's full Odoo access. The rules in the next step do the limiting. For a tighter boundary, give the agent's user an Odoo account with only the Sales rights it needs.
On the Odoo integration's page, open the Tools & Policy tab. Every tool is on Allow. Switch four of them to Require Approval. In each row that expands, pick the approvers.
Set on Require Approval:
post_customer_messageconfirm_sale_ordercancel_sale_orderdelete_record. Leave on Allow: the search tools andcreate_record.For a real HQ, make a group first: Settings, Users & Groups, Create Group, add the people who sign off on quotes, then assign the group. Any one member can approve. If no approver is assigned, any admin can. On Solo, that is you.
Why these four:
post_customer_messageis what reaches the customer. It is deliberately a separate tool from the internal note so that outbound communication can be gated on its own. The other three change or remove an order that already exists. Drafting stays fast. Sending, confirming, cancelling and deleting wait.Approval requests go out by email by default, with a link to the Control Room. To get them in a channel: Settings, Organization, Notifications. Connect Microsoft Teams and pick a team and a channel. New requests arrive there as an Adaptive Card with the tool name, the requester and a preview of the parameters. The card links to the Control Room. That is where the decision is made. The resolution is posted back as a reply in the same thread. Slack works the same way.
airlock is one MCP endpoint per organization:
https://mcp.air-lock.ai/org/your-org-slug. In Claude, add it under Settings, Connectors. In ChatGPT, under Settings, Connectors as well. Sign in once with your airlock account. Copilot, Cursor and any other MCP client work the same way; the clicks per client are on the product page and in the quickstart.From here on you can do the rest from that chat. airlock exposes its own management tools to a connected client, so
push this skill to airlock
is a message, not a form.Skills, Create Skill, ownership Organization, paste the first block as the body. Then Agents, Create agent, switch to YAML, paste the second. Or paste both into your AI client and ask it to push them to airlock: it calls
create_skillandcreate_agentfor you.The skill is the instructions. The agent is what gets pushed to ElevenLabs in the next step; its prompt activates the skill, so voice and chat run the same rules. Swap the models for any in your catalog.
--- name: odoo-quote-drafter description: >- Draft a sales quotation in Odoo from a one-line request and hand it to HQ for approval before anything reaches the customer. Trigger phrases: "make an offer for", "draft a quote for", "quotation for". --- # Odoo quote drafter You draft quotations in Odoo through airlock. You never send anything to a customer yourself: sending is a separate tool that waits for HQ approval. ## Steps 1. Parse the request: customer, product(s), quantity, pricing instruction (list price, or an explicit discount). 2. `search_contacts` with the customer name. One match: use it. Several: ask which one. None: stop and say so. Never create a contact. 3. `search_products` for each product. Same rule. Never create a product. 4. `get_defaults` on model `sale.order`, then `create_record` on `sale.order` with the defaults merged in, `partner_id` set to the contact id, and `order_line` as `[[0, 0, {"product_id": <id>, "product_uom_qty": <qty>}]]`. Leave `price_unit` out so Odoo applies the customer's pricelist. Set `discount` on the line only if the request asked for one. 5. `log_internal_note` on the new order: who asked, what they asked, verbatim. 6. `get_record` on `sale.order` with fields `name` and `amount_total`. Report the quotation number and the total. 7. Then call `post_customer_message` on the order with a two-line message to the customer. This tool requires approval. Tell the user it is waiting for HQ and stop. Do not retry it. ## Never - Change prices, pricelists or discounts beyond what was asked. - Call `confirm_sale_order` or `cancel_sale_order` unless the user explicitly asks. - Call `delete_record`. Cancel is the most a quote ever gets. - Retry a call that is waiting for approval.agent: name: odoo-quote-drafter description: >- Drafts quotations in Odoo from a one-line request. Sending to the customer waits for HQ approval. Trigger phrases: "make an offer for", "draft a quote for". tags: - sales - odoo spec: schemaVersion: '1.0' systemPrompt: | Activate the airlock skill "odoo-quote-drafter" and follow it exactly. You draft quotations in Odoo. You never send anything to a customer without the approval step the skill describes. When a tool call is waiting for approval, say so and stop. modelPreference: - family: claude model: sonnet-4-6 - family: gpt model: gpt-5.4Open the agent's Deploy tab. Under airlock pushes it, pick ElevenLabs and Add key: an admin stores one ElevenLabs API key for the whole organization. Use a Service Account key with write access to Agents. airlock checks the key with ElevenLabs before saving it and never shows it again.
Then pick the service account the voice agent runs as, and push. airlock creates the agent in your ElevenLabs workspace with these instructions and this model, registers itself as the agent's MCP server, and records which version went where. ElevenLabs runs the voice agent, on your bill. Every call it makes to Odoo still passes through airlock.
Two things first. In ElevenLabs, switch MCP on for the workspace once: Agents, Integrations, MCP servers, start adding a server and accept the terms, then cancel the form. In airlock, give the service account access to the Odoo integration and paste its Odoo login and API key under Credentials. Every caller of the voice agent reaches Odoo as that one account, so grant it only what every caller may do.
Call the voice agent, or type it in your AI client.
Make an offer for Janssen, 200 units, list price.
It looks up Janssen, looks up the product, creates the quotation, logs the request in the chatter, and reads back the quote number and total. Then it callspost_customer_message, which stops and waits.HQ gets the request, opens the Control Room, reads the parameters, approves. The message goes to the customer. The agent tells you it is done.
Control Room, History. Every call the agent made, with the identity it ran as, the parameters, the policy that applied, who approved and when. The same record is what an auditor asks for.
Want the agent to behave differently? Tell it.
From now on, always add the delivery date to the quote.
It rewrites its own skill through airlock's management tools, and every edit is a new version you can restore.Put
update_skillandupdate_agenton Require Approval, like the Odoo tools, and the agent proposes the change while you decide. Self improvement, with a human signature on every version.
For Odoo partners
Build once, deploy at every customer. The skill and the agent above carry no organization-specific IDs. What an agent may reach is decided by the identity it runs as in each customer's airlock, so the same definition is safe to reuse. Push it to the customer's ElevenLabs from their Deploy tab. Bill it monthly as a managed service.
The pattern repeats past quotes: invoices, deliveries, lead updates. Draft fast, gate the moment something leaves the company, log all of it.
Book a partner introFor Odoo customers
Start turning AI into revenue with one flow that sales actually uses. Run the steps above on the free Solo tier this week. Add your team when it works.
Not sure where to start? Book 45 minutes. We look at your Odoo, pick the first flow and set the rules together.
Book a 45-min introWhich Odoo versions work?
Odoo 17 and later, on Odoo Online or self-hosted on a public HTTPS address. On Odoo 19 and later airlock uses the new JSON-2 API, and Odoo 20 takes the same path. On 17 and 18 it uses JSON-RPC. Detection is automatic.
Where do the Odoo credentials live?
Each user, and each service account, saves its own Odoo login and API key in airlock. The agent runs as that identity, with that identity's Odoo rights. airlock is hosted on AWS in Frankfurt.
Is the voice part airlock?
The voice is ElevenLabs. airlock pushes the agent into your ElevenLabs workspace in one click, registers itself as the agent's MCP server, and checks every tool call the voice agent makes. Change the agent in airlock and push again to update the voice agent. Change access or policy and it applies on the next call, no push.
Can the agent invent a price?
It should not, and the skill tells it not to. The quotation is created without a unit price so Odoo applies the customer's pricelist. If you want a hard guarantee, put create_record on Require Approval as well and review the lines before the order exists.
What does it cost?
Nothing to try. The Solo tier is free, forever: one user, unlimited agents and skills, 7-day audit log. Teams is per user with a 15-day free trial, no card. Plans are on the pricing page. ElevenLabs bills the voice minutes on your own account.
What is airlock?
The cross-vendor governance layer for MCP, Skills and Agents. One endpoint that every AI client and agent goes through to reach your systems, with policy, approvals and an audit trail on each call. EU-hosted on AWS Frankfurt. Backed by Start it @KBC.