Leaving your Shopify or WooCommerce wholesale app
The renewal is due at a higher tier, an update clashed with your theme, or the plugin was closed. Getting the data out is the easy part. The risk is the week a café cannot order, and this is the order of steps that avoids it.
Published 8 October 2026
On this page12
- Should I leave my wholesale app?
- If you are on Wholesale Market
- What to take out, and where it is
- Renaming the columns
- Importing, and what the import does not bring
- Telling the cafés
- A three-week plan that does not risk the ordering week
- Removing what the app leaves behind
- What usually goes wrong
- What "done" looks like
- Questions roasters ask
- Where Order Book fits
Short answer. Moving a roastery's wholesale out of a Shopify app or WooCommerce plugin and into Order Book, or any ordering tool, takes about three weeks, and the app stays switched on until every café has ordered once in the new place. Export customers and orders first, rename the columns to the import template, build the prices as catalogs, move the cafés in three waves, and remove the app and its leftover theme code last. The one exception is a plugin closed for a security issue, which you switch off on day one.
Order Book is one of the places you might be moving to, so read the last section with that in mind. Everything before it applies whichever tool you choose.
Should I leave my wholesale app?
Leave because it is costing you orders, not because a review annoyed you. The reasons roasters give are the same across apps and plugins, and they repeat for years:
- Checkout drops the wholesale price, or refuses the order, and a café rings to ask why.
- An app or plugin update breaks the theme or the cart, usually in a busy week.
- Giving one café its own price needs a higher tier than the one you are on.
- A ticket to support takes days, or is closed before the problem is fixed.
- The licence renews at full price, and leaving means losing the price groups you built in it.
One of those in a year is software. Three of them is a pattern, and it will not get better on the next update, because it comes from the way these apps work: they add wholesale to a retail shop with customer tags and theme code. The Shopify wholesale apps compared and the WooCommerce plugins compared go through them one by one.
There are weeks not to start in: your busiest month, the week of a price increase, the week before a holiday closure. Three quiet weeks are worth waiting for, unless the next section applies to you.
If you are on Wholesale Market
The Wholesale Market plugin was closed on wordpress.org on 3 August 2026. The notice on its page gives the reason as "Security Issue", and a closed plugin is not available for download and gets no fixes. Deactivate it now, before anything else in this guide. Do not leave it running until the move is finished.
Deactivating it ends the wholesale prices in your shop, so a café that logs in will see retail prices. For the days in between, tell your cafés to order by phone, email or message, and enter those orders yourself. Then do the steps below in days rather than weeks: the export, the rename and the import fit in one afternoon, and the cafés can move in one wave.
What to take out, and where it is
Export everything before you change anything, into one folder with the date on it. Nothing in this table needs the app to be removed, and nothing should be removed until the end.
| What | Where to export it | What you need | What catches people |
|---|---|---|---|
| Your wholesale customers | Shopify: Customers, filtered by the wholesale tag or the B2B company, then Export. WooCommerce: Users, or the Customers report in Analytics. | The café's name as you say it, the email it signs in with, the person who orders, delivery address | The customer record often holds the person, not the café. You want the café's name on every row, spelled one way. |
| Wholesale orders | Shopify: Orders, filtered by the tag or the B2B company, then Export. WooCommerce: Analytics, Orders, Download. | Date, café, item, quantity, unit price — one row per line where you can get it | This is the file you import. A year of it is worth having, because it tells the new system each café's rhythm. |
| Prices per group or per café | The app's own price screens, or its export if it has one | One price per product per kind of café, then the cafés with their own price | Many apps store a percentage off retail, not a price. Turn every percentage into a number before you start. |
| Minimums and terms | The app's settings, and your own notes | Minimum order, payment terms, which café has which | These are often set per tag. Write down which cafés carry which tag before the tags go. |
| Delivery days and cutoff | Usually nowhere in the app. In your head, or the driver's | Day, cutoff time, which cafés are on which day | No generic wholesale app holds this, so it is the one list you write from scratch. |
Shopify emails the orders export instead of downloading it when you export more than 51 orders or export by date. WooCommerce does the same for an Analytics report longer than one page, and sends it to the admin who asked. Start both, then go and roast.
Renaming the columns
The Order Book import reads a CSV with these headers, the same in every language: date, client, item, quantity, unit_price, total, email. Only date and client are required. Headers are read without regard to capitals, and a space counts as an underscore, so Total and Email already match. Any other column is ignored, so you can leave the rest of the export where it is. The template is in the app, under the import, as Download a template.
From a Shopify orders export
| Shopify's column | Rename to | Note |
|---|---|---|
| Created at | date | The date at the start of the value is read; the time is ignored. |
| Billing Company (or Billing Name where the company is blank) | client | Use the café's name, the same spelling on every row. |
| Lineitem name | item | The coffee and bag size, as written. It is kept as text. |
| Lineitem quantity | quantity | 1,5 and 1.5 both read as one and a half. |
| Lineitem price | unit_price | Check the Lineitem discount column — see below. |
email | Already matches. Gives a new client its first contact. | |
| Total | total | Already matches. Only used when a row has no item. |
One check before you rename anything. Some apps give the wholesale price as a discount at checkout rather than as the line price. In that case Lineitem price holds the retail price and the discount sits in Lineitem discount. Compare one café's order against its invoice. If the two disagree, take the discount off the unit price before you import.
From a WooCommerce orders download
The Orders report in WooCommerce Analytics downloads one row per order, with all the products in a single cell. Rename the date column to date, the customer column to client and the net sales column to total, and delete the products column. Each order then comes in as one line for its total. That is enough for revenue and for each café's rhythm, though not for quantities per coffee. If an order export plugin already gives you one row per line, rename its columns to the full set above instead.
The four things that go wrong in the file
- Blank rows inside an order
- Shopify puts the second and later lines of an order on the rows below, with the date and the customer left blank. The import skips a row with no date or no client, without a warning, so fill those two columns down before you save. Otherwise every order arrives with only its first line.
- Semicolons instead of commas
- A spreadsheet set to a European language often saves CSV with semicolons. The import reads commas only, and a semicolon file arrives as one column and is refused. Save as "CSV UTF-8 (comma delimited)", which also fixes the next one.
- The wrong encoding
- The file has to be UTF-8. An older Windows or Mac export turns "Café" into nonsense, and the import refuses it rather than guessing.
- The café spelled two ways
- Clients are matched by name, without regard to capitals. "Café Aurora" and "Cafe Aurora Lda" are two clients with half a history each. Sort the client column and read it once, top to bottom, before you import.
Dates can be day-first, as in 31/01/2026, or 2026-01-31. Rows with the same date and client become one order. An order with a negative total is a refund and is left out, and the import says how many. Importing the same file twice is safe: the orders already in are skipped.
Importing, and what the import does not bring
The CSV brings two things: your clients, created from the names in the file, and their past orders, marked Delivered. It does not bring products or prices. The items on past orders are kept as text, the way they were written, and the unit_price column records what each past line cost, not what a café pays from now on.
- Take out the dead accounts. A café that has not ordered in six months is a lead, not a client. During the 30-day trial there is no client limit, but on a plan the whole import is refused if it would take you over the plan's limit.
- Import the file. Under Clients, use Import an order-history CSV. A file up to 25 MB goes in one go, and the summary says how many orders came in, how many clients were created and how many duplicates were skipped.
- Add your products under Products, Items: each coffee once, with its bag sizes.
- Build the prices as catalogs under Products, Catalogs. Make one catalog for each price group the app had, attach it to the cafés in that group, and give a café its own price on the rows where it differs. Check five cafés against their last invoice.
If your Shopify store already has a custom app made before 2026, with an access token that starts shpat_, you can connect it instead of using a CSV. It reads your products and the orders from a Shopify B2B company or tagged wholesale, and writes nothing back to Shopify. Shopify stopped letting stores create those apps in the admin on 1 January 2026, so most stores use the CSV. What stays in Shopify and what moves out covers the split, and WooCommerce wholesale for roasters does the same for WordPress.
Telling the cafés
In Order Book each café signs in with the email address you hold for it, with no password. You do not create logins: you send the welcome letter from the client's page, with Send the letter. It goes to the café's ordering contacts, in the café's own language, with the sign-in page and the address already filled in. The client page then shows when the letter went and, where the mail provider reports it, when it was opened. If the file had an email column, every client it created already has that address as its contact.
Send a short message of your own the working day before the letter, on the channel each café already uses, so the letter does not look like phishing. Say what changes, and the date the old wholesale login stops.
Hi [name],
From [Monday 12 October] you'll order from us on a new page instead of our online shop. You'll get an email from us tomorrow: sign in with this same address, no password.
Your prices, delivery days and cutoff ([Monday 17:00] for [Wednesday]) stay exactly as they are.
The wholesale login on our shop keeps working until [Friday 30 October], then it goes. If you'd rather just message me your order, that still works too.
[Your name], [Roastery]
Ring your three or four biggest accounts instead of writing. Two minutes: an email is coming, nothing else changes, call me if it annoys you.
A three-week plan that does not risk the ordering week
The rule behind every row: the app stays on until the last order it took has been delivered. Until then a café that has not moved yet orders exactly as before, and nobody's Wednesday delivery depends on the move.
| When | What you do | Where cafés order |
|---|---|---|
| Week 1, Monday | Export customers, orders and prices into one folder with today's date on it. Change nothing in the shop. | The app |
| Week 1, Tuesday | Rename the columns, fill down the blank rows, merge the cafés spelled two ways, take out the dead accounts. | The app |
| Week 1, Wednesday | Import. Add your products, then build the catalogs from the price groups. Check five cafés: last month's total in the new system against last month's invoices. | The app |
| Week 1, Friday | Message five friendly cafés, then send them the welcome letter. Turn off the auto-renewal on the app or the plugin licence. | The app, 5 cafés told |
| Week 2, Monday to Wednesday | Those five order in Order Book. Build the roast plan from both places at the cutoff and compare them line by line. | 5 in Order Book |
| Week 2, Friday | Fix what the cycle found. Send wave two: half of what is left, biggest accounts included. | About half |
| Week 3, Friday | Send the rest. Any café still ordering through the shop gets a phone call, not a second letter. | Everyone |
| After the last delivery | The last order the app took has been delivered. Now remove the app and what it left behind, and point the old wholesale page at the new sign-in. | Everyone |
One person owns the move from start to finish. They decide the client names, when a wave goes, and they are who a confused café reaches. If you run your own spreadsheet beside the app as well, moving wholesale off spreadsheets covers that half, with the same principle.
Removing what the app leaves behind
Uninstalling removes the app, but not always what it added to your shop. Shopify's own help says some apps add code to the theme that is not removed automatically when the app is uninstalled. On WordPress, deactivating a plugin removes no settings or tables, and deleting it removes them only if the plugin was written to. So budget an hour for this, after the last delivery.
On Shopify
- Ask first. The app's listing or its developer can tell you whether it needs extra uninstall steps. In the admin it is under Settings, Apps, Get support.
- Duplicate the live theme (Online Store, the three dots, Duplicate) and do the cleaning in the copy.
- Check App embeds in the theme editor. An app built on theme app extensions does not edit theme code, and its embed goes with it.
- Look in the code of the copy for files under
snippets/named after the app, and forrenderorincludetags that call them inlayout/theme.liquidand in the cart and product templates. Remove the tag and the snippet together, then preview. - Check your other themes. An older theme you kept as a backup carries the same code, and publishing it one day brings the problem back.
- Remove the wholesale pages the app created: a locked page, a wholesale order form, a sign-up page. Under Navigation, URL Redirects, send the old wholesale address to a short page that links to your cafés' new sign-in.
- Keep the customers. They may still buy retail. Remove the wholesale tag if nothing else uses it.
- Check the next Shopify bill for a charge from the app, and raise it with Shopify if one is there.
On WooCommerce
- Take a full backup of the files and the database.
- Deactivate, then delete the plugin under Plugins. Delete it rather than leaving it deactivated: an inactive plugin still sits on the server and still needs updates.
- Move the cafés' user role back. Many wholesale plugins add a role such as "wholesale customer". Under Users, move those accounts back to Customer, so nobody is left with a role that no longer does anything, then remove the role if it is still there.
- Clear every cache: the caching plugin, the host's cache and the CDN. Until you do, the shop can keep showing wholesale prices or a wholesale page that no longer exists.
- Check the leftovers the plugin's uninstall did not remove, its settings and tables, only with the backup in hand or with the vendor's instructions.
- Turn off the licence renewal in your account on the vendor's site, if you did not do it in week one.
- Test as a stranger and as a café: retail prices logged out, retail prices logged in, and the old wholesale address redirecting.
What usually goes wrong
- Uninstalling first. The wholesale prices go with the app, and the cafés who have not moved see retail prices that week.
- Losing the second line of every order to the blank rows in a Shopify export.
- A semicolon file, refused for want of a date and a client column that were there all along.
- The old login left up. A café that has bookmarked it orders at retail prices, or cannot order at all, and you find out on delivery day.
- The renewal that went through in week two because nobody turned it off.
What "done" looks like
- Every live café exists once, under one name, with the address it signs in with.
- Every price group in the app is a catalog, and five cafés match their last invoice.
- Every café has had the welcome letter, and the client page shows it.
- The last order the app took has been delivered.
- The app is uninstalled or the plugin deleted, the theme or the cache is clean, and the renewal is off.
- The old wholesale address redirects to the new sign-in.
Questions roasters ask
- How long does it take to leave a Shopify or WooCommerce wholesale app?
- Three weeks for a roastery with 15 to 40 accounts: a week to export, rename and check the data, a week with five friendly cafés ordering in the new place, and a third week for everyone else. The app comes out at the end of the third week, after the last order it took has been delivered. The exception is a plugin that has been closed for a security issue, which you switch off on the first day.
- Can I bring my wholesale prices across in the CSV?
- Not as prices. The order-history CSV in Order Book brings clients and their past orders, and the unit_price column only records what each past line cost. Prices are set in the app as catalogs, one per kind of client, with a client's own price on the rows where it differs. Copy your app's price groups into catalogs by hand; for most roasteries that is under an hour.
- Does Order Book import from WooCommerce?
- There is no WooCommerce connection. The CSV import reads any file that has a date column and a client column, so an export from WooCommerce works once those two headers are renamed. A WooCommerce Analytics orders download has one row per order, so it brings totals rather than lines.
- Do my cafés need a new password?
- No. Each café signs in to Order Book with the email address you already hold for it, and there is no password to set or forget. You send each café a welcome letter from the app when you are ready for it to start.
- Can I keep Shopify or WooCommerce for my retail shop?
- Yes, and most roasters do. The shop keeps selling bags to the public. Only the wholesale part moves, and once it has, the wholesale app is the only thing you remove.
- What if my plugin was closed on wordpress.org?
- Deactivate it now rather than at the end of the move. A plugin closed for a security issue gets no fixes, and keeping it active is the larger risk. For the days in between, take wholesale orders by phone or message and enter them yourself.
Where Order Book fits
Order Book installs nothing on your shop: no theme code, nothing in the checkout, and nothing to uninstall if you leave it later. Each café has its own account, so it sees its own prices, with no customer tags involved. Every plan has every feature, including a price per café, priced by the number of clients at €49, €149 or €249 a month, with no cap on orders and no fee per order. An admin can download everything the roastery holds as one file at any time, and the orders also export as a CSV.
What it does not do, so you can plan around it: it does not take payments, issue invoices, print carrier labels or place repeat orders by itself. You keep invoicing from your own software and attach the PDF to the order.
Start free for 30 days, no card, or see what it costs.
Shopify, WooCommerce, WordPress and plugin details are taken from their public help pages and the wordpress.org plugin directory as of 8 October 2026, and may have changed. If something here is out of date, write to [email protected] and it will be corrected.