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

# Connect Odoo

> Connect your own Odoo instance with an API key, and choose whether pushed leads land as opportunities or leads.

export const UiPath = ({children}) => {
  const parts = String(children).split(/\s*(?:→|>)\s*/).filter(Boolean);
  return <span className="pl-path">
      {parts.map((part, index) => <span key={`${index}-${part}`}>
          {index > 0 && <span className="pl-path__sep">→</span>}
          {part}
        </span>)}
    </span>;
};

export const Screenshot = ({id, alt, caption, frame = 'browser', url, marks = [], lang = 'en', workspace = 'northwind-outbound'}) => {
  const src = `/images/screenshots/${lang}/${id}.png`;
  const chrome = url ? `app.pipelime.ai/${workspace}${url}` : 'app.pipelime.ai';
  return <figure className={`pl-shot pl-shot--${frame} not-prose`}>
      <div className="pl-shot__frame">
        {frame !== 'bare' && <div className="pl-shot__bar">
            <span className="pl-shot__dots">
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
              <span className="pl-shot__dot" />
            </span>
            <span className="pl-shot__url">{chrome}</span>
          </div>}
        <div className="pl-shot__media">
          <img src={src} alt={alt} loading="lazy" />
          {marks.map(mark => <span key={mark.n} className="pl-shot__mark" style={{
    left: `${mark.x}%`,
    top: `${mark.y}%`
  }} aria-hidden="true">
              {mark.n}
            </span>)}
        </div>
      </div>
      {caption && <figcaption className="pl-shot__caption">{caption}</figcaption>}
    </figure>;
};

Connect your own Odoo instance with an instance URL, database name, username and API key, so you can push leads there as `crm.lead` records.

<div className="pl-availability">
  <div className="pl-availability__row">
    <div className="pl-availability__label">Where</div>
    <div className="pl-availability__value"><span className="pl-path">Integrations<span className="pl-path__sep">→</span>Integrations<span className="pl-path__sep">→</span>Apps & CRM</span></div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">Your role needs</div>
    <div className="pl-availability__value">Read access to Apps & CRM <code>read-integrations</code>. Admin, Member and Viewer have it by default.</div>
  </div>

  <div className="pl-availability__row">
    <div className="pl-availability__label">To create or change</div>
    <div className="pl-availability__value"><code>create-integrations</code> to add one, <code>update-integrations</code> to change one, on top of the permission above.</div>
  </div>

  <div className="pl-availability__note">If you cannot find this in your sidebar, your workspace may have a custom menu configuration. Contact support and we will check it for you.</div>
</div>

## Before you begin

* An Odoo instance with the CRM app installed, and a user who can create CRM leads there. We check both before saving the connection.
* Your instance URL, database name, username or email, and a personal API key from Odoo. Odoo has no shared app credentials at all, so this connects the same way on every workspace, including partner-branded ones.

## Steps

<Steps>
  <Step title="Open the Odoo connect dialog">
    Go to <UiPath>Integrations → Apps & CRM</UiPath>, choose **Add integration**, then choose **Odoo** from the list. The dialog opens on a one-line description, a panel explaining how to create an Odoo API key, and the connection form underneath that.

    <Screenshot id="integrations/connect-odoo--api-key-howto" frame="bare" alt="The Connect Odoo dialog's panel titled How to create an Odoo API Key, with three numbered steps and a link to Odoo's own API documentation" caption="Every string in this dialog except Cancel is English only. The instructions read the same whatever language you use the app in." />
  </Step>

  <Step title="Create an API key in Odoo">
    The panel's three steps point at Odoo's own settings:

    1. In Odoo, click your avatar (top-right) and open Preferences.
    2. Go to the Account Security tab and click New API Key.
    3. Copy the generated key and paste it below with your login email.

    The panel also links to Odoo's own external API documentation.
  </Step>

  <Step title="Fill in your Odoo details and choose the record type">
    Paste your **Odoo Instance URL** (it needs to start with `http://` or `https://`), **Database Name** (usually your `.odoo.com` subdomain), **Username / Email**, and the **API Key** you just copied. Under **Create pushed leads as**, choose **Opportunity** or **Lead**: an opportunity always shows in the Odoo pipeline, while a lead needs the optional Leads feature turned on in Odoo's own CRM settings first.

    <Screenshot id="integrations/connect-odoo--form" frame="bare" alt="The Connect Odoo dialog's form: Odoo Instance URL, Database Name, Username / Email and API Key fields, with Create pushed leads as set to Opportunity" caption="The record type is the one choice unique to this connector, and it decides whether a pushed lead shows up in Odoo's pipeline at all." />
  </Step>

  <Step title="Connect">
    Choose **Connect**. The button stays disabled until all four fields have something in them. We authenticate against your Odoo instance with what you entered, then check that the account can create CRM leads there, before anything is saved. If both checks pass, the dialog switches to a success screen.

    <Note>
      Odoo API keys don't expire, so there's nothing to refresh or reauthorize later. A workspace only ever holds one Odoo connection: reconnecting with a different URL, database, username, key or record type replaces it rather than adding a second one. Auto-push settings already saved on the card survive that.
    </Note>
  </Step>
