
BAS Exchange for WooCommerce — products, prices, stock and orders in sync with BAS
WooCommerce exchange with BAS over the CommerceML 2 protocol: categories, products, properties, pictures, prices and stock come from BAS, orders go to BAS. The exchange address, user and password are in the admin, BAS starts every exchange itself. The base version is free; Pro adds orders, variations, warehouses and sale prices.
- Compatibility
- WordPress 6.2+ · WooCommerce 7.0+ (tested on WP 7.1 / Woo 11.1) · PHP 7.4+ · HPOS · BAS with website exchange over CommerceML 2
- Licence
- one site, annual
- Trial
- 7 days, no card, one per site
What Free has,
and what Pro adds
The free version works with no time limit. Pro adds the rest of the features in the table.
What it looks like
Key points
What the customer sees
Customers see on the site what is in BAS — and never see the exchange itself:
What the store admin gets
The WooCommerce → BAS Exchange page with the Connection, Catalog, Orders (Pro), Log and manual import, and Licence tabs.

The trial starts when you ask
A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site
Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. If our server is unreachable, Pro keeps working for 14 more days. For studios — keys for 5 or 25 sites, or unlimited.
Technical requirements
BAS with website exchange over the CommerceML 2 protocol.
WooCommerce 7.0+, HPOS compatible, classic and block checkout.
WordPress 6.2+ · PHP 7.4+ with the XMLReader extension. The Zip extension is needed for archives; without it the module asks BAS to send files unpacked.
BAS must be able to reach the site over HTTP(S) at the exchange address. If the site is behind a firewall or a password, that address has to be let through.
The server’s request timeout must be longer than “Seconds per import step” (20 s by default).
Tested on WordPress 7.1 with WooCommerce 11.1, PHP 8.3 and 7.4, MySQL, with and without HPOS.
Version history
CommerceML 2 exchange point (authorisation, files in parts and zip, step-by-step import), groups → categories, products with pictures, properties → attributes, price from a price type,…
Frequently bought with BAS Exchange for WooCommerce
4 modules in one order — 40% cheaper than separately


Nova Poshta Premium — a Nova Poshta module for OpenCart 2.3, 3.x and 4.x

LiqPay — Card Payments for OpenCart 2.3, 3.x and 4.x

