Skip to main content

QuickBooks Setup

Configuring a custom Intuit developer app for use with Caddi

Caddi connects to QuickBooks Online through an app you create in the Intuit Developer portal. Development credentials are issued immediately; production credentials require Intuit to review a short questionnaire first.

Plan for two rounds. You'll get development keys straight away and can test against a sandbox company, but production keys only unlock after Intuit accepts your App Assessment Questionnaire. Start that questionnaire early if you have a go-live date.

Before you start

You'll need:

  • A free Intuit Developer account at developer.intuit.com

  • Owner or Admin access to your Caddi organization

  • A QuickBooks Online company admin to authorize the connection

Step 1: Create the app in the Intuit Developer portal

  1. Go to Apps and Resources → My Apps and click Create an app.

  2. Choose QuickBooks Online and Payments.

  3. Name the app Caddi and select the scope com.intuit.quickbooks.accounting.

  4. Click Create app.

Step 2: Add the redirect URI and copy the credentials

Development and production have separate credential sets and separate redirect URI lists. Whatever you configure on one does not carry over.

  1. Open your app and go to Development Settings → Keys & credentials.

  2. Under Redirect URIs, click Add URI and enter https://app.trycaddi.com/oauth-callback, then save.

  3. Copy the Client ID and Client Secret.

  4. Add the Reconnect URL as well. Intuit made this mandatory in February 2026 — it's the page a customer lands on to re-authorize. Contact Caddi support for the value to use.

Redirect URIs must match exactly, including protocol, trailing slash, and port. A mismatch produces a bare invalid_client error with no further explanation.

Step 3: Request production credentials

Do this when you're ready to connect a real QuickBooks company.

localhost redirect URIs are accepted in Development Settings but rejected in Production Settings.

  1. Open Production Settings on your app.

  2. Complete the App Assessment Questionnaire.

  3. Once Intuit accepts it, the production Client ID and Client Secret become available under Production Settings → Keys & credentials.

  4. Add https://app.trycaddi.com/oauth-callback to the production redirect URI list as well — it does not carry over from development.

Publishing to the QuickBooks App Store is a separate and heavier review. A private integration needs the questionnaire, not a store listing.

Step 4: Configure QuickBooks in Caddi

This step must be completed by a Caddi organization owner or admin.

  1. In Caddi, open Integrations in the left sidebar, then click the Integration Setup tab at the top of the page. This tab is only visible to organization owners and admins.

  2. Find Intuit QuickBooks in the list and click Configure.

Enter the following values:

  • Client ID — from Production Settings → Keys & credentials once approved, or Development Settings while testing

  • Client Secret — from the same place

  • OAuth Scopes — leave blank to use Caddi's default of com.intuit.quickbooks.accounting. That single scope covers full read and write on accounting entities and is not an admin scope. Add com.intuit.quickbooks.payment only if a loop processes payments.

Click Save Configuration. Caddi validates the credentials immediately — if something is wrong you'll see an error right away, and nothing is stored until validation passes.

Step 5: Connect your account

  1. Go back to the My Connections tab and find QuickBooks.

  2. Click Connect + and sign in to QuickBooks as a company admin.

  3. Select the company to connect and approve the request.

  4. You'll be returned to Caddi with the connection active.

How the connection behaves

  • Each connection is to one QuickBooks company. Caddi stores the company identifier returned at sign-in, so connecting a different company creates a separate connection rather than replacing the first.

  • Access tokens last one hour and refresh automatically.

  • Refresh tokens rotate roughly every 24 hours, and Intuit changed its refresh policy in November 2025 to give every refresh token a hard five-year maximum. The first forced expirations land in February 2027 for granular scopes and October 2028 for accounting and payments scopes. Caddi handles the rotation; the five-year ceiling means a very long-lived connection will eventually need reauthorizing.

  • Disconnecting in QuickBooks kills the tokens. If a company admin disconnects Caddi from the QuickBooks side, or connects a different company, the existing connection ends.

  • Sandbox and production credentials are not interchangeable. Mixing them returns a bare invalid_client.

  • Rate limits are roughly 500 requests per minute per company. Large loops will pace against this.

Troubleshooting

invalid_client with no further detail

Nearly always one of three things: sandbox credentials in a production configuration, a redirect URI that doesn't match https://app.trycaddi.com/oauth-callback character for character, or the URI added to Development Settings but not Production Settings.

Production keys aren't available on the app

The App Assessment Questionnaire under Production Settings hasn't been completed or accepted yet.

invalid_grant and the connection is dead

A stale refresh token was replayed, which permanently revokes the connection. The QuickBooks admin needs to reconnect. If this recurs, contact Caddi support.

Loops see the wrong company's data

More than one QuickBooks company is connected. Check which connection the loop is using in the loop's configuration.

Still stuck? Contact Caddi support with the exact error message you're seeing and the time it occurred.

Automation ideas

Law Firms

Client payment → matter ledger reconciliation

Caddi reads payments recorded in QuickBooks, matches them to the right matter, and updates the ledger in your practice management system so trust accounting stays current.

Vendor invoice → bill entry

Caddi reads an incoming invoice, extracts the vendor, amount, and matter reference, and creates the QuickBooks bill for approval.

Month-end → reconciliation exception report

Caddi compares QuickBooks against your billing system and reports only the entries that don't line up, rather than making someone tick through all of them.

RIAs

Fee billing cycle → invoice creation

Caddi calculates advisory fees from portfolio data and creates the QuickBooks invoices, with a review step before anything is sent.

Expense receipt → categorized entry

Caddi reads submitted receipts, categorizes them against your chart of accounts, and creates the QuickBooks expense entries.

Did this answer your question?