</Steps>

## What happens next

<Check>
  The dialog shows **Odoo Connected!** Choose **Done**, and the Odoo card on <UiPath>Integrations → Apps & CRM</UiPath> shows a **Connected** chip. The dialog itself doesn't name the account it connected to. The account name on the card is whatever we read back from Odoo: your Odoo company name if it has one, otherwise your user's name there, or plain Odoo if neither came back. The username you connected with sits under it.
</Check>

Connecting Odoo does not push any leads by itself. Nothing moves until you turn on **Auto-push analyzed leads** on the card, choose **Push to CRM** on a lead's own page, or add a Send to CRM step to a workflow. See [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) and [Push a lead to your CRM manually](/en/integrations/push-to-crm-manually).

Only one CRM ever owns a lead. If HubSpot, Salesforce, Kommo or HeyReach already created a record for it, the automatic push and a workflow's Send to CRM step both skip it, the workflow step reporting it as sent while creating nothing. A Slack or webhook connector does not count as an owner, so those still fire. A manual push from the lead's page carries no such check either, so it is the one CRM route that still goes through and can create a second record elsewhere.

Once a lead is pushed, it lands in Odoo as a `crm.lead` record, an opportunity or a lead depending on what you picked when you connected. Its title is built from the lead's name and its company's name, falling back to the lead's email address if it has no name. The record also carries the contact name, company name, most recently added email and phone number, job title, and the company's website (its first saved link, if none is marked as a website), leaving out whichever of those the lead does not have. The description is built from the lead's LinkedIn URL, the lead's own description, its company's description and summary, and its company's saved links, again whichever of those exist. Each message in the lead's email thread, aside from warm-up traffic, is then logged as an internal note on the record's chatter. [Field mapping reference per CRM](/en/integrations/what-gets-pushed-per-crm) has the complete, field-by-field version.

## Troubleshooting

<AccordionGroup>
  <Accordion title="'Could not connect to Odoo…'">
    The full message reads `Could not connect to Odoo. Check the URL, database name, username and API key.` The same message shows no matter what actually went wrong: an unreachable instance, a wrong database name, or credentials Odoo rejected all produce it. Requests to your instance also time out after 30 seconds, so a slow or unresponsive server ends up with the same message. Nothing was saved.
  </Accordion>

  <Accordion title="'This Odoo user cannot create CRM leads…'">
    The full message reads `This Odoo user cannot create CRM leads. Ensure the CRM app is installed and the user has access.` Your credentials worked, but the Odoo user you connected with cannot create `crm.lead` records. Install the CRM app in Odoo if it isn't there, or reconnect with a user who has access to it.
  </Accordion>

  <Accordion title="Connected, but leads aren't showing up in Odoo">
    Connecting only makes Odoo available as a destination. It doesn't push anything on its own, whatever the success screen's own line about leads being pushed to your Odoo CRM suggests. Check whether **Auto-push analyzed leads** is on for this card, and see [Auto-push analyzed leads and stage filters](/en/integrations/auto-push-and-stage-filters) for every reason a push can be silently skipped.
  </Accordion>
</AccordionGroup>

## Related

<CardGroup cols={2}>
  <Card title="Field mapping reference per CRM" icon="table" href="/en/integrations/what-gets-pushed-per-crm">
    What object each connector creates, which lead fields land where, and what happens to your email history.
  </Card>

  <Card title="Auto-push analyzed leads and stage filters" icon="send" href="/en/integrations/auto-push-and-stage-filters">
    What triggers an automatic push, which stages it fires on, and every reason a lead is silently skipped.
  </Card>
</CardGroup>
