WooCommerce is the open-source ecommerce platform for WordPress. It launched in September 2011, and Automattic, the company behind WordPress.com, bought it in 2015. The core plugin is free, and the WordPress plugin directory counts more than 7 million active installs.
WooCommerce puts the number of live stores built with it at more than 4 million. A new version ships roughly every five weeks.
Yours to own
The pitch is ownership. The site, the code and the data belong to the business, and a store can be moved to another host, or another platform, whenever it likes.
The choice extends to everything around it. More than 1,000 extensions sit in the WooCommerce Marketplace, and over 100 payment gateways plug in, including Stripe, PayPal and WooCommerce’s own WooPayments.
Because the store runs on hosting you pick, the host shapes how fast it is. WooCommerce’s own hosting guide recommends dedicated server workers and object caching, since cart, checkout and account pages can’t be served from a cache.
How WooCommerce orders and fees reach Xero
WooCommerce’s own Xero extension, developed by Woo, sends each order to Xero as an invoice. Woo recommends sending it once payment is confirmed. The payment follows as a separate step, and every payment lands in the one Xero account set for them, whichever gateway took the money.
Gateway fees take another route. The extension doesn’t retrieve the transaction fees Stripe or another processor charges, and only sends fees already sitting on the order as fee lines. So the payments recorded in Xero carry full order totals, and Woo’s guidance is to reconcile the processors’ fees separately in Xero.
Refunds and customers follow their own rules. A fully refunded order makes the extension try to void its Xero invoice, but Xero won’t void an invoice with a payment applied, so a paid invoice gets adjusted in Xero instead. Contacts are matched on the order’s billing email, and a new one is created when there’s no match.
Which system owns the WooCommerce stock count
With stock management switched on, WooCommerce keeps one number per product, or per variation, and lowers it as orders come in. Unpaid orders waiting in Pending payment hold their stock for a set number of minutes, after which the order is canceled and the stock goes back on sale.
Once an EPOS till or a marketplace sells the same stock, one system has to own that number and the others follow it. The Xero extension can send each SKU to Xero as an item code, but it’s one-way: quantity changes made in one system aren’t copied to the other.
Woo’s own Square extension makes the choice explicit. Its sync setting names WooCommerce or Square as the source of truth for product data, and Woo’s advice is to edit stock in whichever one is chosen. WooCommerce checks Square for stock changes on a schedule, so a sale on the Square till lowers web stock at the next check. That same check can replace a quantity someone typed into WooCommerce by hand.
The REST API
Other systems connect through the WooCommerce REST API, currently version 3. Access is set up under WooCommerce’s advanced settings, where the store owner creates a key with read, write or read/write permissions for each integration.
For custom storefronts, a separate Store API handles the cart, checkout and product pages, with optional rate limiting to protect checkout.
Webhooks
WooCommerce can send webhooks when orders, products, customers or coupons are created, updated or deleted. Each one carries a signature the receiving system can use to confirm it came from the store.
Deliveries are logged under WooCommerce’s status pages, and a webhook that fails five times in a row is switched off automatically until someone turns it back on.
Order storage
Since version 8.2 in October 2023, new stores keep orders in dedicated tables built for scale, and existing stores can switch when they’re ready. Integrations that read orders through WooCommerce’s own functions, rather than straight from the database, keep working either way.
The original REST API was moved out of the core in version 9.0 in June 2024, so anything built on it now runs through a separate plugin or moves to version 3.
Orders worth more than their total
WooCommerce’s REST API and webhooks give every order a way out of the store. Each one can carry its real profit after payment fees, postage and packaging, stock can follow the till or warehouse system that owns the count, and gateway fees can reach Xero instead of being reconciled by hand.
Stock owned by one system and mirrored in another needs a clear rule for which side wins. If orders still get copied from the store into another system by hand, an hours-saved estimate shows what the copying costs.