Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to QuickBooks

Scalekit connector
Open markdown

The QuickBooks connector lets your AI agent act in each user's QuickBooks account. Each user signs in to QuickBooks once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 117 tools.

Tools
117
What they doRead · write · destructive
60 · 45 · 1260 read45 write12 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Manage invoices: create, update, send, and void invoices, and record customer payments against them
  • Manage customers and vendors: add and update customers, vendors, and employees in the company file
  • Track bills and expenses: create bills, pay them, and log purchases, purchase orders, and vendor credits
  • Handle sales documents: create and send estimates, sales receipts, credit memos, and refund receipts
  • Run financial reports: pull profit and loss, balance sheet, cash flow, aged receivables, and general ledger reports
  • Keep the books: post journal entries, deposits, and transfers, and manage accounts, items, and classes

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the QuickBooks connection

    In AgentKit > Connections, create a QuickBooks connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for QuickBooks, so you don't need to register an OAuth app. To show your own app on the consent screen, use your own credentials instead.

    Use your own OAuth app

    Register your Scalekit environment with the QuickBooks connector so Scalekit handles the authentication flow and token lifecycle for you. The connection name you create will be used to identify and invoke the connection programmatically. Then complete the configuration in your application as follows:

    1. Create a QuickBooks app

      • Sign in to the Intuit Developer Portal and go to Dashboard → + Create an app → select QuickBooks Online and Payments.

      • Under Keys & credentials, select the Production tab, then copy the Client ID and Client Secret. Use the Development tab credentials only for testing against the QuickBooks sandbox.

    2. Set up auth redirects

      • In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find QuickBooks and click Create. Copy the redirect URI. It looks like https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback.

      • Back in the Intuit Developer Portal, go to your app’s Keys & credentials settings and add the Scalekit redirect URI under Redirect URIs.
    3. Add credentials in Scalekit

      • In Scalekit dashboard, go to AgentKit > Connections and open the connection you created.

      • Enter your credentials:

        • Client ID (from your QuickBooks app)
        • Client Secret (from your QuickBooks app)
        • Permissions (OAuth scope strings): com.intuit.quickbooks.accounting offline_access
      • Click Save.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'quickbooks'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize QuickBooks:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'quickbooks_company_info_get',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • quickbooks_account_getRetrieve a single QuickBooks Online account by its ID.Read-only

    Get Account

    Retrieve a single QuickBooks Online account by its ID.

    Inputs

    account_idstringrequired
    The ID of the account to retrieve.
  • quickbooks_accounts_listList accounts from QuickBooks Online.Read-only

    List Accounts

    List accounts from QuickBooks Online. Use where_clause to filter (e.g. "AccountType = 'Bank'").

    Inputs

    max_resultsintegerrequired
    Maximum number of records to return.
    start_positionintegerrequired
    Starting position for pagination (1-based).
    where_clausestring
    Optional WHERE clause to filter accounts, e.g. "AccountType = 'Bank'"default Id != '0'
  • quickbooks_bill_getRetrieve a single QuickBooks Online bill by ID.Read-only

    Get Bill

    Retrieve a single QuickBooks Online bill by ID.

    Inputs

    bill_idstringrequired
    The ID of the bill.
  • quickbooks_bill_payment_getRetrieve a single QuickBooks Online bill payment by ID.Read-only

    Get Bill Payment

    Retrieve a single QuickBooks Online bill payment by ID.

    Inputs

    bill_payment_idstringrequired
    The ID of the bill payment.
  • quickbooks_bill_payments_listList bill payments from QuickBooks Online.Read-only

    List Bill Payments

    List bill payments from QuickBooks Online.

    Inputs

    max_resultsintegerrequired
    Maximum number of records to return.
    start_positionintegerrequired
    Starting position for pagination (1-based).
    where_clausestring
    Optional WHERE clause.default Id != '0'
  • quickbooks_bills_listList bills from QuickBooks Online with optional filtering and pagination.Read-only

    List Bills

    List bills from QuickBooks Online with optional filtering and pagination.

    Inputs

    max_resultsintegerrequired
    Maximum number of records to return.
    start_positionintegerrequired
    Starting position for pagination (1-based).
    where_clausestring
    Optional WHERE clause.default Id != '0'
  • quickbooks_class_getRetrieve a single QuickBooks Online class by ID.Read-only

    Get Class

    Retrieve a single QuickBooks Online class by ID.

    Inputs

    class_idstringrequired
    The ID of the class.
  • quickbooks_classes_listList classes from QuickBooks Online.Read-only

    List Classes

    List classes from QuickBooks Online.

    Inputs

    max_resultsintegerrequired
    Maximum number of records to return.
    start_positionintegerrequired
    Starting position for pagination (1-based).

Workflows

Proxy API call
const result = await actions.request({
connectionName: 'quickbooks',
identifier: 'user_123',
path: '/v3/company/{{realm_id}}/query?query=SELECT * FROM Customer MAXRESULTS 10 STARTPOSITION 1',
method: 'GET',
});
console.log(result);
List customers
const customers = await actions.executeTool({
connector: 'quickbooks',
identifier: 'user_123',
toolName: 'quickbooks_customers_list',
toolInput: {
max_results: 10,
start_position: 1,
},
});
console.log('Customers:', customers);
Create an invoice
const invoice = await actions.executeTool({
connector: 'quickbooks',
identifier: 'user_123',
toolName: 'quickbooks_invoice_create',
toolInput: {
CustomerRef: JSON.stringify({ value: '1' }),
Line: JSON.stringify([
{
Amount: 150.00,
DetailType: 'SalesItemLineDetail',
SalesItemLineDetail: {
ItemRef: { value: '1', name: 'Services' },
Qty: 1,
UnitPrice: 150.00,
},
},
]),
DueDate: '2025-06-30',
DocNumber: 'INV-001',
},
});
console.log('Created invoice ID:', invoice.Invoice?.Id);