Systems
QuickBooks integration with your online store: orders, customers and stock
QuickBooks Online allows 500 API requests a minute per company, returns at most 1,000 records per query and keeps one stock number per item. We build the integration around those limits and your chart of accounts, then host and run it.
What QuickBooks is and who runs it
QuickBooks is Intuit's accounting software for small businesses. QuickBooks Online runs in the cloud in four plans: Simple Start, Essentials, Plus and Advanced, the last with up to 25 users. QuickBooks Desktop is the installed Windows product. For an integration they are two different systems with two different APIs.
QuickBooks is an accounting system first. It holds customers, items, sales receipts, invoices, payments and the general ledger. On Plus and Advanced it also tracks inventory, as one quantity per item. A store that sells from one stock location and books its sales in QuickBooks fits this well. A store with several warehouses, variants and B2B price lists needs the integration to carry what QuickBooks does not hold.
What connects to QuickBooks
| Flow | Direction | QuickBooks Online entity |
|---|---|---|
| Paid orders | store to QuickBooks | SalesReceipt |
| Orders on terms (B2B) | store to QuickBooks | Invoice, then Payment |
| Customers | store to QuickBooks | Customer |
| Refunds | store to QuickBooks | RefundReceipt, CreditMemo |
| Items and prices | QuickBooks to store | Item with Sku, UnitPrice |
| Stock | QuickBooks to store | QtyOnHand on Item (Plus and Advanced) |
| Payouts | payment provider to QuickBooks | Deposit |
A paid store order becomes a sales receipt: sale and payment in one document. An order on payment terms becomes an invoice, and the payment follows when it arrives. A sales receipt or invoice with inventory items lowers QtyOnHand in QuickBooks by itself, so the integration never writes the same sale to stock a second time. The order flow in general is on order integration.
POST /v3/company/9130351234567890/salesreceipt?minorversion=75 HTTP/1.1
Host: quickbooks.api.intuit.com
Authorization: bearer eyJlbmMiOi...
Content-Type: application/json
{
"DocNumber": "SHOP-100482",
"CustomerRef": { "value": "58" },
"Line": [{
"Amount": 204.96, "DetailType": "SalesItemLineDetail",
"SalesItemLineDetail": { "ItemRef": { "value": "19" }, "Qty": 12, "UnitPrice": 17.08 }
}]
}
How QuickBooks Online exposes data
REST API with OAuth 2.0
The Accounting API is REST with JSON, addressed per company by its realm ID. Authentication is OAuth 2.0: an administrator of the QuickBooks company connects the app once. The access token is valid for 3,600 seconds. The refresh token changes every 24 hours, expires when it has not been used for 100 days, and has a hard limit of five years. An integration that refreshes on schedule keeps its connection; one that stops for more than 100 days needs the administrator again.
Intuit versions the API with a minorversion parameter. Minor versions below 75 were discontinued from August 1, 2025: a lower value is ignored and the response comes back as version 75.
Limits
| Limit | Value |
|---|---|
| Requests per company (realm ID) | 500 per minute |
| Requests per company and app | 10 per second |
| Payloads per batch request | 30 recommended maximum |
| Batch requests per company and app | 40 per minute |
| Records per query response | 1,000 |
| Request timeout | 120 seconds |
| Lines per transaction | 10,000 |
Over a limit the API returns HTTP 429, and Intuit's limits page tells the client to wait 60 seconds before it retries. Queries use a SQL-like syntax with STARTPOSITION and MAXRESULTS, and have no OR, no JOIN and no GROUP BY. Reading 15,000 items is 15 queries of 1,000.
The arithmetic for a busy day: 3,000 orders, each one customer lookup, one item lookup for all lines and one sales receipt, is 9,000 requests. If 800 of them arrive in the peak hour, that is 2,400 requests in 60 minutes, 40 a minute, against 500 allowed. The limit binds on backfills: loading 60,000 historical receipts one by one takes at least 120 minutes at 500 a minute. Intuit throttles batch requests separately, at 40 a minute per company and app; in batches of 30 that is 1,200 receipts a minute, and the same load takes 50 minutes. The pattern is on API throttling and backoff.
Change data capture and webhooks
QuickBooks sends webhooks when entities change, and it has a change data capture operation that returns everything changed in a period, up to 30 days back and 1,000 objects per response. We use the webhook to react fast and run change data capture on a schedule next to it, so an event that never arrived is still picked up.
Every update carries the object's SyncToken. QuickBooks increments it on each change and rejects an update with an older token. When a bookkeeper edits a customer while the integration updates it, the integration reads the record again and reapplies its change instead of overwriting theirs.
Where a QuickBooks integration gets stuck
Names that must be unique. A customer's DisplayName (up to 500 characters) must be unique across all customers, vendors and employees. A B2B buyer who is also a supplier already exists as a vendor, and creating the customer fails. Item Name (up to 100 characters) is unique too and cannot contain a colon, tab or newline, because QuickBooks uses the colon for its category hierarchy. The integration matches customers on email first, gives a colliding name a suffix by rule, and logs every one. See duplicate customers and orders.
No variants and no bundles from the API. QuickBooks has no variant concept: a T-shirt in 4 sizes and 3 colors is 12 inventory items with 12 SKUs. Group items (bundles) exist but cannot be created through the API. The integration maps each store variant to one item on Sku, and a bundle sold in the store is booked as its component items. See variant mapping.
One stock number. QtyOnHand is one decimal per item, with no location and no reserved quantity: the number drops when a sale is booked, and an estimate holds nothing back. If the store needs available stock per warehouse, that number comes from the warehouse system, which is the subject of which stock counts.
Order numbers and totals. DocNumber holds 21 characters; a store order number with a long prefix is shortened by a fixed rule and logged, never cut silently. When the integration sends no number and custom transaction numbers are switched off, QuickBooks counts on from its last number. After each receipt the integration compares the total QuickBooks stored with the total the store charged and puts any difference above one cent on the exception list. See money, tax and rounding.
Platforms we integrate with QuickBooks
The Shopify combination is on Shopify QuickBooks integration. The store side is described per platform on Shopify, WooCommerce and BigCommerce. EDI with retailers is on QuickBooks EDI integration, and the other small-business ledger we integrate is Xero.
We build the integration to your QuickBooks company: your items, accounts, tax setup and naming. Then we host, run and monitor it for a monthly fee. Before go-live it runs as a dry run that writes nothing to QuickBooks, so you see every receipt and customer it would create. All integrations come with a dashboard, logs and a per-run diff. Tell us which QuickBooks you run.
Frequently asked questions
Does the integration work with QuickBooks Desktop as well as QuickBooks Online?
Yes, through a different route. QuickBooks Online has a REST API in the cloud. QuickBooks Desktop has no cloud API: the QuickBooks Web Connector, a Windows program on the same machine or network as QuickBooks, calls our web service on a schedule and exchanges qbXML with it. That means the machine has to be on for orders to go in, and nothing reaches Desktop between two Web Connector runs.
Which QuickBooks Online plan do I need?
Stock tracking needs Plus or Advanced; Intuit lists "Track and manage inventory" from Plus upward. On Simple Start and Essentials the integration can post sales receipts or invoices with service or non-inventory items, but there is no stock to send to the store.
Can QuickBooks Online hold stock per warehouse?
Not through the item record. An inventory item has one QtyOnHand. If your stock is kept per location, the location breakdown has to come from the warehouse system or the store, and QuickBooks gets the total. See multi-location inventory.
What happens when we hit the QuickBooks rate limit?
QuickBooks answers HTTP 429 and Intuit asks the client to wait 60 seconds before retrying. Our integrations keep their own queue, so an order waits in it and goes in after the pause. A store with a few thousand orders a day stays far below 500 requests a minute; the limit matters for bulk loads and backfills, which we run in batches.
How often does the store connection need to be re-authorized?
Normally never while the integration runs. The access token lasts one hour and the integration refreshes it. A refresh token expires after 100 days without use and has a hard limit of five years, after which an administrator connects the app once more. We alert you well before that date.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase