Webhook tool

QuickBooks AI voice agents that answer billing calls

A Cartesia agent finds the caller's QuickBooks Online customer, reads their open invoices and balance, and notes the date they promise to pay.

Billing line agent

Answers balance questions and records payment promises in QuickBooks.

Instructions

Ask for the name on the account and look up the balance. Read the amount due and the oldest due date. If the caller commits to paying, repeat the amount and date back, then log the promise. If the caller has no account, ask for the billing email and create the customer. Never ask for card numbers. Transfer disputes to billing.

Handoff
Billing team

Connected tools

  • Look up balanceWebhook
  • Log payment promiseWebhook
  • Create customerWebhook
  • Transfer to billingTransfer

What a QuickBooks Online AI voice agent can do

Open one to watch a call. The grey lines are the tools the agent calls mid-sentence.

The agent asks for the name on the account. Your service queries that customer's open invoices and returns the amount due.

Tool definitions

Webhook tools go to POST /v1/agents/tools. Transfers are a system tool on the agent. Replace the placeholder values in capitals with your own.

Webhook

Look up balance

Returns the customer's open invoices and total due.

Show the JSON definition
look_up_balance
{
  "type": "webhook",
  "name": "look_up_balance",
  "description": "Finds the QuickBooks customer by the name on the account and returns the customer ID and their open invoices, amounts due and due dates.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/quickbooks/balance",
    "method": "GET",
    "query_params_schema": {
      "properties": {
        "customer_name": {
          "type": "string",
          "description": "The business or person name on the account, as the caller says it."
        },
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        }
      },
      "required": [
        "customer_name"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Log payment promise

Adds the promised amount and date to the customer's notes.

Show the JSON definition
log_payment_promise
{
  "type": "webhook",
  "name": "log_payment_promise",
  "description": "Records the amount and date the caller promised to pay on their QuickBooks customer.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/quickbooks/customers/{customer_id}/promises",
    "method": "POST",
    "path_params_schema": {
      "customer_id": {
        "type": "string",
        "description": "The customer ID from look_up_balance."
      }
    },
    "request_body_schema": {
      "type": "object",
      "properties": {
        "amount": {
          "type": "number",
          "description": "The amount the caller promised to pay."
        },
        "promised_date": {
          "type": "string",
          "description": "The date the caller promised to pay, YYYY-MM-DD."
        }
      },
      "required": [
        "amount",
        "promised_date"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Create customer

Creates a QuickBooks customer for a new caller.

Show the JSON definition
create_customer
{
  "type": "webhook",
  "name": "create_customer",
  "description": "Creates a QuickBooks customer for a caller who has no account. Returns the new customer ID.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/quickbooks/customers",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "display_name": {
          "type": "string",
          "description": "The business or person name. It must be unique in QuickBooks."
        },
        "email": {
          "type": "string",
          "description": "Where invoices should go."
        },
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        }
      },
      "required": [
        "display_name"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Transfer

Transfer to billing

Cold transfer to your billing team.

Show the JSON definition
transfer_to_billing
{
  "config": {
    "system_tools": {
      "transfer_to_number": {
        "description": null,
        "pre_tool_speech": "auto",
        "transfers": [
          {
            "destination": {
              "type": "phone",
              "phone_number": "+14155550141"
            },
            "condition": "The caller disputes an invoice or asks for a person."
          }
        ]
      }
    }
  }
}

Set it up

No native connector. The tools call a small service of yours, which holds the Intuit OAuth connection and calls the QuickBooks Online Accounting API. Vendor details read in November 2026.

  1. Create an Intuit app

    In the Intuit Developer Portal, create an app with the com.intuit.quickbooks.accounting scope, connect your company, and keep the refresh token and realm ID in your service.

  2. Run the three endpoints

    Your service runs GET /v3/company/{realmId}/query against Customer and Invoice, POST /v3/company/{realmId}/customer for new callers, and a sparse customer update that writes the promise into Notes.

  3. Add the tools

    Point the tools at your service with a bearer secret. The phone fields read system__caller_id, so the agent never asks for the number.

  4. Test on a sandbox company

    Run every call against Intuit's sandbox company before your service connects to the live books.

Before you build

Why not call QuickBooks directly

Intuit access tokens last one hour, and the refresh token changes as you use it. A webhook tool sends the value you stored, so your service holds and refreshes the tokens.

Phone numbers aren't searchable

QuickBooks queries can't filter customers on PrimaryPhone. The agent asks for the name on the account, or your service keeps its own phone-to-customer index.

There's no promise-to-pay record

QuickBooks has no object for payment promises. This page writes them into the customer's Notes field with a sparse update, which needs the customer's current SyncToken.

Reads count toward a monthly cap

Intuit meters most reads, including queries, as CorePlus calls. The free Builder tier allows 500,000 a month and throttles calls above that.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

QuickBooks Online AI voice agent FAQs

Can an AI agent answer billing calls from QuickBooks Online?

Yes. A Cartesia agent finds the customer, reads their open invoices and balance, and notes the date they promise to pay, through a small service of yours that holds the Intuit OAuth connection and calls the QuickBooks Online Accounting API. New callers get a customer record. There is no native QuickBooks connector.

Can the QuickBooks AI agent take a payment on the call?

No. The tools on this page read balances, record payment promises and create customers. The agent's instructions tell it never to ask for card numbers.

Can the agent find a QuickBooks customer by caller ID?

Not with QuickBooks queries alone, because they can't filter customers on PrimaryPhone. The agent asks for the name on the account, or your service keeps its own phone-to-customer index and looks up the caller ID there.

Where does a promise to pay go in QuickBooks?

In the customer's Notes field. QuickBooks has no object for payment promises, so your service writes the amount and date with a sparse customer update, which needs the customer's current SyncToken. Your team sees it before they chase.

Does it work with QuickBooks Desktop?

No. This page uses the QuickBooks Online Accounting API, and QuickBooks Desktop needs a different connector. The rest of the agent, its instructions and its transfer to billing, would stay the same.

What does a QuickBooks voice agent cost to run?

Agents run at $0.03/min, plus LLM usage and telephony. Intuit meters reads as CorePlus calls, and its free Builder tier allows 500,000 a month and throttles calls above that.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia