Skip to content
SyncMyShop

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

A store order mapped to a QuickBooks Online sales receipt The store order number goes to DocNumber, which holds 21 characters. The company name becomes the customer's DisplayName, which must be unique across customers, vendors and employees, so a vendor with the same name blocks it. The SKU is looked up to an item ID. A variant name with a colon cannot be an item name, because QuickBooks uses the colon for its item hierarchy. Store order QuickBooks Online: SalesReceipt order.name SHOP-100482 billing.company Harbor Supply Co. line_items[0].sku KB-2210 line_items[0].name Valve: brass, 1/2 in shipping.address1 1200 Harbor Blvd Suite 4 DocNumber SHOP-100482 max 21 characters CustomerRef Harbor Supply Co. (C) a vendor already has the name Line[0].ItemRef 19 Item looked up on Sku Item.Name Valve - brass, 1/2 in colon not allowed ShipAddr.Line1 1200 Harbor Blvd Suite 4 unique name query, then id colon replaced
Five fields of one store order. In red the two places where QuickBooks naming rules reject what the store sends.

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

Suppliers, products, orders per day, a rough estimate is fine.

Or email directly: carsten@syncmyshop.com