We can't find the internet
Attempting to reconnect
Something went wrong!
Hang in there while we get back on track
We’ve worked with QuickBooks Desktop for 16 years, from Pro and Premier to Enterprise. Tell us what your app needs and we’ll build the integration on QuBe Sync in a free account, then send you a walkthrough-video from the expert who built it, with what to do next.
You tell us what the integration should do. We build it against our JSON API, test it against QuickBooks Desktop’s awkward moments, and show you around it.
Say where you’re starting: a QuickBooks Desktop integration, a QuickBooks Online one, or nothing yet. If you have one, your coding agent can describe it for you.
The workflows for everything your app sends and reads, a simulated QuickBooks to test them against, and the setup link your customers will use.
An email with a video of one of us explaining your integration: what we built, how we tested it, and what to do next.
You can, and we have. A coding agent might even get a request through the Web Connector in an afternoon. The hard part (beyond SOAP & qbXML) is everything after; QuickBooks Desktop runs on your customer’s PC, on its own schedule, and you discover its numerous edge cases / failures one at a time on live customer accounts.
16 years of QuickBooks Desktop integration work
Since 2010, we’ve learned to prevent what we can, fix what we can, and tell the right person about the rest. Your QuBe Sync integration does all of it.
Where a quick integration breaks (part 1 / 347)
Your code retries, and the payment is created twice.
Mutations are pre-fingerprinted and automatically reconciled before sending again. Nothing is created twice.
Requests time out, and your app gives up or keeps hammering.
It stays queued and is retried; your customer gets a message they can act on.
Every sync fails until someone notices, and nobody can say why.
Retried for as long as it takes, and your customer is asked to close all dialogs.
QuickBooks refuses with a cryptic `list object "000854-6124299"` error, and the record never syncs.
The run pauses, runs diagnostic queries, gives your app options, and carries on with the answer.
Your agent can still help: point it at our MCP server and docs, and it writes against a JSON API that already handles these.
Tell us about what you've already built and what you need so we can take the load off your plate.
Everything we build lives in your QuBe Sync account, ready to run against a test QuickBooks. You change it, extend it, or call it from your app like anything you built yourself.
Workflows we built for you
Use a robust JSON API to talk to QuickBooks Desktop, and receive your answers via webhook. No SOAP or qbXML for you, a guided setup for your customers, and a clear message for whoever can fix things when QuickBooks has an issue.
Your app sends
POST /api/v2/connections/:id/customers
{ "name": "Northwind Builders", "email": "ap@northwind.example", "phone": "512-555-0100" }
QuBe Sync calls your webhook
POST https://app.example.com/webhooks/qube
{ "state": "response_received", "response_json": { "status": "success", "data": { "list_id": "80000024-1790470623", "full_name": "Northwind Builders", ... } } }
The Web Connector checks in, but a dialog open in QuickBooks won’t let anything through.
Nothing is applied.
{ "state": "retryable", "error": { "error_type": "quickbooks_connection_error", "user_message": "QuickBooks can't sync if...", ... } }
The request keeps its place in the queue. There’s nothing to resend.
QuickBooks can't sync if any modal dialog is open. Please close all dialogs and try again.
From error.user_message, written for them. Once the dialog is closed, the request goes through on the next run.
Handling failures and edge cases is the name of the game. Use a simulated QuickBooks connection to make sure you're gracefully handling errors before your customers find them for you.
Run Web Connector now Queue test request
We walk them through the Web Connector setup one step at a time, preventing all the usual mistakes, and send them back to you with QuickBooks ready to go.
Add a Connect QuickBooks button
my-app.com/settings
Your customer clicks Connect QuickBooks Desktop, and you send them to their onboarding link.
qubesync.com/onboarding/t_8f2c1d…
It prevents the usual mistakes first, then shows a screenshot of every Web Connector prompt with the right answer marked.
on the computer that runs QuickBooks
QuickBooks open, single-user, as admin
the company file is open
my-app.com/webhooks/qube · connection.connected
QuBe Sync's signed webhook says they're connected after their first check-in, and your app shows QuickBooks ready to go.
Real jobs rarely fit in one QuickBooks request. Creating an invoice means making sure the customer exists, handling a vendor that already has that name, making sure every item exists, and only then adding it. If the connection drops halfway, someone has to work out what was written and what wasn’t. We do all of that, so nobody ends up double-invoicing their customers.
Start from a tested templateSee every path. Each workflow is a chart you can read, test-run and change, including the retry when someone takes a name mid-run.
Decide what only you can. When a name is taken, the run asks your app and carries on with the answer.
Point Claude Code, Cursor or any MCP client at qubesync.com/mcp. It explores the API and writes the integration with you, without ever holding a secret, and checks its own work with a sandbox-only CLI session.
Set up the MCP serverclaude mcp add --transport http qubesync https://qubesync.com/mcp
A scripted replay: the tool results are real answers from qubesync.com/mcp; the pacing is not.
Claude is writing your integration…
QuickBooks Desktop runs on your customer’s PC, on its own schedule, and plenty can go wrong between your app and theirs. In 16 years of QuickBooks Desktop work we’ve learned to prevent what we can, fix what we can, and tell the right person about the rest.
Read how errors are handled| What goes wrong | Signal | What QuBe Sync does | Who hears about it | Mode |
|---|---|---|---|---|
| A field QuickBooks would reject | schema check | Rejected when you queue it, not minutes later on your customer’s PC | Who hears about it: You, in the API response | prevent |
| Smart quotes, bullets, dashes and many more | invalid text | Replaced with encoded equivalents QuickBooks accepts. Decoded on the way back out. | Who hears about it: Nobody needs to | prevent |
| Duplicate transaction requests | ExternalGUID | Workflows fingerprint the transaction before creating it, so it can automatically reconcile before sending again. | Who hears about it: Nobody needs to | prevent |
| QuickBooks is closed | quickbooks_connection_error | Stays queued and retried until QuickBooks is opened; the Web Connector is backed off so it doesn’t hammer a closed QuickBooks | Who hears about it: Your customer, once, in words they can act on | resolve |
| A dialog is open in QuickBooks | quickbooks_connection_error | Retried for as long as it takes. Your customer still receives instructions so they can resolve it faster. | Who hears about it: Your customer: “please close all dialogs and try again” | resolve |
| The session ends early | session closed | A request QuickBooks never saw goes back in the queue | Who hears about it: Nobody needs to | resolve |
| The answer is lost mid-request | timed_out | The run checks QuickBooks before sending again. Nothing is created twice | Who hears about it: Nobody needs to | resolve |
| Someone changed the record mid-update | fields overlap | Your update goes through if their change doesn’t touch your fields; if it does, the run asks | Who hears about it: Your app, only when they overlap | escalate |
| QB business rule violations | cryptic QB error | The run pauses, runs diagnostic queries, gives your app resolution options, and carries on with the answer | Who hears about it: Your app, with the context to decide | escalate |
| Your webhook endpoint is down | no 2xx | Delivery retried with backoff, up to 12 attempts | Who hears about it: Your team, by email if it can’t be delivered | resolve |
| Your customer stops connecting | no check-ins | We send you a webhook with `connection.stalled`, and `connection.resumed` when it's back. | Who hears about it: Your app | escalate |
And many more. Each new version of QuickBooks, qbXML and the Web Connector brings new challenges, and they are handled for you too.
QuickBooks is notorious for duplicate name issues, and finding them is near impossible with its native query filters. On realtime connections, cached fuzzy search finds near matches in milliseconds, and lets your customers solve problems before they start.
ACME, Inc.
finds
Acme Inc
Northwind Builders LLC
finds
Northwind Builders
Smith, John
finds
John Smith
Subway Store 1234
finds
Subway #1234
never
Subway #1235
Jonh Smith
finds
John Smith
One account. Each connection runs at the speed you pick, and you pay only for the ones your customers use.
$0
Build and test in your sandbox app, against your own copy of QuickBooks or a simulated one.
Pay per active connection, per month. Choose a speed for each one.
$25 per connection, per month
$50 per connection, per month
High volume or special requirements? Talk to us
Mix and match standard/realtime connections as needed.
A connection is active when its Web Connector has checked in during the past week. Sandbox and simulated connections are never billed.
The JSON API, the docs and the MCP server are open to every free account.
Built on 16 years of QuickBooks integration work. Questions first? Write to support@qubesync.com and a person will answer.