Skip to content

Automation · Sales and quoting

Quote over WhatsApp with Odoo

An AI agent quotes over WhatsApp with Odoo: it finds the customer, checks price and stock, and creates a draft quote with totals from Odoo.

How do I quote over WhatsApp with Odoo without opening the ERP?

A Met connected to Odoo selects the right company, finds the customer and opens their record before quoting. It then chooses a price list only when your operation has a rule for doing so, resolves every item to a sellable variant, and reads the base price and warehouse availability. Those facts help the conversation, but they are not yet the customer's final price. The Met presents the company, customer, variants, quantities, price list and warehouse for approval. Only after an explicit yes does it create a draft quote without sending a manual price. Odoo calculates the lines, currency, taxes and total. The Met reads that document again and returns its number, state, totals and portal URL when Odoo supplied one. It does not confirm the sales order, reserve inventory or generate a PDF through these tools.

What starts it

When the customer writes

It starts when somebody asks about a product, requests a price or wants a quote over WhatsApp. There is no message trigger to configure: the Met assigned to the channel runs the procedure inside that conversation and asks only for what is missing to identify the customer, variants and quantities.

Nothing to set up. The Met assigned to that channel picks up the conversation and runs the procedure inside it.

Who runs it

Odoo sales Met

Finance and operations team

This is not a named, seeded Met. It is the Met already answering the commercial line, with Odoo connected. Its job in this procedure ends when an identifiable proposal exists in the ERP with Odoo's own calculations, without turning it into a sales order or promising reserved inventory.

Channels: WhatsApp

What you need connected

6 steps · 11 tools

The procedure, step by step

Each step shows the tool that runs. They belong to the real connector: if one of them stopped existing, this page would not build.

  1. 1

    Select the company and open the customer record

    The Met lists the companies available to the technical user when there is more than one and fixes the compania_id that accompanies the rest of the procedure. It then finds the customer by name, tax identifier, email or phone and reads the exact party by id. It never takes the first similar result: it verifies the name, identifier, customer status and company first. This recipe starts from a customer that already exists in Odoo. If none is found, the Met says so and does not create the quote against another party.

  2. 2

    Choose a price list only when a rule supports it

    Active price lists arrive with their id, name, currency and company. When your operation already defines which list applies to that customer, the Met selects that identifier and shows it before creating the document. Without a clear rule it does not guess a list or promise a wholesale price. It leaves tarifa_id out and lets Odoo apply its default. Listing price lists does not calculate a customer price; it only resolves the configuration sent to the draft.

  3. 3

    Resolve every item to the exact variant

    Search runs over product.product rather than a description invented in chat and finds variants by name, internal reference or barcode. The Met reads the chosen variant to verify that it remains active and sellable, then retains its producto_id for the line. If two sizes or colors look similar, it presents the options with their reference rather than turning an ambiguous mention into the wrong item.

  4. 4

    Read base price and availability without turning them into a promise

    For each variant, the Met reads the base sales price, currency, unit and configured taxes. Separately it reads on hand inventory, free inventory when Odoo exposes that field, incoming, outgoing and forecast quantities for the chosen warehouse. The base price can change with customer, price list, quantity, date, currency and taxes. Availability can also change before an order. These calls support the answer and reveal shortages, but neither fixes the total nor sets units aside.

  5. 5

    Confirm the inputs and create only the draft

    Before writing, the Met puts the company, customer, variants, quantities and, when relevant, the price list and warehouse into one message. It waits for explicit approval and only then calls creation with confirmar=true. It sends producto_id and quantity but never copies the base price as a manual price. Odoo calculates the price list, taxes and totals inside the quote. The result remains a draft. Creating it does not confirm the sales order, generate a delivery or reserve inventory.

  6. 6

    Read the document again before returning the answer

    With the returned id, the Met reads the quote and responds with its literal number, lines, currency, subtotal, taxes, total and state. If creation lost its response and returned posiblemente_creada, it does not repeat the write. It lists drafts by customer, date and company, identifies the candidate, and reads it by id. The answer contains url_portal only when Odoo exposes access_url. That value is a portal reference, not a PDF or a promise of anonymous access.

Before you start

What you need ready

The Met solves none of these for you. If one is missing, the automation stops there.

The limits

What this automation does NOT solve

Better said here than discovered halfway through the rollout.

FAQ

Questions about this automation

No. That lookup returns the variant's base sales price. The final price can change with price list, customer, quantity, date, currency and taxes. The Met therefore never copies that value as a manual price. It creates the draft with the customer and price list and returns what Odoo calculated on its lines.

They receive the quote number, state and totals, plus the portal URL when Odoo returns access_url. The connector does not generate a PDF file or guarantee the URL is public. Odoo retains its own authentication and access rules.

No. Reading availability is a lookup, and creating a draft quote reserves no inventory. Reservation happens against a delivery from a confirmed order, which sits outside the WhatsApp flow.

Not from the channel. odoo_confirmar_pedido is blocked when the request comes from WhatsApp, as is order cancellation. An authenticated person reviews the draft and runs that step in the application.

The connector does not blindly retry a write. It returns posiblemente_creada, lists the customer's drafts and reads the candidate before deciding whether anything must be created. That reconciliation prevents two identical proposals after a lost response.

It works from Odoo 17 onward with the required modules and permissions. Odoo 19 and later use JSON-2; Odoo 17 and 18 use JSON-RPC. Odoo Online requires the Custom plan, while Odoo.sh and self-hosted installations depend on networking and technical-user configuration.

Keep going

Other automations built on the same tools

Want this automation running on your own data?

We will show it to you with your accounts connected, not with a canned demo.