Description
Stop copying orders into Zoho Books by hand. Every order your customers place is typed, checked, and re-typed — or it just flows into Zoho Books on its own, seconds after checkout, with the contact, the items, the invoice, and the payment already in place. This plugin makes it the second one.
Zoho Books Integration For WooCommerce connects your store to your own Zoho Books organization over a secure OAuth connection — your Zoho password never touches the site. Set it up once with the built-in wizard, and your WooCommerce checkout becomes a direct feed into Zoho’s sales, invoicing, and accounting — no CSV exports, no double data entry, no missed orders at month-end.
Compatible with every Zoho data centre (.com, .eu, .in, .com.au, .jp, .ca, .sa, .com.cn) · classic and block (Gutenberg) checkout · WooCommerce HPOS · works with your existing Zoho items via SKU matching.
⚡ Sync WooCommerce orders to Zoho Books automatically
- Export on checkout — the order is in Zoho Books before your customer sees the thank-you page, and you choose exactly which statuses qualify (Processing for paid orders, On hold for bank transfer / COD…)
- Sales order or invoice — your call: create each order as a sales order only, or convert it straight to an invoice, submitted approved or saved as a draft
- Your numbering, your rules — keep your own document series for sales orders, invoices and credit notes, or let Zoho number them
- Discounts and coupons land per line or at document level — the way your accountant expects; shipping ships as its own (taxable) line
- Flexible customer handling: real contact records (created or matched by email), guest checkouts included, or map every order to a single generic contact
- 🆕 A customer whose contact was deleted or merged in Zoho is found again automatically
- Multi-currency orders converted with Zoho’s or WooCommerce’s exchange rate — or skipped, your choice
🧾 Invoices, payments, refunds — created automatically
- Zoho invoices created automatically at the order statuses you choose
- Payments registered and invoices marked paid — with per-gateway payment-mode and deposit-account mapping, so card money and COD money land in the right books
- Refund in WooCommerce credit note in Zoho Books, linked to its invoice and applied. Done.
- Cancel an order its Zoho documents are voided, not orphaned — 🆕 paid orders too
- Fulfilment recorded as a sales-order note or a delivery challan, tracking details included
🧮 Taxes, handled properly
- Send WooCommerce’s own tax totals so both systems agree to the last decimal — a document-level rounding adjustment keeps them in exact step — or let Zoho Books recompute tax instead
- One-click auto-mapping of your WooCommerce rates to the matching Zoho taxes, zero-rated lines included
- Regional tax fields built in where Zoho requires them — including full India GST support (GSTIN, HSN/SAC, place of supply, CGST+SGST vs IGST resolved automatically)
🔄 Customers and products, in both directions
- Push WooCommerce customers to Zoho contacts the moment they register or change — guests included
- Pull Zoho contacts into WooCommerce on a schedule, with create and conflict policies you control (WooCommerce wins, Zoho wins, or last write wins)
- Product sync both ways with SKU-first matching that never merges two different products, and field-level control over what a push may overwrite
- Inventory sync with a single source of truth — WooCommerce Zoho as stock adjustments, or Zoho WooCommerce on a schedule as fast as every 15 minutes, into the Zoho warehouse you choose (Zoho Inventory required; the plugin tells you plainly when it isn’t enabled, with the exact steps to turn it on)
🛡 Built for stores that can’t afford sync surprises
- Background queue with automatic retries — a slow Zoho server never blocks your checkout
- 🆕 Busy orders wait their turn — a job that finds its order busy tries again by itself instead of being dropped
- Failures land in a visible retry queue and resolve themselves the moment a retry succeeds — no stale red badges
- Human-readable logs: plain-language messages (“Zoho would not accept stock tracking — it needs a Zoho Inventory subscription”), with technical details when you want them
- Dashboard with sync status, health, mapped-record counts and recent activity at a glance
- 🆕 Live progress on the Logs screen — one line per task, counting only what Zoho really accepted
- 🆕 If your Zoho Books trial or subscription ends, the plugin tells you once and keeps the work ready to re-run
- 🆕 Works on a phone
- 🆕 Stores linked to a subscription account share their sync log with our support team, so problems are spotted sooner
- A setup wizard that resumes exactly where you left off — even across the OAuth redirect
- Change organization safely: the plugin warns you, explains what happens to existing links, and cleans up on your say-so
- Manual sync buttons that follow your settings and say exactly which switch to flip when they’re off
Every feature listed above is fully functional in this plugin — there is no license unlock, trialware gate, or disabled code path.
🚀 Ready in minutes
- Install and activate the plugin
- Follow the wizard: paste your Zoho API client keys, click Save & Connect, pick your organization
- Place a test order — watch it appear in Zoho Books
📋 Requirements
- WordPress 6.5+ · WooCommerce 8.0 or higher · PHP 8.0+
- A Zoho Books organization and a free Zoho API client (Client ID and Secret — the wizard shows you exactly where to create one)
External services
This plugin talks to three outside services, and links to Calendly for booking a call.
Zoho Books (Zoho Corporation) is where your orders, invoices, payments, refunds, customers, products and stock are synced, as you configure them. Data goes to the Zoho data centre you choose on the Connection tab whenever a sync runs. Zoho terms · Zoho privacy policy
Zoho SalesIQ (Zoho Corporation) runs the support chat in the corner of the plugin’s own screen. Its script loads from Zoho only on that screen — never on other admin pages or on your store. Like any web page, it sends Zoho your IP address, browser details and the page address, and Zoho sets its own cookies; anything you type in the chat goes to our support team. A site can turn the chat off with the zbwc_salesiq_widget_url filter (return an empty string). Zoho terms · Zoho privacy policy
Calendly: “Schedule a meeting” opens our booking page on calendly.com in a new tab. Nothing is sent unless you click it. “Documentation” opens our guide on wpzohoapi.devwork.in, and “Demo video” (when we have one) opens the video, the same way. Calendly privacy notice
This plugin’s subscription and support service (wpzohoapi.devwork.in):
- Plans and checkout: when an admin opens the Plan tab or the upgrade window, the plugin fetches the list of plans to show prices. Choosing a plan sends the site address to start a Stripe checkout. Linking sends the site address, the site’s admin email and a key the site made for itself.
- Plan checks: a store linked to a subscription account checks its plan here, sending its site address with each signed request.
- Re-link email: “Email me a link to link it again” on the Plan tab sends the site address; the service emails a one-time link to the account’s address.
- Sync log: every 5 minutes the store sends the new lines of its sync log — time, level, type, the message, the order or product it is about, how long it took and the technical detail recorded with it (such as the job, the attempt and Zoho’s reply) — with customer email addresses and phone numbers removed first, together with the site address, site name, plugin version and a random id for this installation. Support uses it to spot failures and help sooner, and it is kept for 30 days. Only stores linked to a subscription account send it; linking an account turns it on. A store that is not linked sends nothing.
- Queue report: with the sync log, and every 10 minutes when there is nothing new, the store sends counts from its background queue — how many jobs are waiting, running or late, how many failed, when the oldest one was due, when a job last ran, the job names, the next scheduled runs, whether Zoho is connected and why syncing is paused (if it is) — plus the WordPress, WooCommerce and PHP versions. No customer or order details. Linked stores only.
- Announcements: each time an admin opens the plugin’s screens, a linked store asks for a notice from us (a new feature, planned maintenance) to show on the plugin’s own screens, and for the current help links (“Demo video”, “Documentation” and “Schedule a meeting”). The request is signed like the others and sends nothing else. Stores that are not linked never ask, and use the links built into the plugin.
Like every request WordPress makes, these carry WordPress’s standard user agent, which includes the site address.
Installation
- Ensure WooCommerce is installed and active.
- Upload the plugin to
wp-content/plugins/erp7-order-sync-for-zoho-booksand activate it. The release zip contains the compiled admin app; the JavaScript source lives insrc/and builds withnpm install && npm run build. - Open Zoho Sync in the admin menu and follow the onboarding wizard.
Connecting to Zoho
In the Zoho API Console, create a Server-based Application and add the redirect URI shown on the Connection tab. Enter your Client ID, Client Secret and data-centre region, click Save & Connect, then choose your organization.
Recommended
Define an encryption key in wp-config.php so Zoho secrets are encrypted at rest:
define( 'ZBWC_ENCRYPTION_KEY', 'a-long-random-string' );
FAQ
-
Do I need a Zoho Books account?
-
Yes. The plugin syncs into your own Zoho Books organization using API credentials you create in the Zoho API Console.
-
Does it support High-Performance Order Storage (HPOS)?
-
Yes. The plugin declares HPOS compatibility and uses the WooCommerce order CRUD APIs.
-
How is background processing handled?
-
Through WooCommerce’s Action Scheduler. Failed jobs are retried with backoff and, if they still fail, moved to a dead-letter list you can retry from the Logs tab. A job that finds its order busy waits and tries again by itself.
-
Will it sync my existing orders?
-
Yes — use Run backfill on the Orders tab to queue them. Products and customers have their own sync buttons on their tabs.
-
Does it sync payments, refunds, customers, products or stock?
-
Yes, all of them. Orders, products and customers sync on the free plan within the monthly allowance; payments, refunds, cancellations, fulfilment and inventory are part of Pro. Each area has its own settings tab and can be turned off independently, and everything except order sync is off until you switch it on.
-
Is it free?
-
Yes, with a monthly allowance: 10 orders, 10 products and 10 customers. The allowance resets on the 1st. Re-syncing a record that already reached Zoho is always free, so a store under those numbers never runs out.
-
What happens when I reach a limit?
-
Nothing is lost. Orders stop being sent and are logged with the reason, so you can send them next month or upgrade and send them straight away. Products degrade instead of blocking — the order still syncs, with the line carried by name, rate and quantity rather than a linked Zoho item. Customers do stop an order, because Zoho Books cannot accept a sales order without a contact.
-
How do I upgrade, and how do I cancel?
-
The Plan tab. Checkout is handled by Stripe. Cancelling schedules the subscription to end at the end of the period you have already paid for — the site keeps every feature until that date, then returns to the free plan with all its settings intact.
-
Which system owns stock levels?
-
Whichever you choose on the Products & Inventory tab. Inventory is off by default; set it to WooCommerce Zoho to push stock changes as they happen, or Zoho WooCommerce to pull on a schedule.
Reviews
There are no reviews for this plugin.
Contributors and Developers
“Zoho Books Integration For WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Zoho Books Integration For WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Change Log
1.0.6
- “Need Help?” now links to the plugin’s documentation: a step-by-step guide to every screen, with pictures.
- A “Demo video” link joins it there once we publish a demo video.
- Our team can update these help links without a plugin update. Stores linked to a subscription account receive them with the announcements check they already make; other stores keep the links built into the plugin.
- The help line under the plugin’s name wraps neatly, so the tabs stay on one row.
1.0.5
- Chat with our support team right on the plugin’s screen (Zoho SalesIQ). The chat loads only there — never on other admin pages or on your store.
- “Need Help? Schedule a meeting” books a call with the team. It sits under the plugin’s name, at the bottom of every plugin screen, beside the setup steps and on the Plugins screen.
- News from our team — a new feature, planned maintenance — now shows above the plugin’s screens like a WordPress notice, for stores linked to a subscription account. Close it and it stays hidden until the notice changes.
- A store that lost its link to its subscription account (a restored backup, a moved site) can ask for a re-link email on the Plan tab and link again with the one-time link in it.
- Linked stores add a short report on their background queue to the sync log they already send: how many jobs are waiting, running or late, when jobs last ran, and the WordPress, WooCommerce and PHP versions. No customer or order details. Support can spot a stuck queue sooner.
- The plugin page now lists every call the plugin makes to outside services and what each one sends.
1.0.4
- Every store linked to a subscription account now shares its sync log with our support team, so failures are spotted and fixed sooner. The switch under Zoho Sync Logs is gone. Customer email addresses and phone numbers are still removed first, and a store that is not linked sends nothing.
1.0.3
- Cancelling a paid order now voids it in Zoho as well. Zoho will not void an invoice that has a payment on it, so the payment this plugin recorded for the order is removed first, then the invoice and sales order are voided. A payment entered in Zoho by hand, or an invoice carrying a credit note, is left alone and the Logs say why. Switch it off with “Paid order cancelled” under Orders Lifecycle.
- If Zoho still refuses the void once the payment is removed, the payment is recorded again exactly as it was, so the books are never left half-changed.
- A job that finds its order busy with another job now runs again by itself — a minute later, a few times, then once more fifteen minutes on — instead of being dropped. Only an order that stays busy through all of that appears under Failed jobs, and the Logs name the order.
- Cancelling an order twice, or reopening it before the cancellation reaches Zoho, no longer raises false warnings or voids a sale the shop has taken back.
- A refund or payment arriving for an order whose invoice is already void is skipped with a note instead of failing.
- The sync log can now be sent to our support team, so failures across stores are seen and fixed sooner. Customer email addresses and phone numbers are removed first. It is on for stores linked to a subscription account and off for others; switch it under Zoho Sync Logs.
- The progress rows on the Logs screen are one line each with a percentage, the background queue included. A finished row turns green at 100% and fades away seven seconds later; a failed one stays up so the error can be read.
- When Zoho refuses because the organization’s own Zoho Books trial or subscription has ended, the plugin says so once — on the Dashboard and in the Logs — stops spending the API allowance on further refusals, and keeps the jobs in Failed jobs to re-run after upgrading. Progress rows count only what Zoho actually accepted, and turn red with the reason when it refuses.
- A customer whose Zoho contact was deleted, or merged into another contact, no longer has every later order fail. The plugin notices, looks the customer up in Zoho again — adopting the contact that now carries their email — or creates a new one, and the order goes through. If the deleted contact was the generic one all orders are billed to, Failed jobs says which setting to change.
- “Skip the order” under Orders Lifecycle Customer handling skipped every order, regular customers included. It now skips only orders from customers with no matching Zoho contact; everyone Zoho already knows syncs as usual, and the Logs say plainly when an order was skipped and why.
- The plugin’s screens now fit a phone. The sync log and Failed jobs show each entry as a small card instead of a table wider than the screen, progress rows show their full name with the bar underneath, the reason Zoho refused something is never cut off, Dashboard cards stack, and pop-up notices stay on screen.
1.0.2
- The Logs screen shows what a sync is doing while it runs — a progress bar for long pulls, the background queue’s depth, and the log refreshing itself as lines are written.
- Log and dashboard times are shown in the reader’s own time zone instead of UTC.
- Zoho item names, prices and descriptions are pulled on a schedule of their own, so a price changed in Zoho reaches WooCommerce without pressing Sync now.
- Stock pulled from Zoho is what can actually be sold: units held by open sales orders are no longer handed back to WooCommerce, where they could be sold twice.
- A Zoho item follows the product’s stock tracking: switching “Track stock quantity” on or off in WooCommerce changes the item’s type in Zoho, and Zoho’s refusal for items with stock or transactions is recorded rather than retried.
- Cancelling an order no longer reports a void Zoho refused: a paid invoice cannot be voided, and the Logs now say so and ask for a credit note instead.
- An organization with GST switched off is named as the cause when an order is refused, with the setting to change, and is no longer retried as though it were a temporary fault.
1.0.1
- Renamed to Zoho Books Integration For WooCommerce.
- Connection tab redesigned: one-step Save & Connect, an organization chooser dialog that opens itself, and safe organization switching.
- Setup wizard resumes from wherever the connection actually stands — including across the OAuth redirect.
- India GST: tax auto-mapping now writes home-state (CGST+SGST) and zero-rate pairs, so intra-state and fully discounted orders sync correctly.
- Payments recover from a deposit account left over from another organization, and draft invoices are marked sent before payments and credit notes.
- Refund credit notes are linked to their invoice, and amount-only refunds carry the order’s tax.
- Invoices inherit rounding adjustments so both systems agree to the paisa.
- Failed jobs resolve themselves when a retry succeeds; manual sync buttons follow their toggles and say which switch to flip.
- Warehouse support for Zoho’s newer Locations API, and plain guidance everywhere when Zoho Inventory isn’t enabled yet.
- Product descriptions and featured images sync in both directions, on updates as well as first creation.
- Turning inventory on no longer stops the catalogue: an organization without Zoho Inventory has its stock fields dropped instead of failing the whole product sync.
- Stock adjustments work on organizations using Zoho’s newer Locations API, and a warehouse left mapped from a previously connected organization is detected and skipped rather than rejected.
- Descriptions sync field for field: WooCommerce’s product description maps to Zoho’s item description in both directions, and the short description stays WooCommerce’s own.
- A warehouse left mapped from a previously connected organization is no longer sent to Zoho when the check that detects it cannot reach the API — the cause of “Invalid Element warehouse_id” appearing and disappearing on unchanged settings.
1.0.0
- Initial release: WooCommerce orders to Zoho Books sales orders and invoices, with contacts and items created or matched as an order needs them.
- Payments, refunds as credit notes, cancellations that void the Zoho documents, and fulfilment with tracking.
- Two-way customer and product sync, and inventory with a single source of truth and a pull schedule.
- Tax, shipping, discount and multi-currency handling, India GST fields, and custom document numbering.
- Onboarding wizard, dashboard, sync log with a dead-letter retry queue, and backfill for existing records.
- Zoho API rate limits pause syncing for 15 minutes and resume on their own, rather than retrying into the limit that is blocking them.
- Free plan with a monthly allowance of 10 orders, 10 products and 10 customers; Pro removes the limits and adds payments, refunds, fulfilment and inventory.
