Summary
Alta ships with a native Odoo integration for Flows. Once connected, you can search, create, and update contacts (res.partner), create CRM leads (crm.lead), and post internal notes on either record type — all from any Alta workflow.
Who this is for: Alta users who run their CRM in Odoo and want to push contacts, leads, or notes into Odoo from an Alta workflow (e.g., when a prospect replies, books a meeting, or hits a goal).
Before you start
You'll need four pieces of information from your Odoo instance to connect:
Base URL — your Odoo instance URL (e.g.,
https://yourcompany.odoo.com).Database Name — the Odoo database to authenticate against.
Email — the email of the Odoo user Alta will act as.
API Key — an API key generated for that Odoo user (Preferences → Account Security → New API Key in Odoo).
The user whose credentials you use should have permission to read and write res.partner and crm.lead records.
Note: Odoo is available in Alta as a Flows action provider only. It is not part of Alta's native bidirectional CRM sync layer (Salesforce, HubSpot, Pipedrive, Zoho, Dynamics 365) — so updates flow from Alta to Odoo through the actions below, not as a continuous mirror.
Step 1 — Connect Odoo to Alta
In Alta, open Settings → Integrations.
Find Odoo under Sales & CRM and click Connect.
Fill in all four required fields: Base URL, Database Name, Email, and API Key.
Save. The connection is now available for use in any Flow.
Step 2 — Add an Odoo action to a Flow
Open the Flow you want to extend (or create a new one).
Click the + on the step where Odoo should run.
Select Odoo, then choose one of the six available actions below.
Map the action's inputs to variables from earlier steps in the Flow.
The six available actions
1. Search Contact by Email
Looks up a contact in Odoo by exact email match.
Email (required) — the email address to search for.
Behavior: The search is case-insensitive and uses an exact-match comparison (no partial matches). It throws NotFoundError if no contact is found, and ValidationError if more than one contact has the same email — you'll need to resolve the duplicates in Odoo first.
2. Create Contact
Creates a new res.partner record.
Name (required) — full name of the contact.
Email, Phone, Street, City, Zip Code, Website — all optional.
3. Update Contact
Updates an existing res.partner by ID.
Contact ID (required) — the numeric Odoo partner ID.
Name, Email, Phone, Street, City, Zip Code, Website — provide only the fields you want to change. Empty fields are skipped, not blanked out.
Throws NotFoundError if the contact ID doesn't exist.
4. Create or Update Contact
Searches by email; if a contact exists, it's updated, otherwise a new one is created. Returns an action field of either "created" or "updated" so downstream steps can branch on the outcome.
Email (required) — used as both the search key and the email value when creating.
Name — required only when creating a new contact. If the contact already exists, name is optional.
Phone, Street, City, Zip Code, Website — optional.
If two or more Odoo contacts share the email, the action fails rather than guessing — clean up duplicates in Odoo before retrying.
5. Create Lead
Creates a new CRM opportunity (crm.lead).
Lead Title (required) — the title of the lead/opportunity.
Email — written to Odoo's
email_fromfield.Phone — optional.
Contact ID — optional Odoo partner ID to attach the lead to an existing contact.
Description — long-text body for the lead.
6. Add Note
Posts an internal note (mail thread message) on a contact or lead.
Record Type (required) — must be exactly
res.partner(Contact) orcrm.lead(Lead). Any other value is rejected with aValidationError.Record ID (required) — the Odoo ID of the contact or lead.
Note (required) — the note body. Long text supported.
Notes are posted as type comment with the mail.mt_note subtype, i.e., they appear as internal notes (not customer-facing messages) in Odoo's chatter.
Tips and common pitfalls
Email matching is exact. "Search Contact by Email" and "Create or Update Contact" both compare on lowercased, trimmed email. A trailing space or alternate casing in Odoo won't match — but unrelated wildcards (
%,_) in the input are safely escaped.Duplicate emails are a hard stop. If two contacts share an email, both lookup and upsert fail. This is intentional — Alta refuses to update the wrong record.
"Update Contact" is partial, not destructive. Only fields you supply are written. Leave a field blank to keep its existing value in Odoo.
"Create or Update Contact" requires Name only when creating. If you're not sure whether the contact exists, supply Name anyway — it's harmless on the update path.
Lead → Contact linking is by ID, not email. Use "Search Contact by Email" first if you only have an email, then pass the returned
contactIdto "Create Lead".API Key, not password. Use an Odoo API key (generated in Preferences → Account Security in Odoo). User passwords are not supported.
Permissions matter. The Odoo user must have read/write access to
res.partnerandcrm.lead, otherwise actions will fail with an authorization error from Odoo.
