Index
Who this article is for: managers and administration staff who want to bring data into their Odoo ERP, and especially the IT team or developer who builds the connection. The business side is explained in plain language; the technical parts are marked with 🛠️ for IT.
What is this integration?
Odoo is an ERP (a business management system: accounting, invoicing, CRM, inventory). Golfmanager does not have a dedicated Odoo module, but it does offer a public API with which Odoo (or any other system) can read and write data from your club securely.
In other words, the Odoo integration is built by connecting both systems through the Golfmanager API, usually with the help of your technical team.
An API is a controlled "entry point" for two programs to communicate. The Golfmanager API lets Odoo query and create data (customers, sales, invoices…) without accessing the database directly.
What problem does it solve?
Brings the club's data into Odoo (customers, sales, invoices) without typing it by hand.
Centralizes management and accounting in your ERP.
Avoids intermediate files and double entry.
It is flexible: you decide what data to sync and in which direction.
Which systems does it connect and in which direction does the data flow?
It connects Odoo with Golfmanager through the API. It can work in both directions, depending on what your team builds:
From Golfmanager to Odoo: Odoo queries the API for customers, sales or invoices and brings them in.
From Odoo to Golfmanager: Odoo creates or updates records in Golfmanager through the API.
It is not an automatic, out-of-the-box sync: it is a custom connection that is built once and then runs on its own. In addition, Golfmanager supports webhooks to notify Odoo when something happens (see "How the connection works").
What information can be exchanged?
Through the API you can access most of Golfmanager's data. The most common for an ERP are:
Data | Typical use in Odoo |
Customers | Sync the customer/contact base |
Sales and invoices | Record income and invoicing |
Products | Keep the catalog and concepts |
Bookings and payments | Reports and reconciliation |
🛠️ For IT: by default, the API exposes all models and fields in read mode, except those marked as not exposed (api="0") and the password or encrypted types, which are never returned. Fields marked as exposed (api="1") are the stable, documented contract.
Prerequisites (before you start)
A Golfmanager API key, associated with a user that has the appropriate permissions.
Your club name (tenant), which is the second credential of every call.
Have Odoo with the ability to connect to external services (a custom module or connector).
A technical team or developer to build and maintain the connection.
Define what data to sync and in which direction.
How to set it up (step by step)
Log in to Golfmanager with an administrator user.
Go to Settings > Users and choose (or create) the user that will use the API. A dedicated user with only the necessary permissions is recommended.
Edit that user and click "Regenerate API Key" to generate its API key.
(Optional) Adjust the requests per minute and per hour limits according to the volume Odoo needs.
Copy the API key and store it safely (it is not shown again through the API).
Note down your club name (tenant): it is the second credential.
If Odoo manages several clubs with a single key, use Settings > API Keys to create a global (multi-club) key and associate the corresponding clubs and users.
Hand over to your IT team the API key, the club name and the base URL; they build the connection in Odoo.
Test with a few records and validate before automating.
🛠️ Technical note (for IT): the API (version 3) exposes models at routes like /api/model/<model-name> (for example, /api/model/customer). Each request carries two headers: key (the API key) and tenant (the club name); Basic Auth (email:key) is also supported. It allows listing, filtering, selecting fields, sorting and paginating, and creating/updating/deleting. You have documentation at /api/doc and a test environment at /api/playground on your own domain.
Explanation of each field
Below is a description of each relevant field of the connection: where it is, what it means, its impact on the system, and a usage example (what happens when it is used and how the system behaves).
A) The API key (on the user record)
1. API Key
Description: a secret string associated with a user that identifies and authorizes Odoo to the Golfmanager API.
Impact on the system: it is the main credential; without it there is no access. It is generated/regenerated from the user record and is never returned in the API responses.
Usage example: you click "Regenerate API Key", copy the value and give it to your IT team.
What happens when it is used: Odoo sends it on every request (the
keyheader) and accesses with that user's permissions.System behavior: if it is missing or incorrect, the API responds "Invalid key" or "api key required" and rejects the call. When you regenerate it, the previous key stops working (this is how you revoke it).
2. Requests per minute
Description: the maximum number of calls per minute that key allows (default, 30).
Impact on the system: it protects the service against an excess of calls. An administrator adjusts it.
Usage example: you raise it if Odoo needs to process more volume in a short time.
What happens when it is used: the key's calls are counted each minute.
System behavior: when the limit is exceeded, the API responds with error 429 "Rate Limit Exceeded… per minute" and temporarily rejects calls. A value of 0 means no limit.
3. Requests per hour
Description: the maximum number of calls per hour for that key (default, 1000).
Impact on the system: the same as the per-minute limit, but over a one-hour window.
Usage example: you adjust it if Odoo's daily sync makes many calls.
What happens when it is used: calls are counted each hour.
System behavior: when exceeded, the API responds "Rate Limit Exceeded… per hour". A value of 0 means no limit.
B) Global / multi-club API key (Settings > API Keys)
4. Global API key and associated clubs (tenants)
Description: a key designed to access several clubs with a single credential, associating each club with a user.
Impact on the system: useful when one Odoo instance (or a group of clubs) manages several tenants. It is managed in Settings > API Keys and the key is generated automatically.
Usage example: you create the key and associate the clubs and the user of each one.
What happens when it is used: with a single key, Odoo can query the accessible clubs (
/api/tenants) and operate on each one by indicating its name.System behavior: if the key is not a multi-club type and you try to use it as such, the API responds "Not a multitenant api key".
C) The two credentials of every call (used by Odoo)
5. Key and Club (tenant)
Description: the two headers that travel in every request: the API key (
key) and the club name (tenant).Impact on the system: both are mandatory: they identify who is calling and which club the operation is directed to.
Usage example: Odoo adds
key: <your-key>andtenant: <your-club-name>to every call.What happens when it is used: the API validates the key and directs the operation to the indicated club.
System behavior: if the club is missing, it responds "Tenant is required"; if the key is missing or wrong, "Invalid key".
D) Permissions of the user associated with the key
6. Permissions / profile of the API user
Description: the API key inherits the permissions of the user it belongs to (from their profile).
Impact on the system: they define what Odoo can read, create or update. Whatever that user cannot see, the API does not return either.
Usage example: you give the API user only what is necessary (for example, reading customers and invoices).
What happens when it is used: every call respects those permissions.
System behavior: if a permission is missing, the operation is rejected; in addition, certain fields (passwords, encrypted data) are never exposed, even if the user has permission.
How the connection works
Reading: Odoo asks the API for the list of customers, sales or invoices. 🛠️ It supports filters (operators
=,!=,>,<,like,inand AND/OR combinations), field selection, sorting and pagination (20 records by default, 100 maximum, with a cursor for the next page).Writing: Odoo can create, update or delete records in Golfmanager.
Webhooks (real-time notifications): instead of asking constantly, Odoo can receive a notification when an event happens. 🛠️ Webhooks are signed (HMAC-SHA256) and retry automatically if your system does not respond.
Security: every call is signed with the API key and respects the permissions of the associated user.
Usage limits: the API applies a maximum of requests per minute/hour (configurable on the key) to protect the service.
Limitations to keep in mind
It is not a "ready-to-use" connector: it requires development on the Odoo side.
It needs maintenance by your technical team.
It respects permissions and usage limits: the API key only accesses what its user can see, and within the request limits.
Some fields are not exposed (passwords or encrypted data), even if the user has permission.
🛠️ Relational fields return identifiers: to resolve a relationship (for example, the customer of an invoice) an additional call may be needed.
The responsibility for the sync (what, when and how) lies in the connection you build.
Frequently asked questions
Is there a "ready-made" Odoo connector?
No. Golfmanager does not have a dedicated Odoo module. The connection is built using Golfmanager's public API, usually with your technical team or a developer.
The connection gives an authentication error / "Invalid key".
The API key is incorrect, empty or was regenerated (and the old one stopped working). Check that the correct key is sent in the key header and that the club name (tenant) is the right one. If needed, regenerate the key on the user record and update it in Odoo.
"Tenant is required" or "api key required" appears.
One of the two mandatory credentials is missing. Every call must send the key and the club name. Check that Odoo includes both headers.
I get a too-many-requests notice (error 429 / "Rate Limit Exceeded").
The per-minute or per-hour limits of that key have been exceeded. Reduce the frequency of calls in Odoo, batch operations, or ask an administrator to increase the key's limits (or set them to no limit if appropriate).
It says a model "is not exposed" or "does not exist in this tenant".
The model you are trying to query is not available via the API or its module is not installed on that club. Check the model name and that the corresponding module is active in your Golfmanager.
I don't see a field or a piece of data I expected.
Two possible reasons: the key's user does not have permission for that data, or the field is not exposed by the API (for example, passwords or encrypted data). Adjust the permissions of the user associated with the key; encrypted fields are never returned.
A record is not created or updated.
This is usually because mandatory fields are missing, the user does not have write permission on that model, or the request body is empty ("Data is empty"). Review the data sent and the user's permissions.
I want to connect several clubs with Odoo. Do I need one key per club?
You can use a global (multi-club) API key from Settings > API Keys, associating the clubs and one user per club. With a single key, Odoo queries the accessible clubs and indicates on each call which one it is addressing. If you use a normal key as if it were multi-club, you will see "Not a multitenant api key".
Is the API read-only or can I also write?
Both. Odoo can read (list and query) and also create, update or delete records, always within the permissions of the key's user.
How do I avoid constantly asking for changes?
With webhooks: instead of querying the API constantly, Odoo can receive a notification when an event happens. It reduces the number of calls and keeps data more up to date. Your technical team sets it up.
Where can I test the API before building the integration?
On your own domain you have the documentation at /api/doc and a test environment ("playground") at /api/playground to make sample calls and see the responses.
How do I revoke a key if it has been leaked?
Regenerate the API key on the user record (or on the global key): the previous one stops working immediately. Then update the new key in Odoo.
What data exactly can Odoo read?
Most of the system's models: customers, sales, invoices, invoice lines, products, bookings, payments, etc. Password fields and encrypted ones are not exposed. The fields documented as exposed are the stable contract.
What filters and query options are there?
You can filter with the operators =, !=, greater/less than, like and in (and AND/OR combinations), choose which fields to return, sort and paginate. Free SQL is not allowed.
Is it safe? Where do I store the key?
The key is like a password: store it somewhere safe (not in shared code or emails), use a dedicated key with minimal permissions and regenerate it if you suspect it has been leaked. The key is never returned by the API.
Recommended best practices
Use a dedicated API key for the Odoo connection, with just the right permissions.
Start with one direction and a little data (for example, customers) and expand later.
Test in the test environment (
/api/playground) before automating.Adjust the request limits to the real volume and use webhooks to reduce calls.
Document the connection (what is synced, when and how) for maintenance.
