ml-connector
QuickBooks OnlineSlack

QuickBooks Online and Slack integration

QuickBooks Online holds all your financial records. Slack is where your team collaborates. Connecting them keeps finance events visible to the right people in real time. When a new vendor bill arrives in QuickBooks Online, your AP team sees it in Slack. When an invoice is paid, the cash flow update posts to a finance channel. ml-connector watches QuickBooks Online through webhooks and pushes structured summaries into Slack without manual intervention.

How QuickBooks Online works

QuickBooks Online exposes vendors, customers, employees, accounts, bills, invoices, journal entries, and payments through the QuickBooks Online Accounting API v3, a REST service authenticated with OAuth 2.0. Access tokens last one hour and refresh tokens rotate every 24-26 hours. The API supports both webhooks for real-time events on entities like Bill, Invoice, JournalEntry, and Payment, and a CDC (Change Data Capture) endpoint for polling up to 30 days of history. Webhook payloads contain only the entity ID and operation type, so ml-connector must fetch the full record via GET. QuickBooks Online requires exact object representations with SyncToken for concurrency control, and soft-deletes (marking inactive) rather than hard deletes for vendors, customers, and accounts.

How Slack works

Slack exposes users, conversations, messages, files, and reactions through the Slack Web API and Events API, with a base URL of https://slack.com/api/{method}. OAuth 2.0 provides non-expiring bot tokens (xoxb- prefix) and user tokens (xoxp- prefix), both passed via Authorization Bearer header. The Events API delivers workspace activity via HTTPS POST callbacks with HMAC-SHA256 signature verification required on every incoming event. Slack enforces a 3-second response window and retries failed deliveries up to three times with exponential backoff. Chat message posting is rate-limited to one per second per channel, and signature verification must use constant-time comparison to prevent timing attacks.

What moves between them

The main flow is one-way from QuickBooks Online into Slack. ml-connector listens for QuickBooks Online webhook events (Create/Update on Bill, Invoice, JournalEntry, Payment) and routes them to designated Slack channels based on entity type and content. Each Slack message includes the key details: bill number, amount, vendor name for bills; invoice number, customer, amount for invoices; and account, amount, line items for journal entries. Reference data like accounts and departments are mapped to descriptive names so Slack messages are readable. Payments and bill settlements also post to Slack when they occur, giving the team real-time visibility into cash flow and AP aging.

How ml-connector handles it

ml-connector holds both OAuth credential sets encrypted and refreshes the QuickBooks Online access token when it expires (every hour) and the refresh token when it rotates (every 24-26 hours). It listens for QuickBooks Online webhook events, but since webhook payloads contain only entity IDs, ml-connector fetches the full record via GET /v3/company/{realmId} for detailed content. Because QuickBooks Online webhooks can arrive out-of-order or duplicated, ml-connector deduplicates using the entity ID and operation timestamp. On the Slack side, ml-connector constructs messages with account mappings (Account ID to friendly account name), formats amounts with currency, and posts via chat.postMessage respecting the one-per-second rate limit with queuing. If Slack rejects a message (rate limit, temporary outage), ml-connector retries with exponential backoff. The integration tracks webhook delivery and handles stale refresh tokens by surfacing the issue in audit logs so an admin can force re-authorization before the entire auth chain revokes.

A real-world example

A mid-sized professional services firm runs QuickBooks Online for accounting and uses Slack for team communication. Finance staff, project managers, and principals are distributed across time zones. Before the integration, a bookkeeper manually reviewed daily bills in QuickBooks Online and summarized notable items in a daily Slack thread, a routine task that ate 30 minutes per day and lagged by hours. With QuickBooks Online and Slack connected, every bill, invoice, and journal entry posts automatically to the finance channel the instant it is created or updated. Project managers see when their customer invoices are finalized and can notify clients. The finance team spots large or unusual bills immediately and can flag them before payment. Month-end journal entries appear in real time instead of being buried in a spreadsheet.

What you can do

  • Post QuickBooks Online bills, invoices, and journal entries to Slack channels as they are created or updated, with vendor, customer, account, and amount details.
  • Automatically refresh OAuth tokens for both QuickBooks Online and Slack so the connection stays active without manual re-authorization.
  • Map QuickBooks Online accounts, vendors, and departments to friendly names in Slack messages for readability.
  • Handle out-of-order and duplicate webhook events from QuickBooks Online by deduplicating on entity ID and timestamp.
  • Route different entity types to different Slack channels based on configurable channel mappings (bills to ap, invoices to ar, entries to finance).

Questions

Does the integration handle QuickBooks Online's token rotation?
Yes. QuickBooks Online access tokens expire every hour and refresh tokens rotate every 24-26 hours. ml-connector refreshes automatically and tracks token rotation so stale credentials do not cause silent failures. If a refresh token becomes invalid, ml-connector logs the error so you can re-authorize before the entire auth chain revokes.
How does ml-connector handle QuickBooks Online webhook limitations?
QuickBooks Online webhooks include only entity ID and operation type, not the full record. ml-connector fetches the complete record via GET immediately after receiving the webhook. Since webhooks may arrive out-of-order or be duplicated, ml-connector deduplicates using the entity ID and operation timestamp to prevent duplicate Slack messages.
Does Slack's rate limit affect message delivery?
Slack enforces a one-message-per-second limit per channel. ml-connector queues messages and respects this limit, so all financial events post to Slack, but may be delayed a few seconds if multiple events occur rapidly. Failed deliveries are retried with exponential backoff until successful.

Related integrations

Connect QuickBooks Online and Slack

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

Get started