# Connecting your accounting software

You can connect ai-collect to your accounting software so overdue invoices flow in automatically and recovered payments reconcile back. This is optional — you can also upload placements one-at-a-time or via CSV. But if you place more than a few accounts per month, the integration saves real time.

> Status: Integrations are in active development. This page describes the target experience. Today, QuickBooks Online is in **private beta**; Xero, NetSuite, and Sage are next. See [Future Idea 01 — Accounting integrations](https://github.com/knollmeyersam-dot/MC-Docs/blob/main/docs/future-ideas/01-accounting-integrations.md) for the engineering roadmap.

## What we sync

| Direction | Object                                                  | When                                                                  |
| --------- | ------------------------------------------------------- | --------------------------------------------------------------------- |
| Inbound   | Overdue invoices from your QBO account                  | Backfill on connect; ongoing via the QBO webhook (`/v1/webhooks/qbo`) |
| Inbound   | Debtor contact information from your customer record    | At sync time                                                          |
| Inbound   | Payments recorded against synced invoices               | Within minutes via the QBO webhook                                    |
| Outbound  | Payment received → applied to the invoice in your books | *Not in v0*                                                           |
| Outbound  | Account closed (paid in full or written off)            | *Not in v0*                                                           |

> **v0 scope:** the QuickBooks Online beta is **inbound only**. We do not write payments back to your QuickBooks during the beta. A self-serve placement-rules UI is not yet built — during the beta we work with you to define which invoices flow in. Outbound writes and a creditor-facing filter UI are post-v0 deliverables.

## Supported platforms

| Platform                       | Status                        | Notes                                           |
| ------------------------------ | ----------------------------- | ----------------------------------------------- |
| QuickBooks Online              | Private beta                  | OAuth flow via Intuit                           |
| Xero                           | Coming soon                   | OAuth via Xero                                  |
| NetSuite                       | Coming soon                   | Token-based or SuiteApp                         |
| Sage Intacct                   | Coming soon                   | Token-based                                     |
| QuickBooks Desktop             | Planned                       | Through a unified-API provider (Codat / Rutter) |
| Other (Zoho, Wave, FreshBooks) | Through unified-API providers | Talk to us about your platform                  |

Don't see your platform? Use [CSV upload](/for-creditor-partners/creditor-onboarding/uploading-your-first-placements.md) for now and tell us — we prioritize integrations by request volume.

## Connecting (QuickBooks Online)

1. **Settings → QuickBooks Online.** *(If you don't see the panel, your tenant's `qbo_enabled` flag is off — email <support@moderncollections.io> and ask to be enabled. The platform-wide `qbo_kill_switch` setting can also disable the integration globally during incidents.)*
2. The dashboard calls `POST /v1/integrations/qbo/connect-url` to mint a single-use `state` token and returns Intuit's authorize URL, then redirects you there.
3. Sign in with the **QuickBooks admin** account for the company you want to connect. Non-admin Intuit users cannot authorize the app — this is an Intuit-side restriction.
4. **Confirm the permissions screen.** We request `com.intuit.quickbooks.accounting` (read) — that's the scope Intuit advertises; it covers customers, invoices, and payments. We do **not** request bank feeds, payroll, or write scopes.
5. Choose the QuickBooks company (`realmId`). If you have multiple, pick the one that holds the receivables you want collected.
6. Intuit redirects to `GET /v1/integrations/qbo/callback` with the `code`, `state`, and `realmId` query parameters. The callback consumes the state token, exchanges the code for tokens, persists an encrypted integration row, and 302s you back to the dashboard with `?qbo=connected`.
7. The initial backfill kicks off in the background. New placements coming from the integration are tagged with the `accounting_sync` intake channel.

## What happens if I disconnect

You can disconnect QuickBooks at any time via **Settings → QuickBooks Online → Disconnect** (`DELETE /v1/integrations/qbo`), or from Intuit's app management page (<https://qbo.intuit.com/app/connectedapps>).

When you disconnect:

* **We stop syncing.** No new invoices are pulled. No new payments are detected.
* **Active placements continue.** Any debt we're already collecting on stays in our system and outreach continues unless you also tell us to stop.
* **Tokens are revoked.** If you reconnect later, you'll go through the consent screen again.
* **Data is retained.** Your historical placements and audit trail remain — disconnecting an integration does not delete your account.

If you want us to stop **all outreach** in addition to disconnecting, email <support@moderncollections.io> or pause your placements from the dashboard.

## What if my bookkeeper marks an invoice paid in QuickBooks?

This is the scenario we care most about getting right. Here's what happens:

1. **Your bookkeeper records a payment in QuickBooks** — say, a check the debtor mailed you directly.
2. **Within minutes**, our system sees the payment via Intuit's `/v1/webhooks/qbo` push (HMAC-verified with the `qbo_webhook_verifier_token` setting). A scheduled backfill is the fallback if a webhook is missed.
3. **The placement is matched** against the QBO payment within `qbo_oob_amount_tolerance_cents` (default 1¢) and `qbo_oob_match_window_minutes` (default 60 minutes) of the expected window.
4. **We mark the placement** with status `resolved_out_of_band` so outreach stops. The contingency-fee terms in your pilot agreement apply (which may be reduced or waived for out-of-band payments — check your contract).
5. **You'll see this in the dashboard** as a closed placement with the resolution reason "paid out-of-band".

**What we ask of your bookkeeper:**

* **Mark invoices paid in QuickBooks promptly** when payments come in directly. Same-day is best.
* **Don't worry about the memo.** We detect the payment automatically; you don't need to add any reference to ai-collect.

**What if we got it wrong?** If we resolve a placement as out-of-band but the payment wasn't real (e.g., your bookkeeper applied a credit memo by mistake), email <support@moderncollections.io>. We have a documented procedure to safely restore the placement and resume outreach.

## How reconciliation works (v0)

When a debtor pays **us** — via the ai-collect debtor portal — we record the payment, send you a daily reconciliation report, and net our contingency. In v0 we do **not** automatically apply payments back to your QuickBooks; that's a v1 feature.

When a debtor pays **you** directly — outside our portal — we detect it via the QBO Payments feed (see the previous section) and stop outreach. The fee terms in your pilot agreement apply.

See [Reconciling with your accounting](/for-creditor-partners/creditor-finance/reconciling-with-your-accounting.md) for the full breakdown.

## Privacy & what each permission means

When you authorize ai-collect on Intuit's consent screen, you'll see a list of scopes. Here's what each one means in plain English:

| Permission                                | Plain English                                         | Why we ask                                                                              |
| ----------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------- |
| `com.intuit.quickbooks.accounting` (read) | Read access to your customers, invoices, and payments | Required. We pull overdue invoices and detect direct payments.                          |
| Read payments                             | See when a payment is recorded against an invoice     | Required. This is how we detect that you've been paid directly and should stop dunning. |
| Write payments                            | Record payments **into** your QuickBooks              | **Not requested during the beta.** Will be added in a later version.                    |
| Bank feeds                                | Read your bank account balances                       | **Not requested.** Ever.                                                                |
| Payroll                                   | Read your employee or payroll data                    | **Not requested.** Ever.                                                                |

If Intuit shows you a permission we don't list here, **do not authorize the app** and email <security@moderncollections.io> immediately.

## TODO (private beta)

Screenshots will be filled in as we walk pilot creditors through the flow:

* [ ] Settings → Integrations page with Connect button visible (from a flag-enabled creditor account).
* [ ] Intuit OAuth consent screen, with our scope list visible.
* [ ] Dashboard "initial sync in progress" state.
* [ ] Dashboard "placement preview" before confirmation.
* [ ] Dashboard "placement closed — paid out-of-band" state.
* [ ] Disconnect confirmation dialog.

***

Last reviewed: 2026-05-24 by Customer Success.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.moderncollections.io/for-creditor-partners/creditor-onboarding/connecting-your-accounting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
