> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gettap.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Odoo

> Sync captured leads and meeting summaries into your own Odoo.

Odoo connects to **your own server**, with an API key you create in Odoo — not a sign-in, and no app to install on the Odoo side.

Tap works with **Odoo 16, 17, 18, and 19**, on Odoo Online or self-hosted.

<Warning>
  Odoo only opens its external API on its **Custom** pricing plan. On a lower Odoo plan the connection cannot be made — that's an Odoo limit, not a Tap one.
</Warning>

## What syncs

| Tap | Odoo |
| - | - |
| Captured lead | A **lead** or **opportunity** (`crm.lead`), or a **contact** (`res.partner`) — your choice |
| Note | A message in the record's chatter, internal and never emailed |
| Meeting summary | A calendar event linked to the record |
| Follow-up task | A To-Do activity on the record |
| Capturing member | Record owner |
| Task completed in Odoo | Comes back and closes the follow-up in Tap |

A new record gets a title (`Sara – Acme`) plus the sales team, stage, and tags you picked when you connected.

<Note>
  **An update never moves a record.** If your team drags an opportunity to another stage, a later sync from Tap leaves it there. Team, stage, and tags are applied when the record is created and never again.
</Note>

Meetings need Odoo's **Calendar** app installed. Leads created in Odoo are not imported into Tap — no CRM connector does that.

## Connect

<Steps>
  <Step title="Create an API key in Odoo">
    In Odoo: **Preferences → Account Security → New API Key**. Copy it — Odoo shows it once.

    The user you create the key for needs Sales access (*Sales / User: All Documents*) to write leads. With less, leads can still be saved as contacts.
  </Step>

  <Step title="Add the connection in Tap">
    **Integrations → Odoo → Connect**, then fill in:

    * **Odoo address** — your server, e.g. `https://yourcompany.odoo.com`
    * **API key** — the key you just copied
    * **Login** and **Database** — needed for **Odoo 18 and earlier**. On 19+ Tap works them out

    Tap checks the connection against your server before storing anything, and works out which protocol your Odoo version needs on its own.
  </Step>

  <Step title="Choose what records look like">
    Pick whether leads become leads, opportunities, or contacts, and set the sales team, stage, and tags new records should get. Tap reads these from your database, so the options are your own.
  </Step>

  <Step title="Map your fields">
    See [Field mapping](/en/integrations/field-mapping). Your custom Odoo fields are included.
  </Step>
</Steps>

<Note>
  Tap never shows the key again after you save it — only its last four characters.
</Note>

## API keys expire

Odoo 19 will not issue a key that lasts longer than **three months**.

Tap reads the expiry date from your server (Odoo 18 and up) and warns you **14 days ahead**. On the day it expires, every sync stops and the connection reads **Reconnect needed**.

<Tip>
  Reconnecting with a new key keeps everything — your settings, your field mapping, and the record links on existing leads. Put a reminder in your calendar two weeks before the key is due.
</Tip>

## One connection, one server

Each connection carries its own address, database, login, and key. Different departments can point at different Odoo servers, and there's no shared Odoo address across your account.

Who can manage a connection depends on who owns it: a personal connection is managed by that member, a department's by a full-team admin or that department's admin, and the company's by a full-team admin.

## Duplicates

Odoo doesn't enforce unique emails on a lead, so Tap looks before creating:

* By **email**, case-insensitively — `Sara@Acme.com` finds `sara@acme.com`.
* By **phone**, but only when the lead has no email at all. A phone is often a switchboard, and two colleagues sharing one are two different people.
* **Archived records count.** A lead someone marked lost is still that person's record.

When a match is found, Tap updates it instead of creating a second one, following your field mapping's overwrite rules.

## Notes specific to Odoo

<AccordionGroup>
  <Accordion title="Notes go in the chatter, not a Notes field" icon="comments">
    A Tap note becomes an internal chatter message on the record. It's never emailed to anyone. Editing the note in Tap corrects that message in place rather than adding a second one — see [Notes](/en/leads/notes).
  </Accordion>

  <Accordion title="Tasks don't email the assignee" icon="bell-slash">
    Follow-ups are created as To-Do activities without Odoo's "assigned to you" email, so syncing a day of leads doesn't flood anyone's inbox.
  </Accordion>

  <Accordion title="'Couldn't reach Odoo'" icon="plug-circle-xmark">
    Check the address is reachable from the internet and includes `https://`. A self-hosted server behind a VPN or an IP allowlist can't be reached by Tap.
  </Accordion>

  <Accordion title="'Odoo refused the key'" icon="key">
    The key is wrong, expired, or belongs to a user who has been deactivated. Create a new key and reconnect.
  </Accordion>

  <Accordion title="Owner assignment needs matching emails" icon="user-check">
    Tap matches the capturing member's Tap email to an Odoo user's email. No match means Odoo's default owner.
  </Accordion>

  <Accordion title="Disconnecting changes nothing in Odoo" icon="link-slash">
    Disconnecting deletes the connection and the stored key. Your field mapping is kept for when you reconnect, and nothing already synced is removed from Odoo.
  </Accordion>
</AccordionGroup>

<Card title="Not arriving?" icon="wrench" href="/en/integrations/troubleshooting">
  Work through the troubleshooting guide.
</Card>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.