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
Sign in at developer.intuit.com.
Go to Apps and Resources → My Apps and click Create an app.
Choose QuickBooks Online and Payments.
Name the app
Caddiand select the scopecom.intuit.quickbooks.accounting.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.
Open your app and go to Development Settings → Keys & credentials.
Under Redirect URIs, click Add URI and enter
https://app.trycaddi.com/oauth-callback, then save.Copy the Client ID and Client Secret.
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.
Open Production Settings on your app.
Complete the App Assessment Questionnaire.
Once Intuit accepts it, the production Client ID and Client Secret become available under Production Settings → Keys & credentials.
Add
https://app.trycaddi.com/oauth-callbackto 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.
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.
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. Addcom.intuit.quickbooks.paymentonly 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
Go back to the My Connections tab and find QuickBooks.
Click Connect + and sign in to QuickBooks as a company admin.
Select the company to connect and approve the request.
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.