Telegram notifications and Viber/SMS for customers for OpenCart
Full module description
BAS Exchange for WooCommerce connects a WooCommerce store with BAS over the CommerceML 2 protocol. Products, prices and stock are kept in BAS and the site receives them by itself: no CSV exports, no retyping prices by hand, and no “in stock” on the site for goods that are already gone from the warehouse. In the other direction (Pro), BAS collects orders from the site and sends their statuses back.
BAS starts every exchange: in its website exchange settings you enter the address, user and password from the Connection tab, and BAS then sends the catalog and offers and collects orders on schedule or on demand. The store answers exactly the way the protocol expects.
What the customer sees
Customers see on the site what is in BAS — and never see the exchange itself:
- Up-to-date prices and availability. The price from the chosen price type, the stock and the in stock / out of stock status refresh with every exchange.
- The catalog as in your accounting. BAS groups become categories with the same nesting, properties become attributes that filters work with.
- Pictures and descriptions come with the product; a repeated exchange does not pile up copies in the media library.
- Sizes and colours (Pro) — variations with their own price and stock, the sale price shown crossed out.
- An item marked as deleted in BAS leaves the storefront (to drafts or trash, as you choose).
What the store admin gets
The WooCommerce → BAS Exchange page with the Connection, Catalog, Orders (Pro), Log and manual import, and Licence tabs. The screenshots show the admin in Ukrainian; the module interface is also in English and Russian.
- Connected in a minute. The module creates the address, user and password itself — you only copy them into BAS. The user and password are separate; they are not a WordPress account.
- Control over fields. Name, description, SKU, categories, pictures, attributes — each field can be left to BAS or kept editable on the site.
- Price types and warehouses are read from the BAS files and listed in the settings — no guessing names.
- The log records every exchange step with its result: what came in, how much was created and updated, what was skipped and why. The same log is in WooCommerce → Status → Logs.
- Manual import — upload import.xml, offers.xml or a zip with pictures right in the admin and watch the step-by-step import. Handy for the first load and for checking a problem file.
Pro: orders, variations, warehouses, sale prices
- Orders to BAS. During the order exchange BAS collects new and changed orders with the chosen statuses: customer, address, phone and e-mail, product lines with BAS ids, shipping and fees as services, payment method.
- Statuses from BAS. Cancelled, paid, the final status and your own rules like “Shipped = completed”. Every change is written as an order note.
- An honest “paid” flag. For cash on delivery only in the Completed status, for cards after the payment is confirmed.
- Variations from product characteristics: size, colour and so on become variations with their own price and stock.
- Sale price from a second price type (for example “Sale”) — when it is lower than the regular one.
- Warehouses: the stock on the site is the sum of the ticked warehouses only.
- Full upload: products that came from BAS earlier but are missing from a full upload go to drafts or out of stock. When they return in BAS, they are back on the site.
How it works, step by step
- BAS calls the exchange address with the user and password and gets a session.
- The store tells BAS whether it accepts zip archives and how large file parts may be — within what your server accepts.
- BAS sends the files: import.xml (groups, properties, products), offers.xml (prices and stock) and pictures — in parts or as one archive.
- The store imports a file in steps: when a step’s time is up, it answers “progress” and BAS repeats the request until the import is finished.
- Every product and category gets its BAS id, so the next exchanges update them instead of creating new ones.
- Exchange files are deleted right after import; the log keeps the result of every step.
- Pro: during the order exchange BAS gets a file with orders, confirms it, and next time gets only new and changed ones. Statuses from BAS come back in a separate file.
Under the hood
- Streaming XML reading. Files are read one element at a time, not loaded whole into memory, so a large catalog does not hit memory_limit. Files in windows-1251 are read too.
- Resumes where it stopped. The import state of every file is kept between steps; a repeated request from BAS continues instead of starting over.
- Linked by BAS id in products, variations, categories and pictures: no duplicates on repeated exchanges or after renames.
- Security. A separate user and password for BAS compared in constant time; file names are checked (no “../” and no executable extensions), zip archives are unpacked with protection against escaping the folder.
- Files outside the public folder. The module picks a folder outside the site root for exchange files and deletes the XML right after import — order files included, as they hold personal data. The admin shows where the files are kept.
- Sites on plain permalinks get an address like /index.php/bas-exchange/ that reaches WordPress without rewrite rules.
- Cleans up after itself. With “Delete data on uninstall” ticked, deleting the module removes its settings, log, exchange folder and BAS ids; the products and categories themselves stay.
Installation
- Plugins → Add New → Upload Plugin, choose
catcode-bas-exchange-for-woocommerce-free-1.0.0.zip(free version) orcatcode-bas-exchange-for-woocommerce-1.0.0.zip(Pro) and activate it. WooCommerce must be active. - WooCommerce → BAS Exchange → Connection: copy the exchange address, user and password. The curl command on the same tab checks that the address answers “success”.
- In BAS open the website exchange settings (CommerceML protocol) and paste the three values.
- On the Catalog tab choose which fields BAS may update, and keep “Match by SKU” on if the site already has products.
- Run the exchange in BAS. The result of every step is in the Log. After the first exchange pick the price type (and for Pro, the sale price type and warehouses).
- For Pro: paste the licence key from the e-mail you get after payment, or start the 7-day trial on the Licence tab, then switch the order exchange on.
Questions
about the module
Didn't find the answer? Message us on Telegram and we'll reply within a business day.
Where do I find the address for BAS?
WooCommerce → BAS Exchange → Connection. It shows the exchange address, user and password with Copy buttons, plus a curl command to check it: the answer must start with "success". BAS adds the protocol parameters to the address by itself.
Has the module been tested with a live BAS?
No. The exchange was tested with a CommerceML 2 protocol simulator playing the part of BAS: the same requests, files in parts and as an archive, large catalogs, orders and statuses. Run your first exchange with your BAS during the 7-day trial; if something goes wrong, the log shows at which step, and we fix it quickly.
Will the exchange overwrite descriptions I wrote on the site?
Only the fields ticked in Catalog → "BAS may update". Untick "Description" and BAS fills it only for new products. Prices and stock always come from BAS.
The store already has products. Will there be duplicates?
No, with "Match by SKU" on: a product BAS sends for the first time is linked to the existing product with the same SKU. After that the link is kept by the BAS id, so renaming an item in BAS updates the same product.
A large catalog breaks off during import.
Lower "Seconds per import step" on the Connection tab below your server's request timeout (20 seconds by default). The store answers "progress" and BAS repeats the request until the whole file is imported.
Will my whole order history go to BAS?
No. Only orders with the chosen statuses created after the order exchange was switched on are sent. If BAS missed something, "Send everything again" sends those orders once more.
How does BAS know an order is paid?
The "paid" flag is set only when the money has actually arrived: for card payments after the payment is confirmed, for cash on delivery only in the Completed status. Processing is not treated as paid for cash on delivery.
Can I try it without BAS?
Yes. Export import.xml and offers.xml from BAS (or any CommerceML 2 files) and upload them on the "Log and manual import" tab — they are imported exactly like an exchange.
My site uses plain permalinks. Does it work?
Yes. The Connection tab then shows an address like /index.php/bas-exchange/ — that is the one to paste into BAS.
No reviews yet. Be the first.
No questions yet. Ask one — we answer within 24 hours.
Not quite what you are looking for?
We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.
Order a custom module
Buying the module
—