Skip to content

QuickBooks Online

Fetch bank transactions from QuickBooks Online, including deposits, purchases, and transfers.

Create a QuickBooks app at developer.intuit.com and complete the OAuth 2.0 flow. Save your credentials to a JSON file:

{
"client_id": "AB...",
"client_secret": "...",
"access_token": "eyJ...",
"refresh_token": "AB...",
"realm_id": "123456789"
}

VisiGrid automatically refreshes expired access tokens and writes the updated credentials back to the file.

Terminal window
vgrid fetch qbo --credentials qbo-creds.json --account "Business Checking" \
--from 2026-01-01 --to 2026-02-01 --out qbo.csv

Or pass the access token directly (no auto-refresh):

Terminal window
vgrid fetch qbo --access-token eyJ... --realm-id 123456789 \
--account-id 42 --from 2026-01-01 --to 2026-02-01 --out qbo.csv
Flag Description Default
--from Start date inclusive (YYYY-MM-DD) required
--to End date exclusive (YYYY-MM-DD) required
--credentials Path to OAuth2 JSON file
--access-token Direct access token (requires --realm-id)
--realm-id QBO company realm ID
--account Bank account name (resolved to ID)
--account-id Bank account ID directly
--include Entity types to fetch deposit,purchase,transfer
--out Output CSV path stdout
-q / --quiet Suppress progress messages off
--sandbox Use QBO sandbox API off
QBO entity PaymentType Canonical type
Deposit deposit
Purchase Cash withdrawal
Purchase Check check
Purchase any other expense
Transfer transfer (signed by direction)

Purchase amounts are negated (outflow). Transfer sign depends on whether your account is the source or destination.

  • effective_dateTxnDate from QuickBooks
  • posted_date — same as effective_date (QBO does not distinguish)

Account resolution. --account performs a query for the bank account name. Apostrophes in account names are escaped automatically. If the name is ambiguous, VisiGrid shows all matching accounts with their fully qualified names.

Client-side account filtering. QBO’s query API does not support filtering deposits and purchases by bank account, so VisiGrid fetches all transactions in the date range and filters client-side by account ID.

--include filter. Comma-separated list of entity types: deposit, purchase, transfer. Defaults to all three.

source_id format. Prefixed with the entity type: deposit:101, purchase:201, transfer:301.

Pagination. Offset-based (STARTPOSITION / MAXRESULTS 1000) ordered by TxnDate ASC, Id ASC.

Sort order. effective_date ascending, then source_id ascending.