ml-connector
QuickBooks OnlineMicrosoft Teams

QuickBooks Online and Microsoft Teams integration

QuickBooks Online runs your accounting. Microsoft Teams connects your team. When bills arrive in QuickBooks, approvers see them in Teams instantly instead of waiting for email. Customer invoices, expense transactions, and journal postings flow directly into the channel you choose, rich-formatted with amounts, vendor names, and due dates so context is never missing. ml-connector handles the OAuth2 handshake on both sides and maps QuickBooks webhook events into Teams message payloads without manual setup.

How QuickBooks Online works

QuickBooks Online is Intuit's cloud accounting platform for small-to-mid-market businesses, exposing vendors, customers, invoices, bills, payments, accounts, journal entries, and items through the QuickBooks Online Accounting API (v3) over HTTPS. Authentication uses OAuth2 Authorization Code flow with access tokens expiring in 1 hour and refresh tokens rotating every 24-26 hours. The platform supports both webhook push (Create/Update/Delete/Merge/Void events on core entities like Invoice, Bill, Payment, JournalEntry) and polling via a CDC endpoint with 30-day history. Webhook payloads contain only the entity ID and operation type, so full record details must be fetched via GET request.

How Microsoft Teams works

Microsoft Teams is accessed through the Microsoft Graph REST API and uses OAuth2 Client Credentials flow (app-only tokens from Microsoft Entra ID). Teams has no native accounting objects like invoices or GL accounts, but it excels as a notification and approval surface. Teams channels accept formatted messages (text, rich cards, actionable buttons) posted to /teams/{team-id}/channels/{channel-id}/messages. Subscriptions to Teams resources (like chatMessage create events) expire within 3 days and must be renewed. All application permissions require Azure AD admin consent, including User.ReadWrite.All for profile operations.

What moves between them

Data flows one direction: from QuickBooks into Teams. When a vendor bill, invoice, customer payment, or journal entry is created or updated in QuickBooks, the webhook fires and ml-connector fetches the full record. It formats the transaction details (vendor name, amount, GL account, date, reference number) and posts a message to the channel configured for that event type. This keeps the finance team, approvers, and executives synchronized without forwarding email or copying details by hand. Deletions and voids are also posted so the channel history reflects the true state.

How ml-connector handles it

ml-connector registers a webhook with QuickBooks for a curated set of entity types (Invoice, Bill, Payment, JournalEntry, etc.). When an event fires, QuickBooks delivers the entity ID; ml-connector then fetches the full record using the OAuth2 access token and formats it into a Teams message. The message includes the transaction amount, parties involved, due date (for bills), and GL account mapping so recipients understand impact immediately. Teams messages are posted using Microsoft Graph with the app's Client Credentials token. OAuth2 access tokens are cached and refreshed when expired, and QuickBooks refresh tokens (which rotate every 24-26 hours) are stored encrypted and reused on the next auth refresh cycle. ml-connector validates every message against the channel's configuration so sensitive data like PII or cost allocations can be masked or split across multiple channels by rule.

A real-world example

A regional accounting firm manages multiple small-business client QuickBooks instances. Before the integration, the firm's staff saw bills and invoices arriving in QB but had to email transaction summaries to client approvers and stakeholders who often missed the messages or replied with old questions. Now, each QB instance is mapped to a Teams channel or DM thread, and when a bill arrives, a formatted message with vendor name, amount, due date, and account code posts automatically. Approvers see the transaction immediately, can ask questions in-thread, and the message stays in the channel history for audit. Deletions and voids are logged the same way, so no changes slip past unnoticed.

What you can do

  • Post QuickBooks vendor bills, customer invoices, and payments to Teams channels the moment they are created or updated.
  • Format transaction details including amount, party names, GL accounts, and due dates in readable Teams messages.
  • Route different event types to different channels so finance approvals stay separate from executive reports.
  • Refresh OAuth2 tokens on both sides automatically so the connection never breaks mid-month.
  • Track all posted messages in the audit log with full record IDs for downstream dispute resolution and compliance.

Questions

Does this integration move data from Teams back into QuickBooks?
No. Data flows only from QuickBooks into Teams as notifications and messages. Teams is used as an approval surface and communication hub, not a data source. QuickBooks records remain the system of record.
How does the integration handle the fact that QuickBooks webhook payloads contain only an entity ID, not the full transaction?
ml-connector receives the webhook event and entity ID from QuickBooks, then immediately fetches the full record (invoice, bill, payment) using a separate GET request with the OAuth2 access token. This ensures the Teams message includes all relevant details like amount, vendor name, GL account, and due date without user involvement.
What happens when QuickBooks OAuth2 tokens expire or refresh tokens rotate?
ml-connector caches access tokens and automatically refreshes them when a request returns an auth error. QuickBooks refresh tokens rotate every 24-26 hours by design; ml-connector stores the new token securely and uses it on the next refresh cycle. If the entire auth chain breaks, the user re-authorizes once via the Intuit consent screen and the connection restarts.

Related integrations

Connect QuickBooks Online and Microsoft Teams

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

Get started