Books your OpenCart orders in your own QuickBooks Online company: customers, invoices or sales receipts with your items and tax codes, payments deposited to the account mapped to the payment method, and refund receipts or credit memos for refunds and product returns, with a retrying job queue and a log. US (automated sales tax) and non-US companies. You connect your own Intuit app (OAuth 2.0); keys and tokens are stored encrypted. OpenCart 4, events and cron only, no OCMOD.
Tested on 4.1.0.4Updated Nov 6, 2026Version 1.0.1Compatible with OpenCart 4.1.0.4 No core file edits
Built forOpenCart
Every order booked in QuickBooks Online1 of 6
What it does
Books your OpenCart orders in your own QuickBooks Online company: customers, invoices or sales receipts with your items and tax codes, payments deposited to the account mapped to the payment method, and refund receipts or credit memos for refunds and product returns, with a retrying job queue and a log. US (automated sales tax) and non-US companies. You connect your own Intuit app (OAuth 2.0); keys and tokens are stored encrypted. OpenCart 4, events and cron only, no OCMOD.
What it changes for your store
Your OpenCart orders in QuickBooks Online, without re-keying. QuickBooks Online is cloud accounting software used by many small businesses. This extension connects your shop to your own QuickBooks company so that every order ends up as a customer, an invoice (or a sales receipt) and a payment, and every refund as a refund receipt or a credit memo.
Know the limits. You need your own QuickBooks Online company and an Intuit developer app; Intuit decides which plans may use its API. One store and one company. A currency other than the home currency needs multi-currency in QuickBooks. Changes made in QuickBooks are not read back. Tested against a stand-in of the QuickBooks API built from Intuit's published documentation and SDK data classes, not against a live company. QuickBooks is a trademark of Intuit Inc. This extension is not made, endorsed or certified by Intuit.
Features
Connection
Connect your own Intuit developer app with the OAuth 2.0 authorization code flow and pick the company on Intuit's consent page; sandbox and production keys side by side
Keys and tokens stored encrypted, the rotating refresh token renewed for you, a clear message when the authorization needs the owner
Invoices, sales receipts and payments
A customer found by e-mail or created once; an invoice per order with your number prefix, or one sales receipt when the order is paid; product lines with options, shipping, fees and discounts, in the currency of the order
Your items, a deposit account per payment method and a QuickBooks tax code per OpenCart tax rate; due days; optional QuickBooks items created from product SKUs
US companies with automated sales tax get the tax of the order as the total tax; other countries get a tax code on every line
Refunds and returns
A refunded paid order creates a refund receipt paid back from the mapped account; an unpaid invoice gets a credit memo applied to it
A product return refunds the returned product and quantity the same way
Reliable
Every create call carries a requestid, so a retried job never books a document twice; an order whose lines do not add up is refused with the reason
Rate limits wait the time QuickBooks asks for; job queue with retries, a sync list with QuickBooks Ids, a Jobs page and a log with CSV export; events and cron only, no OCMOD, no core edits; tested on OpenCart 4.1.0.4
What you get
Download & installOne installer package (.ocmod.zip) for OpenCart 4.0.2 – 4.1.x. There is no OpenCart 3 edition. Download it from My licenses right after payment.
12 months of updates & supportNew versions and help for 12 months (24 or 36 months at checkout). After that the extension keeps working; renew anytime at 50%.
License for your storeOne production domain with all its subdomains; staging and local development hosts are free. How licensing works
30-day refundFull refund within 30 days of your first purchase, no reason needed. Refund policy
Tested buildsOpenCart 4.1.0.4. Tested on OpenCart 4.1.0.4.
Documentation & supportFull guide (Installation, Configuration, Usage, Developer notes) on this page. Tickets from your account, first reply within 1 business day.
Compatibility
QuickBooks Online Sync works with OpenCart 4.1.0.4.
We list the builds we install and test on. “Tested” means the test plan ran on that build; “Supported” means the build is inside the supported range.
Compatibility
Version
Range
Runs on
Status
OpenCart 4.1.0.x
4.1.0.0 – 4.1.0.4
PHP 8.1 – 8.3
Tested on 4.1.0.4
OpenCart 4.0.2.x
4.0.2.0 – 4.0.2.3
PHP 8.0 – 8.2
Supported
1.0.0
Nov 6, 2026
Latest
First release for OpenCart 4.1: connection to your own Intuit app (OAuth 2.0 authorization code flow, accounting scope, realm id, rotating refresh token under a database lock, encrypted keys), customers, invoices or sales receipts, payments deposited to the mapped account, refund receipts and credit memos for refunded orders and product returns, US and non-US tax handling, mapping page, optional QuickBooks items, requestid idempotency, rate limit handling, job queue, sync list, log with CSV export.
How do I install the extension?
Upload. Extensions > Installer: upload the .ocmod.zip. It is for OpenCart 4 (4.0.2 to 4.1.x).
Install and enable. Extensions > Extensions > Modules: install, open the settings and switch it on. Events register themselves; nothing is patched.
Enter the license key. Paste the key from My licenses. Subdomains, staging and local hosts are included; you have 14 days to do it.
OpenCart 4.1.0.4. Tested on OpenCart 4.1.0.4. The Compatibility tab lists every version range.
Do the extensions change core files?
No. They work through OpenCart events and standard extension types (modules, order totals, themes). No core file edits, no OCMOD patches, no theme template edits, so OpenCart updates and other extensions keep working.
What does the license cover?
One production store domain with every subdomain (www, shop., staging.), plus local development hosts such as localhost, *.local and *.test. A store on another domain needs its own license; a second-store license is 40% off. You have 14 days after installing to enter the key. 12 months of updates and support are included; after that the extension keeps working and renewals are 50% off. How licensing works
Can I get a refund?
Yes. Ask for a full refund within 30 days of your first purchase, no reason needed: open a ticket or write to [email protected] with your order number. The money goes back to the card or bank account you paid with within 5 business days of approval. Refund policy
How do I get help?
Open a ticket from your account, so your license details are attached. We answer Monday to Friday: bug reports within 1 business day, how-to questions within 2. Support policy. Not a customer yet? Ask a pre-sales question.
QuickBooks Online Sync books the orders of your OpenCart shop in your own QuickBooks Online company. A customer places an order, the order reaches the status you chose, and a few minutes later the customer, the invoice (or sales receipt) and the payment are in QuickBooks, with your items and tax codes. A refund or a product return becomes a refund receipt or a credit memo.
Sync list
What it does
Connection. You connect your own Intuit developer app (OAuth 2.0 authorization code flow, accounting scope) and the company you pick on the Intuit consent page. Sandbox and production keys are kept side by side. Keys and tokens are stored encrypted; the refresh token (it rotates on every use) is renewed by the extension and kept alive weekly.
Customers. Found by e-mail address or created once, updated only when the customer data changed. Guests are handled; a duplicate display name gets the e-mail address added.
Invoices or sales receipts. Your choice in the settings. One document per order with the number prefix you set (for example WEB-1042), product lines (with options), shipping, fees and discounts, on the items you map, with a tax code on every line. Due days, optional QuickBooks items created from product SKUs.
Payments. Recorded against the invoice and deposited to the account mapped to the payment method of the order. In sales receipt mode the receipt is booked when the order is paid.
Refunds. A paid order gets a refund receipt (money paid back from the mapped account); an unpaid invoice gets a credit memo applied to it. A product return does the same for the returned product and quantity.
US and non-US tax. US companies with automated sales tax get the tax amount of the OpenCart order as the total tax; companies in other countries get a tax code on every line and QuickBooks calculates the tax.
Mapping page. Default, shipping and discount items, an income account, a deposit account per payment method, a tax code per OpenCart tax rate. Items, accounts and tax codes are loaded from your QuickBooks; US tax codes are suggested.
Reliable. Every create call carries a requestid, so a retried job never books a document twice. Rate limits (429) wait the time QuickBooks asks for. A job queue with retries, a sync list with QuickBooks Ids, a Jobs page and a filtered log with CSV export. Secrets never reach the log.
Events and cron only, no OCMOD, no core edits. OpenCart 4, tested on 4.1.0.4.
Limits to know
You need your own QuickBooks Online company and an Intuit developer app (client ID and secret). Intuit decides which plans may use the API and its limits (500 requests a minute per company).
One OpenCart store and one QuickBooks company. Orders are booked in the currency of the order; a currency other than the home currency needs multi-currency switched on in QuickBooks.
Order level discounts (coupons, reward points) are booked as one discount line; the tax of the order comes from the order's tax totals. A product return is credited at the price the product was ordered at, without a share of an order level discount. Fees are booked without tax.
Orders whose lines do not add up to the order total (a custom extension changed the total) are refused with the reason and not sent.
Changes made in QuickBooks are not read back. A document that already has a payment, or is voided, is left alone by the shop.
The extension was tested against a stand-in of the QuickBooks Online API built from Intuit's published documentation and SDK data classes, not against a live QuickBooks company. Not affiliated with Intuit.
QuickBooks is a trademark of Intuit Inc. This extension is not made, endorsed or certified by Intuit.
Installation
Requires OpenCart 4.1 (tested on 4.1.0.4), PHP 7.4 or newer with the cURL and OpenSSL extensions, and a store reachable over HTTPS (Intuit sends the browser back to your shop).
In the admin go to Extensions > Installer, upload kv_quickbooks.ocmod.zip and click Install.
Extensions > Extensions, choose "Modules", find "QuickBooks Online Sync" and click Install (the green button).
Click Edit. Switch the extension on and, if you have one, enter your Kavio Labs license key. Without a key the extension works for 14 days.
The pages are under Sales > QuickBooks: QuickBooks sync, Connection, Mapping, Log, Jobs.
Cron. The install registers an hourly entry in the OpenCart cron, which needs the standard OpenCart cron line on your server (shown on the settings page). For a faster sync call the secret web address from the settings page every few minutes with your host cron.
Uninstall removes the stored keys, the sync map, the job queue and the log. What was booked in QuickBooks stays in QuickBooks.
What you need from Intuit
Sign in to developer.intuit.com and create an app with the scope com.intuit.quickbooks.accounting.
Under Keys and credentials add the Redirect URI shown on the Connection page, exactly as written, for the development keys (sandbox) and for the production keys.
Copy the client ID and client secret. Enter them on the Connection page (sandbox or production), save, then press "Connect to QuickBooks" and pick the company. Start with a sandbox company in sandbox mode.
Production keys are issued by Intuit after the app questionnaire; the app stays private to your own company.
When off, no new work is started. Jobs already queued still run.
Create the invoice at status
The customer and the invoice are created when an order reaches this status (default Processing). Not used in sales receipt mode.
Record the payment at status
The payment is recorded when an order reaches this status (default Processing); in sales receipt mode the sales receipt is booked. Use the status that means paid.
Refund the whole order at status
Default Refunded.
Refund a product return at return status
Default Complete.
Document type
Invoice, then payment; or one sales receipt when the order is paid.
Invoice number prefix
Prefix of the document number, for example WEB- (WEB-1042); up to 10 characters (QuickBooks allows 21 for the whole number).
Due days
Days after the order date. 0 = due on the order date.
Sync from date
Orders placed before this date are never sent.
Create QuickBooks items from product SKUs
Uses an item named like the SKU (or model) and creates missing ones as services. Needs an income account on the Mapping page.
Log retention, Debug log
Retention of the log; the debug log also stores every HTTP call, masked.
Settings
Connection
Client ID and secret of your Intuit app for sandbox and for production; the mode switch picks one. After "Connect to QuickBooks" the page shows the scope that was asked for (com.intuit.quickbooks.accounting) and the company (realm id) the books are written to. To book to another company press "Connect again" and pick it.
Connection
Mapping
Press "Load items, accounts and tax codes from QuickBooks" and "Fill the tax codes suggested for my country", then check:
The default item (required), a shipping item and a discount item. Ids of QuickBooks items; the lists give suggestions.
An income account, only when items are created from SKUs.
A deposit account for each payment method of your store, and a default for the others (a bank account or Undeposited Funds).
The QuickBooks tax code for each OpenCart tax rate, a standard code, a code for lines without tax and one for shipping. US companies with automated sales tax use TAX and NON.
Mapping
Usage
Daily work
Nothing to do. When an order reaches the chosen status the extension queues a job; the cron run books it. The QuickBooks sync page lists every customer, document, payment and refund with its number, currency, amount and QuickBooks Id, and links to the order.
Sync list
Sync order now. Type an order ID to queue it again (for example after fixing the mapping). Nothing is booked twice: an unchanged order is skipped, an unpaid invoice is updated, a document with a payment is left alone.
Queue past orders. Queues the orders in the trigger statuses since the sync date that QuickBooks does not have yet.
Refunds and returns
Set an order to the refund status: a paid order gets a refund receipt, paid back from the mapped account; an unpaid order gets a credit memo applied to the invoice. For a product return give the return the chosen return status (Sales > Returns): the returned product and quantity are refunded the same way.
Jobs and log
The Jobs page shows the queue: queued, waiting to retry, done, gave up. A failed job is retried after 5 minutes, then 15 minutes, 1, 3 and 12 hours; a rate limit waits the time QuickBooks asks for; a lost authorization waits for you to connect again. "Retry" and "Remove" are on every row. The Log page has filters and a CSV export; secrets and tokens never appear in it.
JobsLog
QuickBooks is a trademark of Intuit Inc. This extension is not made, endorsed or certified by Intuit.
Developer notes
Identity
Item
Value
Extension code
kv_quickbooks
Settings
module_kv_quickbooks_*
PHP namespace
KavioLabs\KvQuickbooks (shared core, copied to system/library/ of the extension)
queues the invoice, payment and refund jobs at the chosen statuses
admin/model/sale/returns.addHistory/after
queues the refund of a return at the chosen return status
admin/view/common/column_left/before
menu entry under Sales
admin/controller/common/header/before
licence check
Cron: extension/kv_quickbooks/accounting/quickbooks.cron (OpenCart cron, or the secret web address). The Intuit redirect URI is the storefront route extension/kv_quickbooks/accounting/quickbooks.callback; it receives code, state and realmId. The state is kept in the database as a SHA-256 hash, single use, 15 minutes.
Structure
Client\Api is the OAuth and Accounting API client on Client\BaseClient (HTTP, Retry-After, error mapping); Sync (customer, item, invoice / sales receipt, payment, refund, return), Store (reads an OpenCart order), Accounts and Secret (keys sealed with AES-256-GCM, token refresh under a database lock), Queue, Jobs, Log, Connect (authorization flow).
Map table entities: customer, invoice (the invoice or sales receipt), payment, credit (credit memo or refund receipt), refund (the application or the refund), item, rcredit and rrefund for returns.
Tests
php tests/unit.php (PHP 8.1 and 8.3), node tests/mock-server/server.js 11988 (stand-in of the Intuit OAuth service and Accounting API; the base URL is the setting module_kv_quickbooks_base_url, development only) and node tests/e2e.js (browser test on a dev store: OAuth with realmId, mapping, invoice + payment, retries, token refresh, refund receipt, return credit memo, sales receipt mode, non-US tax). The stand-in proves the extension against its own reading of the API, not against the real service.
API conformance (official Intuit documentation and SDKs)
Checked on 2026-11-06 against Intuit's published OAuth client (github.com/intuit/oauth-jsclient) and the data classes of the official QuickBooks V3 PHP SDK. developer.intuit.com renders only in a browser app, so limits and lifetimes come from the documentation as published at the time of writing: check them against developer.intuit.com before a release. Webhooks are not used; the extension syncs from the order events of the store.
Purpose
What the extension does
Official source
Verified
Scope
com.intuit.quickbooks.accounting only
developer.intuit.com, OAuth 2.0 scopes
yes
Authorization
GET https://appcenter.intuit.com/connect/oauth2 (response_type=code, client_id, scope, redirect_uri, state); the answer carries code, state and realmId
developer.intuit.com, OAuth 2.0; oauth-jsclient
yes
Tokens
POST https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer with Basic client id and secret; access token 1 hour; refresh token 100 days and rolling (every refresh answer carries a new one)
developer.intuit.com, OAuth 2.0
yes
Hosts
production https://quickbooks.api.intuit.com, sandbox https://sandbox-quickbooks.api.intuit.com, /v3/company/{realmId}/...
developer.intuit.com, Accounting API
yes
Minor version and idempotency
minorversion=75 on every call and the requestid parameter on every create
developer.intuit.com, minor versions
yes
Entities
Customer (query by PrimaryEmailAddr, sparse update with SyncToken), Item (Service with IncomeAccountRef), Invoice, SalesReceipt, Payment (Line.LinkedTxn), CreditMemo, RefundReceipt (DepositToAccountRef), CompanyInfo, Preferences, Account and TaxCode queries
V3 PHP SDK data classes
yes
Tax
US companies: TaxCodeRef TAX / NON per line and TxnTaxDetail.TotalTax; other countries: tax code ids and GlobalTaxCalculation TaxExcluded
developer.intuit.com, tax
yes
Errors
Fault.Error[] (Message, Detail, code): 6240 duplicate name, 6140 duplicate document number, 5010 stale SyncToken; 429 with Retry-After
developer.intuit.com, error handling
yes
Limits
500 requests a minute per company
developer.intuit.com, throttling
yes
Credit memos are applied with a zero-total Payment that links the invoice and the credit memo.
QuickBooks is a trademark of Intuit Inc. This extension is not made, endorsed or certified by Intuit.
FAQ
Does it use OCMOD?
No. Events and cron.
Does it work with OpenCart 3?
No, OpenCart 4 only.
Do I need an Intuit app?
Yes, your own. Your order data goes from your shop straight to your QuickBooks company.
Which QuickBooks plans work?
The ones that Intuit allows to use its API. Check the current rules and limits on developer.intuit.com.
Invoice or sales receipt?
Invoice mode books an invoice and then a payment against it. Sales receipt mode books one receipt when the order is paid, for shops that are paid at checkout and do not need an open invoice.
Is my company a "US company"?
The extension reads the country of the company. US companies use QuickBooks automated sales tax: the tax of the OpenCart order is sent as the total tax and the codes TAX and NON mark the lines. Other countries use tax codes; QuickBooks calculates the tax, so set the code of each rate on the Mapping page. A warning appears in the log when QuickBooks calculates a different total than the order.
Why is a payment not recorded?
Most often the invoice is missing or paid already. The Jobs page shows the message. Fix it and press Retry.
Why was an order refused ("lines add up to ... but the order total is ...")?
Something changed the order total without a matching line, for example a custom total extension. Nothing is sent so that QuickBooks never gets a wrong document; correct the order or book it by hand.
No item is mapped. Set the default item on the Mapping page (the id of a QuickBooks item) and press Retry.
The authorization is gone. QuickBooks refresh tokens expire after 100 days without use or when the user revokes the app. Press "Connect again" on the Connection page; jobs wait and run afterwards.
Multi-currency?
Documents are in the currency of the order; a currency other than the home currency of the company needs multi-currency switched on in QuickBooks.
Is it certified by Intuit?
No. QuickBooks is a trademark of Intuit Inc.; this extension is not made, endorsed or certified by Intuit.
Server-side tracking for OpenCart 4.x and 3.0.x: purchases, refunds, add to cart, checkout, product views and leads go from your server to the free official GA4 Measurement Protocol, Meta Conversions API and TikTok Events API, deduplicated with the browser pixels through shared event ids. Consent-aware, SHA-256 hashed customer data, order status mapping, queue with retries, test mode and an event log. No paid relay, events only, no OCMOD.
The department store theme for OpenCart 4.x and 3.0.x: colour-coded departments, a department list beside the hero slider with two side promos, a big search with a department selector, tabbed product blocks, a 2 + 1 + 2 offer grid, deals of the day with real countdowns, a department showcase, a promotions band and a three-column product page with a sticky buy box. Four styles (Meridian, Harbor, Citrus, Night) and your own colours on top. Events only, no core changes.
Stop AI crawlers, scrapers, vulnerability scanners and unwanted countries before OpenCart 4.x or 3.0.x builds a page. Googlebot and Bingbot are verified by DNS and always allowed; 50+ bots get one switch each; country rules use free GeoIP databases and can close only the checkout; IP and network lists, rate limits, honeypots and the cart flood fix; a one-second challenge instead of a captcha; learning mode, dashboard, log, IP tester and Cloudflare export. No core changes, no OCMOD.