ml-connector
OdooMicrosoft Teams

Odoo and Microsoft Teams integration

Odoo runs your accounting, purchasing, and HR. Microsoft Teams is where your finance team collaborates and approves. Connecting the two brings critical accounting events to the channels where decisions happen, so invoice reviews and payment approvals do not get buried in email. Odoo invoices, purchase orders, and payments flow into Teams channels as notifications and approval cards, and the finance team can respond without logging into Odoo.

How Odoo works

Odoo exposes accounting records--invoices, purchase orders, payments, GL accounts, and analytic accounts--through XML-RPC and JSON-2 REST APIs. Authentication uses an API key paired with a username, and the base URL varies by Odoo deployment (Odoo Online subdomains, Odoo.sh subdomains, or self-hosted). Polling with write_date filters is the production-grade sync method. Odoo has no production-grade webhooks, so records are read by polling at regular intervals. External API access requires Custom pricing; Standard and One App Free tiers cannot publish data externally.

How Microsoft Teams works

Microsoft Teams is accessed through the Microsoft Graph REST API using OAuth 2.0 client credentials. Every call requires a valid bearer token obtained from https://login.microsoftonline.com. Teams does not store accounting data itself but provides channels where messages can be posted and webhooks can be registered to listen for team and channel events. Webhooks via Microsoft Graph change notifications require a subscription that expires every 3 days and must be renewed. Teams is a communications surface, not a data source.

What moves between them

Records flow one way: from Odoo to Microsoft Teams. When an invoice or purchase order is created or updated in Odoo, ml-connector polls the account.move and purchase.order models with a high-water mark and posts a notification to a designated Teams channel. Payment records and GL postings are also notified so the finance team sees the full accounting picture as it happens. No data flows back into Odoo from Teams.

How ml-connector handles it

ml-connector stores the Odoo API key and username encrypted and polls the Odoo API at configurable intervals using write_date filters to fetch only new or modified records since the last sync. For Microsoft Teams, ml-connector uses the OAuth client ID and secret to obtain and refresh bearer tokens from the Microsoft Entra ID token endpoint. When a new record arrives from Odoo, ml-connector formats it as a Teams adaptive card and POSTs it to the target channel via the Microsoft Graph chatMessage endpoint. Because Odoo has no incoming webhooks, polling is driven by a schedule; because Teams subscriptions expire in 3 days, ml-connector renews the subscription on every polling cycle. The Odoo user's access rights and record rules are respected, so only records visible to the integration user are synced. Microsoft Graph rate limits are managed with exponential backoff retries.

A real-world example

A mid-sized wholesale distribution company uses Odoo for accounting and purchasing and uses Microsoft Teams for sales and operations collaboration. Before the integration, the AP team manually exported invoices from Odoo once a day and posted summaries to a Teams channel for management approval, a process that delayed payment decisions by hours. With Odoo and Microsoft Teams connected, each new invoice in Odoo triggers an immediate notification in the finance approval channel, including the vendor name, invoice total, due date, and a summary of line items. Payment approvals that come through Teams trigger a workflow that marks the invoice as approved in Odoo, eliminating manual status updates.

What you can do

  • Post Odoo invoices, purchase orders, and payments to Microsoft Teams channels with vendor and amount details.
  • Format Odoo accounting records as Teams adaptive cards to provide rich detail without leaving the collaboration surface.
  • Authenticate Odoo with API key and Microsoft Teams with OAuth 2.0 credentials, managing token refresh automatically.
  • Poll Odoo on a configurable schedule with high-water-mark filtering to send only new or modified records.
  • Respect Odoo access rights so the integration surface shows only records visible to the assigned integration user.

Questions

Can data flow back from Microsoft Teams into Odoo?
No. This integration is one-way: Odoo accounting events flow into Microsoft Teams for visibility and approval workflow. Microsoft Teams is a communication platform without accounting data, so there is nothing to send back into Odoo. Approvals that happen in Teams can trigger a status update in Odoo via a separate workflow step, but Teams itself does not publish data.
How does the integration handle Odoo API key authentication?
ml-connector stores the Odoo API key and username encrypted and uses them to call the Odoo XML-RPC or JSON-2 endpoints on a configurable poll schedule. The integration user's Odoo access rights and record rules are respected, so only records visible to that user are fetched. Odoo requires Custom pricing to allow external API access; Standard and One App Free plans do not support this integration.
How are Microsoft Graph subscriptions managed if they expire every 3 days?
ml-connector renews the Teams webhook subscription on every polling cycle so it does not lapse. Because Odoo has no incoming webhooks, ml-connector polls on a schedule anyway; Teams subscription renewal happens as a side effect of that polling. If a subscription renewal fails, the integration logs an error and retries on the next poll cycle until the subscription is restored.

Related integrations

Connect Odoo and Microsoft Teams

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started