If you use Odoo, your CRM talks to Odoo.
Account, product, order and invoice data stays in Odoo; your sales team sees the same data in the CRM. Because Odoo is open source and modular, the access question starts differently than it does with other ERPs — and that is where this page begins.
Odoo's modules are open, yet the pre-sales process is still adrift
At companies using Odoo, the product may have been customised either by an in-house developer or by an Odoo partner. This page was not written to disparage Odoo; it was written to describe a real pattern that recurs at the companies who call us.
- Orders and invoices move along properly in Odoo; but everything before the order — the lead, the discovery, the quote revision, the reason for losing — accumulates nowhere.
- The customer request arrives over WhatsApp, the quote goes out by email; both are outside the ERP and both get lost.
- The field team does not use the ERP screen on a phone; the visit note stays a note that never gets written up in the evening.
- As customisation accumulates, new requests join the developer queue; the sales manager cannot add their own field themselves.
- The person who prepares the reports sits in the technical team; the question “what is in the pipeline this week” turns into a ticket.
- And there is the possibility nobody likes: two customer lists form in two places, and which one is correct becomes a matter of debate.
That last item is the real subject of this page. The job of an integration is not to produce a second list, but to set a rule for which system is the authority for which data.
How is the connection built?
There is no out-of-the-box module for Odoo on our side, and we will not claim there is. The connection is built as an integration project whose scope is determined in the discovery call, using the REST API, OAuth2, webhooks and import/export. Which external interface will be used on the Odoo side — which endpoint, with which permissions — we determine together during discovery.
Odoo differs from other ERPs in one way, and that makes our work easier: because the source code is open, what is possible on the other side is not guessed at, it is looked at. With a closed ERP, the answer to the access question is sought at the licence and version desk; with Odoo, we look at your own installation during the discovery call. This lets us determine the scope earlier and more precisely; but it is not the same thing as an out-of-the-box module — there is still a connection that has to be written.
Three tools are used on the Rapitek CRM side:
- REST API — the product ships out of the box with 183 business objects, and each one is exposed in the REST API with its own data and schema endpoint; access is authorised with OAuth2. An object's schema can be read from the describe endpoint, several operations can be sent in a single composite request, and bulk transfer is done through the batch endpoints.
- Outbound webhook — CRM events are delivered to the external system signed; a failed call is retried and the target address is verified.
- Import/export — a four-step wizard; we do the initial data migration ourselves during setup.
The limits of these three tools are measured, not estimated: the REST API gives object and field definitions from the describe endpoint, processes up to 200 records in a single batch request, and carries 25 sub-requests at once in a composite call. The import wizard works on more than 75 objects, up to 100,000 rows per job and 25 MB per file. Our general approach is on the integrations page, and the same framework applied to a closed ERP is on the Netsis integration page.
Thursday, 15:10 — the customer asks for a revision over WhatsApp, and the quote had been written in Odoo. Once the connection is in place, here is what changes:
-
1
The request lands as a record, not as a message
If your WhatsApp Business account is connected to the CRM, the message is written into the shared inbox and onto the relevant customer record. The revision request does not stay on one person's phone.
-
2
The quote revision is tracked on the opportunity record
Which revision number it is, what changed and who approved it stay in the CRM. The version that turns into an order is passed to Odoo through defined fields.
-
3
The price stays the same as the list in the ERP
Because the product catalogue and the price list are transferred from Odoo, the quote is written at the current price. The authority for the price stays in Odoo; the copy in the CRM is there for the sales screen.
-
4
The authority for the customer record is set by a rule
Which system the customer record is created in, and how it flows to the other, is written down during setup. The two lists do not drift apart, because one becomes the source and the other the mirror.
-
5
The sales manager adds their own field themselves
Adding custom objects and fields on the CRM side is done without writing code. There is no joining the developer queue for a new sales field; the customisation queue on the ERP side gets some relief.
-
6
A reporting screen, not a report request
The pipeline, the source breakdown and the reasons for losing are prepared with the drag-and-drop dashboard designer. No appointment with the technical team is needed for a sales report.
Flows that can be built between Odoo and Rapitek CRM
Customer record matching and the authority rule
Which system is the authority for the customer record, and how it flows to the other, is defined in the written scope. Matching is set up on the tax number or on the identity key on the Odoo side.
Product catalogue and price list transfer
Product cards and the price list are transferred into the CRM; quotes are written at the current price. The transfer can be periodic, or it can be set up over the API.
Passing a won opportunity to Odoo
A signed webhook that passes the order data to the external system when an opportunity is won can be set up. Entering the same data by hand a second time is reduced.
Account balance and invoice visibility
Balance, due date and invoice header data are transferred onto the customer card. The authority for the document stays in Odoo; the CRM adds a visibility layer for the sales team.
Connecting messaging channels to records
Your own Meta WhatsApp Business account is connected to the CRM and the correspondence lands on the relevant record. You connect your own Gmail account with OAuth; that connection covers email sending and calendar synchronisation — inbox reading is switched off. Outlook and Microsoft 365 connections are not live.
Adding fields and objects without writing code
The administrator defines the fields the sales side needs themselves. The customisation queue on the ERP side is not tied up for a new sales field.
Which method, and when?
| Method | What it is for | When it is preferred |
|---|---|---|
| REST API (183 business objects out of the box, each with its own data and schema endpoint) | The external system reads and writes the records in the CRM; it is authorised with OAuth2, the schema is read from the API, and 25 sub-operations are sent in a composite request | When an external interface can be used on the Odoo side and the flow is meant to run automatically |
| Outbound webhook | Events in the CRM (e.g. opportunity won) are delivered to the external system signed; a failed call is retried | In flows that need event notification in the CRM-to-Odoo direction |
| Import (Data Hub) | Excel/CSV extracts are transferred with a four-step wizard: upload, map fields, preview, run. Export is done in the same module; we have not measured its limits | For the initial data migration and one-off transitions; as a bridge until the API flow is in place |
| Your own developer or your Odoo partner | The team that already knows the Odoo side can write the connection themselves using the same REST API; we give them the schema, the OAuth2 access and the field mapping table | If customisation has accumulated in your Odoo and you will keep working with that team |
What we have verified
How is the Odoo connection put into service?
-
1
Discovery
We work out where you run Odoo, which modules you use and which customisations have been made. We recommend that the partner or developer who set up your Odoo joins this call.
-
2
The authority rule and field mapping
Which system is the authority for which data is decided here — this is the critical step in Odoo flows. The field mapping table, the direction of flow, the frequency and the cost, if any, are shared in writing.
-
3
Configuration and test migration
The objects, fields and permissions on the CRM side are set up; two-way verification is done with sample records. Duplicate record scenarios are tried out here.
-
4
Training and go-live
Training for the sales and field teams, then close follow-up during the first week. We do not commit to a duration before discovery; after the discovery call we give you a date, not a range. The duration of the API-based Odoo flow becomes clear according to the scope.
Our limits: what we do not promise on this page
There are four things people ask about when ERP integration comes up. We do not promise any of the four, and we write down why.
- We do not say “your stock will be in sync”. The authority for the stock record stays in Odoo.
- We do not say that the order → invoice → collection chain will flow on its own. That chain is built into the product, but we do not think it is right for it to be sold as an automated accounting flow.
- We do not promise manufacturing and MRP automation. The bill of materials and the production line definition exist in the product; we cannot describe work order execution with a reference case today.
- We do not issue e-Invoice or e-Archive documents. Rapitek CRM is not a GİB private integrator; it does not produce official documents and does not track ETTN or GİB status. Your invoices continue to be issued under your current arrangement.
We wrote the reason for the first three, and “what can be done instead”, in one place, line by line: the three things we do not promise. We are not repeating it here, so that we do not end up writing two different sentences in two places.
One more thing: if a module has to be installed or an endpoint has to be written on the Odoo side, that work sits with your developer or your Odoo partner. We provide the CRM side, the schema, the OAuth2 access and the field mapping table. We do not offer Odoo installation, upgrade or maintenance services.
Data location: your data is held in the European Union — the database in Helsinki (Finland), files in Frankfurt, backups in Falkenstein (Germany). We do not have a single component in Türkiye, and we do not have a region selection feature. This is a transfer abroad within the scope of KVKK art. 9. The details are on the security page and in the KVKK disclosure notice.
Certification: we do not have an ISO 27001 or SOC 2 certificate, and we will not claim one until we do.
Plan prices are out in the open; scope comes out of discovery
The scope of the Odoo connection, and its cost if there is one, are worked out in the discovery call and shared in writing. Plan prices and separately priced items, on the other hand, we publish on a single page, with the figures.
Three plans, a scope table and separately priced items on a single page.
Frequently asked questions about Odoo integration
Is CRM integration with Odoo possible?
Is there a ready-made Odoo module in Rapitek CRM?
Odoo has its own CRM module. Why a separate CRM?
We run Odoo on our own server. Will access be a problem?
We have a partner who has done customisation in Odoo. Can they write the connection?
Does it matter which Odoo version we use?
Won't we end up with two customer lists in two systems?
Does it replace Odoo?
Will our stock stay in sync with the CRM?
Can we issue an e-invoice from the CRM?
Will synchronisation be real-time?
What does the Odoo integration cost?
How long does setup take?
Where is our data held?
Let's clarify your Odoo flow in 30 minutes
Invite the team that set up your Odoo to the call as well; let's decide together which system will be the authority for which data, and who will write the connection.
The scope of the setup, and its cost if there is one, are worked out in the discovery call and shared in writing.
