QuickBooks Online actions
Reference for the QuickBooks Online actions: the connection type, each action and what it does, its inputs and outputs, and the live catalog call.
The QuickBooks block reads and writes records in a QuickBooks Online company. For the plain-language overview, see QuickBooks Online.
When to use it
Use a QuickBooks step to create or look up customers, invoices, payments, vendor bills and journal entries, to run a QuickBooks report, or to move documents and PDFs in and out of QuickBooks. Every action in the Studio Action list has an executor, so a step built in the editor and a step written in a workflow definition run the same code.
Connection
| Item | Value |
|---|---|
| Block type | quickbooks |
| Connection | OAuth sign-in from Integrations (provider id quickbooks) |
| Account pin | config.connection, the connection row id. Without it the step uses the company's default QuickBooks connection |
| Company | config.realmId, the QuickBooks company (realm) id. Required on every action; digits only on the newer record actions |
If config.connection names a connection that no longer resolves, the run stops at that step instead of falling back to the default account.
Step settings
These fields are shared across the original actions. The Studio form shows each one only for the actions that read it.
| Field | Type | Used by | Meaning |
|---|---|---|---|
realmId | string | All | QuickBooks company (realm) id |
customerId | string | getCustomer, updateCustomer, createInvoice, listInvoices, upsertInvoiceByDocNumber, createPayment, listPayments | Customer id |
invoiceId | string | getInvoice, sendInvoice, voidInvoice, updateInvoice, upsertInvoiceByDocNumber | Invoice id. On the upsert, the id stored from an earlier sync |
lines | JSON array | createInvoice, updateInvoice, upsertInvoiceByDocNumber, createBill, updateBill | Line items. Each line needs a numeric amount; invoice lines also take description, quantity, unitPrice, itemId, taxCodeId; bill lines take description, accountId, customerId, billableStatus |
journalLines | JSON array | createJournalEntry, updateJournalEntry, upsertJournalEntryByDocNumber | Debit and credit lines (see below). lines is read when journalLines is absent |
docNumber | string | Find, upsert and journal-entry actions | QuickBooks reference number, at most 21 characters on a journal entry |
txnDate | string | Journal-entry writes | Transaction date, YYYY-MM-DD |
adjustment | boolean | createJournalEntry, updateJournalEntry | Mark the entry as adjusting |
privateNote | string | Invoice, payment, bill and journal-entry writes | Internal memo stored on the record |
txnTaxDetail | JSON | Invoice writes | { totalTax, txnTaxCodeId } for tax calculated outside QuickBooks |
shipAddr, billAddr | JSON | Invoice writes | Address objects |
allowOnlineCreditCardPayment, allowOnlineACHPayment | boolean | createInvoice, updateInvoice, upsertInvoiceByDocNumber | QuickBooks AllowOnlineCreditCardPayment and AllowOnlineACHPayment. Sent only when set; left blank, QuickBooks applies the company default |
emailStatus | string | createInvoice, updateInvoice, upsertInvoiceByDocNumber | NotSet, NeedToSend or EmailSent. createInvoice sends NotSet when blank; the update and upsert send nothing |
email | string | Customer and vendor writes, createInvoice, updateInvoice, upsertInvoiceByDocNumber, sendInvoice | Primary email on a customer or vendor; BillEmail on an invoice write; the recipient on sendInvoice |
invoiceDate, dueDate | string | Invoice and bill writes | YYYY-MM-DD |
amount | number | createPayment | Payment amount |
invoiceIds | JSON array | createPayment | One invoice id the payment applies to |
vendorId | string | createBill, listBills, getVendor | Vendor id |
billId | string | getBill, updateBill, deleteBill | Bill id |
journalEntryId | string | getJournalEntry, updateJournalEntry, deleteJournalEntry, upsertJournalEntryByDocNumber | Journal entry id |
txnDateAfter, txnDateBefore | string | List actions | Date filters |
limit, offset | number | List actions | Page size (default 100) and offset (default 0) |
reportType | string | runReport | Report name (list below) |
query | string | query | A QuickBooks query statement |
The newer record actions (for example createEstimate or getPurchaseOrder) take Intuit's own field names:
| Field | Type | Meaning |
|---|---|---|
recordId | string | Record id for get, PDF and send actions (a currency code for company currencies) |
data | JSON object | The QuickBooks request body. Updates and deletes need the current Id and SyncToken. A full update replaces fields you leave out; sparse: true is accepted only where Intuit supports a sparse update |
limit, offset | number | List page size, 1 to 1000 (default 100), and zero-based offset |
Actions
The action id is quickbooks.<action>. All of these appear in the Studio Action list.
| Record | Actions |
|---|---|
| Account | createAccount, getAccount, getAccountList, updateAccount |
| Attachable | createAttachable, deleteAttachable, getAttachable, listAttachables, updateAttachable |
| Attachment file | downloadAttachment, uploadAttachment |
| Bill | createBill, deleteBill, getBill, listBills, updateBill |
| Bill payment | createBillPayment, deleteBillPayment, getBillPayment, listBillPayments, updateBillPayment, voidBillPayment |
| Budget | createBudget, deleteBudget, getBudget, listBudgets, updateBudget |
| Change order | createChangeOrder, deleteChangeOrder, getChangeOrder, updateChangeOrder |
| Class | createClass, getClass, listClasses, updateClass |
| Company currency | createCompanyCurrency, getCompanyCurrency, listCompanyCurrencies, updateCompanyCurrency |
| Company info | getCompanyInfo, listCompanyInfo, updateCompanyInfo |
| Credit card payment | createCreditCardPayment, deleteCreditCardPayment, getCreditCardPayment, listCreditCardPayments, updateCreditCardPayment |
| Credit memo | createCreditMemo, deleteCreditMemo, getCreditMemo, getCreditMemoPdf, listCreditMemos, sendCreditMemo, updateCreditMemo |
| Customer | createCustomer, findCustomerByEmail, getCustomer, listCustomers, updateCustomer |
| Customer type | getCustomerType, listCustomerTypes |
| Department | createDepartment, getDepartment, listDepartments, updateDepartment |
| Deposit | createDeposit, deleteDeposit, getDeposit, listDeposits, updateDeposit |
| Employee | createEmployee, getEmployee, listEmployees, updateEmployee |
| Entitlements | getEntitlements |
| Estimate | createEstimate, deleteEstimate, getEstimate, getEstimatePdf, listEstimates, sendEstimate, updateEstimate |
| Exchange rate | getExchangeRate, listExchangeRates, updateExchangeRate |
| Inventory adjustment | createInventoryAdjustment, deleteInventoryAdjustment, getInventoryAdjustment, updateInventoryAdjustment |
| Invoice | createInvoice, deleteInvoice, findInvoiceByDocNumber, getInvoice, getInvoicePdf, listInvoices, sendInvoice, updateInvoice, upsertInvoiceByDocNumber, voidInvoice |
| Item | createItem, getItem, listItems, updateItem |
| Journal entry | createJournalEntry, deleteJournalEntry, findJournalEntryByDocNumber, getJournalEntry, listJournalEntries, updateJournalEntry, upsertJournalEntryByDocNumber |
| Payment | createPayment, deletePayment, getPayment, getPaymentPdf, listPayments, sendPayment, updatePayment, voidPayment |
| Payment method | createPaymentMethod, getPaymentMethod, listPaymentMethods, updatePaymentMethod |
| Preferences | getPreferences, listPreferences, updatePreferences |
| Purchase | createPurchase, deletePurchase, getPurchase, listPurchases, updatePurchase |
| Purchase order | createPurchaseOrder, deletePurchaseOrder, getPurchaseOrder, getPurchaseOrderPdf, listPurchaseOrders, sendPurchaseOrder, updatePurchaseOrder |
| Recurring transaction | createRecurringTransaction, deleteRecurringTransaction, getRecurringTransaction, listRecurringTransactions |
| Refund receipt | createRefundReceipt, deleteRefundReceipt, getRefundReceipt, getRefundReceiptPdf, listRefundReceipts, sendRefundReceipt, updateRefundReceipt |
| Reimburse charge | getReimburseCharge, listReimburseCharges |
| Report | runReport |
| Sales receipt | createSalesReceipt, deleteSalesReceipt, getSalesReceipt, getSalesReceiptPdf, listSalesReceipts, sendSalesReceipt, updateSalesReceipt, voidSalesReceipt |
| Tax agency | createTaxAgency, getTaxAgency, listTaxAgencies |
| Tax classification | getTaxClassification, getTaxClassificationChildren, listTaxClassifications |
| Tax code, rate, payment, service | getTaxCode, listTaxCodes, getTaxRate, listTaxRates, getTaxPayment, listTaxPayments, createTaxService |
| Term | createTerm, getTerm, listTerms, updateTerm |
| Time activity | createTimeActivity, deleteTimeActivity, getTimeActivity, listTimeActivities, updateTimeActivity |
| Transfer | createTransfer, deleteTransfer, getTransfer, listTransfers, updateTransfer |
| Vendor | createVendor, getVendor, listVendors, updateVendor |
| Vendor credit | createVendorCredit, deleteVendorCredit, getVendorCredit, listVendorCredits, updateVendorCredit |
| Bulk and sync | batch, changeDataCapture, query |
Behaviour worth knowing
createBillalways creates a new bill. It has no lookup by bill number, so running it twice creates two bills. Only invoices and journal entries have an upsert.upsertInvoiceByDocNumberandupsertJournalEntryByDocNumberfirst try the stored id (invoiceIdorjournalEntryId), then fall back to a lookup bydocNumber. A match is updated, carrying the newdocNumberonto the existing record; no match creates one. They return a normalized envelope (operation,invoiceIdor the journal id,syncToken,docNumber,realmIdand the record), not the raw QuickBooks response.findInvoiceByDocNumber,findJournalEntryByDocNumberreturn{ found, id, syncToken, entity }, so a condition step can testfound.- Journal-entry lines take
amount,postingType(debitorcredit), and eitheraccountIdoraccountNumber(resolved against the chart of accounts with one extra request). Optional:description,entityType(Customer,Vendor,Employee) withentityId,classId,departmentId. The step fails before calling QuickBooks when there are fewer than two lines, only debits or only credits, an amount that is not a number, or debits that do not equal credits. createPaymentapplies the payment to at most one invoice throughinvoiceIds. To split one payment across invoices, usebatchwith explicitLineamounts.- Invoices billed and collected elsewhere (for example a Stripe invoice mirrored into QuickBooks) should set
allowOnlineCreditCardPaymentandallowOnlineACHPaymenttofalse, so the QuickBooks copy does not offer a second way to pay. Each of these invoice fields, andemailStatusandemail, reaches QuickBooks only when the step sets it, so an existing step keeps sending the request it sent before. AnemailStatusoutside the three values, a boolean field set to anything buttrueorfalse, or anemailthat is not text stops the step before QuickBooks is called. Field definitions: Intuit Invoice entity. - A rejected write names its reason. When QuickBooks refuses a request, the step error carries Intuit's fault type,
Message,Detailand code, for exampleNango proxy request failed (400): ValidationFault: A business validation error has occurred while processing your request: <detail> (code 6000). The text is capped at 300 characters and scrubbed of tokens and keys. txnTaxDetailcarries tax calculated elsewhere (for example by Avalara). SendtotalTaxandtxnTaxCodeIdtogether, and ataxCodeIdon every line.- PDF actions return
contentBase64,contentType(application/pdf) andsize.uploadAttachmenttakesfileName,contentTypeandcontentBase64(up to 20 MB) plus optionalattachmentMetadata. batchtakes 1 to 30batchItems, each with a uniquebId. Check every item in the response forFault.changeDataCapturetakesentities(up to 30 names) and achangedSincetimestamp within the last 30 days.runReportaccepts thesereportTypevalues:AccountList,AgedPayableDetail,AgedPayables,AgedReceivableDetail,AgedReceivables,BalanceSheet,CashFlow,CustomerBalance,CustomerBalanceDetail,CustomerIncome,GeneralLedger,InventoryValuationDetail,InventoryValuationSummary,JournalReport,ProfitAndLoss,ProfitAndLossDetail,ClassSales,CustomerSales,DepartmentSales,ItemSales,TaxSummary,TransactionList,TransactionListByVendor,TransactionListByCustomer,TransactionListWithSplits,TrialBalanceFR,TrialBalance,VendorBalance,VendorBalanceDetail,VendorExpenses. The output keeps the report'sHeader,Columnsand nestedRows.
Output
Most actions return the QuickBooks response unchanged, keyed by record name, so a later step reads {{steps.<id>.Invoice.Id}}, {{steps.<id>.Bill.Id}} or {{steps.<id>.JournalEntry.Id}}. The find and upsert actions return the normalized shapes described above, so read {{steps.<id>.found}} or {{steps.<id>.invoiceId}}. Curated input and output examples for each action are in GET /api/v1/blocks/quickbooks/actions/<action>/examples.
Example
A step that posts a balanced month-end accrual. It reads the amount from an earlier step and pins a specific QuickBooks connection.
{
"id": "post_accrual",
"type": "action",
"name": "Post accrual journal entry",
"action": "quickbooks.createJournalEntry",
"config": {
"operation": "createJournalEntry",
"connection": "<quickbooks-connection-id>",
"realmId": "9341454792746027",
"docNumber": "ACCR-2026-10",
"txnDate": "2026-10-31",
"privateNote": "October accrued expenses",
"journalLines": [
{ "accountNumber": "6100", "postingType": "debit", "amount": "{{steps.estimate.total}}", "description": "Accrued expenses" },
{ "accountNumber": "2100", "postingType": "credit", "amount": "{{steps.estimate.total}}", "description": "Accrued liabilities" }
]
}
}A later step reads the new entry's id as {{steps.post_accrual.JournalEntry.Id}}.
Live catalog
GET /api/v1/blocks/quickbooks returns the block's fields, the action list and the parameter schema of each record action. See Block and action discovery.
Errors and limits
realmId is required for QuickBooks API calls: setrealmIdon the step.<field> must be a QuickBooks identifier: ids accept letters, digits,_and-only.data.Id and data.SyncToken must be valid QuickBooks identifiers: read the record first and pass its currentSyncToken.journal entry does not balance: the debit and credit totals differ; the message shows both totals.- QuickBooks errors are returned with Intuit's fault detail. Availability of some records (budgets, inventory, multicurrency) depends on the connected company's subscription and settings.
Loopfour