QuickBooks Online Integration Guide

Connect QuickBooks Online billing to LawLink.ai โ€” customers, invoices, payments & reports

๐Ÿ’ต QuickBooks Online
๐Ÿ“–

Overview

QuickBooks Online brings billing & accounting into LawLink. It plugs into the same Universal API and MCP layers every other integration uses, so an AI assistant or an API client can list a firm's customers, raise invoices, record payments, and pull financial reports through one consistent interface.

๐Ÿ‘ฅ Customers

QBO Customers, exposed as universal contacts.

listgetcreateupdate

๐Ÿงพ Invoices

Bill a customer for products/services.

listgetcreate

๐Ÿ’ณ Payments

Record money received, optionally against an invoice.

listgetcreate

๐Ÿ“ฆ Items

Products/services referenced by invoice lines.

listget

๐Ÿ“„ Estimates

Quotes that can convert to invoices.

listgetcreate

๐Ÿ“Š Reports

Profit & Loss and Customer Balance (raw QBO report JSON).

read-only
๐Ÿš€

Setup & Connection

QuickBooks connects via OAuth 2.0. The connection is per-user and per-company (Intuit calls the company a realm).

Connect QuickBooks via the UI

Navigate to Integrations โ†’ QuickBooks and click Connect QuickBooks. You'll be sent to Intuit to sign in and pick the company to link. After you approve, Intuit redirects back and the connection is ready immediately.

QuickBooks Connect Form

What happens under the hood

During the callback Intuit returns a realmId (the company ID) alongside the auth code. LawLink stores it with the tokens because every QuickBooks API call is scoped to that company: /v3/company/{realmId}/...

# OAuth endpoints (handled automatically by LawLink) GET /api/v1/quickbooks/authorize # returns the Intuit consent URL GET /api/v1/quickbooks/callback # captures code + realmId, stores tokens GET /api/v1/quickbooks/status # { "connected": true|false } GET /api/v1/quickbooks/company-info # verifies the connection is live DELETE /api/v1/quickbooks/disconnect # revokes the token

Token lifecycle

Access tokens live 1 hour and refresh tokens ~100 days. LawLink refreshes access tokens automatically. QuickBooks rotates the refresh token on every refresh, so the new one is persisted each time โ€” nothing for you to manage.

Verify the connection

Confirm LawLink can reach the linked company.

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/quickbooks/company-info" \ -H "Authorization: Bearer ACCESS_TOKEN"
๐Ÿ‘ฅ

Customers

A QuickBooks Customer is exposed through the universal contacts endpoint. Field mapping:

Universal fieldQuickBooks field
first_nameGivenName
last_nameFamilyName
companyCompanyName
emailPrimaryEmailAddr.Address
phonePrimaryPhone.FreeFormNumber
derived from name/company/emailDisplayName (required & unique in QBO)

List Customers

Optionally filter by name with query.

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/contacts?platform_id=quickbooks&limit=50" \ -H "Authorization: Bearer ACCESS_TOKEN"

Get a Single Customer

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/contacts/CUSTOMER_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"

Create a Customer

Provide at least one of first/last name, company, or email so a DisplayName can be derived.

curl.exe -X POST \ "https://app.lawlink.ai/api/v1/universal/contacts?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "first_name": "Jane", "last_name": "Doe", "email": "jane@example.com", "phone": "+1-555-0100" }'

Update a Customer

LawLink fetches the current SyncToken and performs a QBO sparse update automatically.

curl.exe -X PUT \ "https://app.lawlink.ai/api/v1/universal/contacts/CUSTOMER_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "email": "new@example.com" }'
๐Ÿงพ

Invoices

Bill a customer. Provide either explicit line_items or a single convenience amount.

List Invoices

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/invoices?platform_id=quickbooks&limit=50" \ -H "Authorization: Bearer ACCESS_TOKEN"

Get a Single Invoice

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/invoices/INVOICE_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"

Create an Invoice โ€” quick (single amount)

curl.exe -X POST \ "https://app.lawlink.ai/api/v1/universal/invoices?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer_id": "58", "amount": 750.00, "description": "Legal consultation", "due_date": "2026-08-01" }'

Create an Invoice โ€” itemized

Each line takes an amount, plus optional item_id, quantity, and description.

curl.exe -X POST \ "https://app.lawlink.ai/api/v1/universal/invoices?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer_id": "58", "line_items": [ { "amount": 500.00, "item_id": "1", "quantity": 5, "description": "Attorney hours" }, { "amount": 120.00, "description": "Filing fees" } ], "due_date": "2026-08-01" }'
๐Ÿ’ณ

Payments

Record money received from a customer. Pass an invoice_id to apply the payment against a specific invoice.

List Payments

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/payments?platform_id=quickbooks&limit=50" \ -H "Authorization: Bearer ACCESS_TOKEN"

Get a Single Payment

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/payments/PAYMENT_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"

Record a Payment (applied to an invoice)

curl.exe -X POST \ "https://app.lawlink.ai/api/v1/universal/payments?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer_id": "58", "amount": 750.00, "invoice_id": "129" }'
๐Ÿ“ฆ

Items (read-only)

Items are the products/services referenced by invoice and estimate lines (via item_id). Use these endpoints to look up the IDs to put on a line.

List Items

Optionally filter by name with query.

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/items?platform_id=quickbooks&limit=50" \ -H "Authorization: Bearer ACCESS_TOKEN"

Get a Single Item

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/items/ITEM_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"
๐Ÿ“„

Estimates

Estimates (quotes) share the exact same line structure as invoices โ€” provide line_items or a single amount.

List Estimates

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/estimates?platform_id=quickbooks&limit=50" \ -H "Authorization: Bearer ACCESS_TOKEN"

Get a Single Estimate

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/estimates/ESTIMATE_ID?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"

Create an Estimate

curl.exe -X POST \ "https://app.lawlink.ai/api/v1/universal/estimates?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "customer_id": "58", "line_items": [ { "amount": 2000.00, "description": "Retainer estimate" } ] }'
๐Ÿ“Š

Reports (read-only)

Reports return QuickBooks' raw report JSON (rows/columns as QBO structures them) โ€” they are passed through unchanged rather than normalized.

Profit & Loss

Optional start_date / end_date (YYYY-MM-DD).

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/reports/profit-and-loss?platform_id=quickbooks&start_date=2026-01-01&end_date=2026-06-30" \ -H "Authorization: Bearer ACCESS_TOKEN"

Customer Balance

Outstanding accounts-receivable balance per customer.

curl.exe -X GET \ "https://app.lawlink.ai/api/v1/universal/reports/customer-balance?platform_id=quickbooks" \ -H "Authorization: Bearer ACCESS_TOKEN"

๐Ÿค– Via the MCP / AI Assistant: Every operation above is also available to the LawLink MCP server. An assistant can, for example, "create a QuickBooks invoice for Jane Doe for $750" or "show this month's profit and loss" โ€” the same Universal endpoints back both doors.