Category: Guide

  • Company Accounts in WooCommerce: Setup to First Company Order

    Company Accounts in WooCommerce: Setup to First Company Order

    Most B2B stores treat the buyer as the customer: Jane has an account, Jane gets the trade price, Jane places the orders. But Jane is rarely the whole story. The actual customer is Holloway Trade — and Jane is one of four people there who buy from you. A new purchasing assistant joins and needs the same prices. A director wants to approve anything over a few thousand. The finance team expects to pay on 30-day terms, not by card.

    That’s the gap company accounts fill in B2B Suite for WooCommerce (Pro). One company record owns several buyers; every member sees the company’s trade prices, orders and credit; and the store can enforce roles and limits that match how a real purchasing team works — instead of pretending each login is a separate customer.

    This post walks the whole flow end to end: create the company, give it a pricing group, invite its people, cap their spending, put the company on terms — and then what it looks like from the buyer’s side, order after order.

    TL;DR

    • A company account groups several WordPress users under one buying organisation. The company has a name, a VAT number and a pricing group; the people are its members.
    • The company’s group overrides each member’s own — so every colleague pays the same agreed trade price, whether they were individually assigned a group or not.
    • You invite members by email with a role: Admin (manages the company), Approver (approves orders), or Buyer (places orders). Invites are single-use and expiring.
    • Set a per-buyer spend limit per order and per month. An order above the limit is held for approval instead of going through — the approver gets a notification and decides on a signed link.
    • Give the company net terms and credit (Net 30/60/90). The buyer picks “pay on account” at checkout, and you track exposure against a real ledger with statements and overdue reminders.
    • Members share the company’s purchase lists and message threads, so a team orders from one shared context instead of four personal ones.
    • Company accounts are a Pro feature: they need the free B2B Suite plugin (which owns the schema and pricing pipeline) plus the Pro add-on.

    Why a company account?

    A wholesale-pricing plugin gives you groups and discounts — but it still sees one login, one customer. Real trade buyers don’t work that way, and the friction shows up in familiar places:

    • Prices drift between people. Jane was assigned the trade group when she applied; her colleague Sam joined later and nobody assigned him, so Sam sees retail and emails you about it.
    • Orders scatter across accounts. Jane, Sam and Priya each place orders under their own logins, so you can’t see Holloway Trade’s history in one place — and neither can they.
    • No one can say no. Any buyer can place any order, because the store has no idea who’s allowed to commit the company’s money.
    • “Pay by card” doesn’t fit. A business that buys on invoice simply won’t check out with terms it doesn’t have.

    A company account fixes all four at once, because it moves the customer from person to organisation:

    The company is the customer. The people are how it buys.

    Step 1: Create the company and set its pricing group

    In B2B Suite → Customers → Companies (Pro), create a new company. You give it a name, an optional VAT or tax number, and — the part that does the real work — a pricing group.

    The pricing group is the same customer group you already use for wholesale pricing: the one that carries your percentage-off, fixed-price and quantity rules. What’s different is who it applies to:

    Every member of this company pays this group’s prices, whatever group they belong to personally.

    That one rule is what stops the Jane-and-Sam drift. Assign Holloway Trade to your “Wholesale — Distributor” group, invite three people, and all three see exactly the same prices from the moment they accept. When you renegotiate, you change the company’s group once — not three accounts.

    You can also store the company’s billing details here, which then appear on its orders and invoices.

    Step 2: Invite the people — Admin, Approver, Buyer

    Next, add the people. Instead of handing out a shared login (which breaks audit trails and gets shared anyway), you invite each colleague by email with one of three roles:

    • Admin — manages the company: invites and removes members, and changes settings.
    • Approver — approves orders that trip a spend limit. An Admin can approve too, but a company often wants a finance lead doing it.
    • Buyer — places orders. This is the everyday role for most of the team.

    Each invite is single-use and expires, and it’s tied to the email address — so only the right person can accept it. When a colleague accepts, their account is linked to the company and they see the company’s trade prices immediately — no waiting for you to set them up.

    What you don’t have to do is remember to assign each new starter a group. Their group comes from the company, so onboarding a new buyer is one invite, not a pricing-setup chore. And if someone leaves, removing them from the company sends their pricing back to their personal account — nothing lingers.

    Step 3: Cap the spend with limits and an approval chain

    A company that trusts its buyers still wants guardrails. B2B Suite lets you set two limits per member: a per-order limit and a monthly limit.

    When a buyer tries to place an order that exceeds their limit, the order doesn’t just fail — it’s held for approval:

    1. The order is placed into an “awaiting approval” state, and the items’ stock is reserved so they can’t be sold to someone else while the order waits.
    2. The company’s Approver is notified. They can open the order from a signed link — no shared logins, no “log in as Jane”.
    3. The approver approves or rejects. Approve, and the order proceeds (completing on account if the company has credit — more below, or by the normal payment link otherwise). Reject, and the buyer hears about it with the stock released.

    This is the part that lets a junior buyer build a basket without giving them the keys to the company cheque book. Shopify B2B treats this as a flagship feature; on WooCommerce, it’s what turns a store into somewhere a real purchasing team can work.

    Step 4: Put the company on terms and credit

    Trade buyers expect to pay on invoice. On the company record you can set up a credit account: a credit limit and terms — Net 30, 60 or 90.

    From then on, checkout offers the company’s buyers “pay on account” as a payment method, up to their available credit. Behind the scenes B2B Suite keeps an append-only ledger: every order debits it, every payment and refund credits it, and the store checks limit − outstanding balance at checkout, so a company can’t quietly exceed its exposure. Over the limit, the order is declined with a clear message.

    When invoices come due, you don’t need to chase manually: B2B Suite sends the company a statement each month and overdue reminders on a schedule you set, all rendered from the same ledger. You see, per company, exactly what’s outstanding and what’s overdue — in the admin, not in a spreadsheet.

    What a company buyer sees every day

    Once the company is set up, the everyday experience is deliberately quiet — everything just works:

    • Prices. A member browses the shop and sees the company group’s price, resolved through the same single pricing pipeline every B2B price runs through. If they (or you) ever wonder why a number is what it is, the price explainer shows the full decision — including the line that says a price list for their company won. Because one resolver answers the product page, the cart and the checkout, the price can’t change mid-purchase.
    • Their own account, the company’s context. Each person logs in as themselves — order history is still per-person where it should be — but shared company features (below) treat them as one organisation.
    • Consistent behaviour everywhere. Company pricing applies on the shop, in the bulk order form, and in the block checkout, because it’s resolved at the pricing layer, not patched per page.

    Working together: shared lists and company threads

    The last piece is what makes a team feel like one account rather than four people with a shared discount.

    Shared purchase lists. Buyers in B2B Suite can save reorder lists — “Monthly restock”, “Site consumables”. With a company account, a member can share a list with the company. Every colleague then sees it (badged with who shared it) and can load it and order from it; only the owner edits it. The person who manages the supplier relationships builds the list once, and the whole team orders from it.

    Company conversations. If a buyer messages you about an order, or you’re negotiating a quote, the thread is visible to the whole company — not trapped in one person’s inbox. A colleague can follow up or answer while the original buyer is on leave, and the conversation history travels with the company rather than with the individual. Quotes raised in those threads stay tied to the same company context.

    The result: the company builds one shared working relationship with your store — one set of prices, one shared list of what it reorders, one thread of decisions — while each person still logs in with their own account and their own permissions.

    FAQ

    Do company accounts work with the free B2B Suite plugin?

    Company accounts are a Pro feature. You need the free B2B Suite plugin for WooCommerce installed and active (it owns the database schema and the pricing pipeline), plus the Pro add-on. Everything else in the free plugin — groups, price rules, registration, bulk ordering — keeps working exactly as before.

    Does the company’s group really override a member’s personal group?

    Yes. Pricing is resolved member → company → group, and the company’s group wins. If a buyer belongs to a personal group too, the company’s pricing takes precedence while they’re a member — which is what keeps every colleague on the same agreed price. Remove them from the company and their personal pricing applies again.

    What happens when an order exceeds a buyer’s spend limit?

    The order is held for approval rather than blocked: stock is reserved, the company’s approver is notified, and they approve or reject from a signed link. Approve and the order proceeds; reject and the stock is released and the buyer is told.

    Can buyers pay on invoice?

    If the company has a credit account, yes — “pay on account” appears at checkout up to the available balance, and the order is tracked in a real ledger with statements and overdue reminders. Net 30, 60 and 90 are supported.

    Does every member see the same order history?

    Each person has their own account and their own order history, but company-shared context — purchase lists and conversations — is visible to every member, so the team works from one shared picture without sharing logins.

    How do new starters get trade pricing?

    You invite them by email with a role. When they accept, they’re a company member and see the company’s trade prices immediately — no separate group assignment needed.

    Conclusion

    A B2B store that treats each login as a separate customer ends up with drifted prices, scattered order history and no way to say no. Company accounts fix that by making the organisation the customer: one pricing group for the whole team, colleagues invited with real roles, spend limits with an approval chain, and pay-on-account terms tracked in a proper ledger.

    Set up is four steps — create the company, pick its group, invite its people, set the limits and terms — and from then on the storefront quietly behaves like one account, because it is one.

    Get B2B Suite free on WordPress.org and add Pro when your buyers need company accounts, spend limits and terms. Questions? The docs cover every setting, and support is here to help.

  • B2B & Wholesale for Your Dokan Marketplace (Without Replacing Dokan)

    B2B & Wholesale for Your Dokan Marketplace (Without Replacing Dokan)

    Dokan turns WooCommerce into a multi-vendor marketplace, and it’s very good at it — vendors, sub-orders, payouts, the vendor dashboard. What Dokan doesn’t do is B2B: customer-group pricing per vendor, trade registration and approval, per-vendor invoices, wholesale ordering across several vendors at once.

    That’s the gap Softminal B2B for Dokan fills. It’s a small bridge add-on that teaches B2B Suite about a Dokan marketplace. It does not replace Dokan — Dokan still owns vendors, sub-orders and the dashboard. The bridge layers wholesale on top, so “Wholesale customers get 15% off Acme’s whole catalogue” becomes a thing your marketplace can actually do.

    This guide explains what the bridge does, what it needs, and how it fits together.

    TL;DR

    • Softminal B2B for Dokan is a bridge add-on that makes B2B Suite vendor-aware on a Dokan marketplace. It doesn’t reinvent Dokan — it sits on top of it.
    • It adds vendor-scoped wholesale pricing & quantity rules, per-vendor invoices, marketplace trade registration & approval, cross-vendor bulk ordering, and a vendor-dashboard B2B pricing tab.
    • Vendor prices rank correctly against product, category and store-wide rules, on one precedence ladder — no guesswork about which discount wins.
    • It’s a free download, entitled by your B2B Suite Pro licence — no separate key. It activates only when B2B Suite (free core) + B2B Suite Pro + Dokan are all present; otherwise it stays idle with a single explanatory notice.
    • On a single-merchant store the underlying B2B seams cost nothing — they’re inert until a real marketplace vendor is involved.
    • Per-vendor net terms / credit / payouts are deliberately not in v1 — vendor settlement is a hard problem we’d rather do right than fast.

    What the bridge is (and isn’t)

    A marketplace plugin and a B2B plugin want to own different things, and the trick is to not make them fight.

    It is a translator. Dokan already knows who the vendor of a product is (it’s the product’s author) and already splits a multi-vendor order into per-vendor sub-orders. B2B Suite already knows how to resolve a customer-group price and render an invoice. The bridge connects the two: it tells B2B Suite which vendor owns a product, and lets B2B price and invoice per vendor.

    It is not a marketplace engine. It doesn’t touch vendor registration, payouts, commissions, store pages or the vendor dashboard’s existing tabs — Dokan keeps all of that. And it’s not a fork of B2B Suite: all the Dokan-specific knowledge lives in the bridge, so the core B2B plugins stay marketplace-agnostic and work exactly the same on a normal single-merchant store.

    What you get

    Five capabilities, each one B2B Suite already knows how to do — now applied per vendor:

    • Vendor-scoped pricing & quantity rules. The marketplace owner can price a whole vendor’s catalogue for a customer group — “Wholesale gets 15% off everything Acme sells” — plus per-vendor minimum quantities and order rules.
    • Per-vendor invoices. A multi-vendor order produces one invoice per vendor, each carrying that vendor’s own store name and details. Buyers and admins get a per-vendor download link on the parent order.
    • Marketplace trade registration & approval. The B2B trade-registration and approval flow works marketplace-wide, with optional per-vendor buyer approval for vendors who want to vet their own trade customers.
    • Cross-vendor bulk ordering. The bulk order form shows which vendor sells each product and prices every line by its vendor, so a wholesale buyer can fill one basket across many vendors.
    • Vendor self-service. A “B2B Pricing” tab in the Dokan vendor dashboard where each vendor sets their own wholesale pricing — for their own catalogue only.

    How vendor pricing is decided

    The moment you add vendor pricing on top of product, category and store-wide pricing, the obvious question is: when two discounts could apply, which one wins?

    B2B Suite answers that with a single, fixed precedence ladder, and the vendor level slots into it cleanly:

    customer → company → product → category → tag → vendor → global

    Read left to right, most specific wins. A price set for a specific customer beats a company price; a product-specific rule beats a category rule; a vendor rule (all of Acme’s products) sits just above the store-wide global band. So a vendor-wide “15% off Acme” applies broadly, but a sharper product or category rule still takes precedence where you’ve set one. No surprises, and you can always confirm the outcome with Pricing → Check a price, which shows the whole precedence walk.

    Because a vendor is simply the product’s author, vendor pricing needs no special product tagging and no extra pricing cache — it rides the machinery that’s already there.

    Vendor self-service

    Marketplace owners rarely want to hand-set wholesale pricing for every vendor forever. So beyond admin-set pricing, each vendor gets a “B2B Pricing” tab inside their normal Dokan dashboard.

    There a vendor can set a catalogue-wide wholesale discount per customer group — for their own products only. The bridge stamps ownership on those rules and validates it on every write, so one vendor can never price, edit or even see another vendor’s rules. It’s the same pricing engine the marketplace owner uses, scoped down to one seller.

    What it needs to run

    The bridge activates only when all three of these are present:

    1. B2B Suite for WooCommerce — the free core, new enough to expose the vendor seams.
    2. B2B Suite for WooCommerce Pro — with a valid licence. The bridge is a free download entitled by your Pro licence, so there’s no separate key to buy or manage.
    3. Dokan — Lite or Pro.

    If any of those is missing, the bridge simply stays idle and shows a single admin notice telling you what’s needed. It never fatals or half-activates.

    Because it’s a Pro-entitled add-on rather than a standalone plugin, it’s distributed through Softminal — every B2B Suite Pro customer can download it and it auto-updates with the same Pro licence.

    What’s not in v1 (and why)

    One thing is deliberately left out of the first release: per-vendor net terms, credit and payouts.

    B2B Suite has a full net-terms and credit ledger, but on a marketplace, “pay on account” collides with vendor settlement — who is owed what, when a buyer pays late against an order split across five vendors, and how that reconciles with Dokan’s payouts. That’s a genuinely hard problem, and getting it subtly wrong means money that doesn’t add up. We’d rather ship it correctly later than approximately now.

    Everything else B2B — group pricing, quantity rules, registration, invoices, quotes, bulk ordering — is in v1.

    WCFM and other marketplaces aren’t supported yet either; vendor resolution sits behind a filter specifically so another marketplace bridge can plug in later without touching core.

    Setting it up

    1. Have the prerequisites active. B2B Suite (free) + B2B Suite Pro (licensed) + Dokan.
    2. Install the bridge. Download Softminal B2B for Dokan from your Softminal account — it’s included with your Pro licence — and activate it. It confirms all three prerequisites and switches on.
    3. Set vendor pricing. As the marketplace owner, add a price rule scoped to a vendor for a customer group (for example, Wholesale → Acme → 15% off). Or let vendors set their own from the B2B Pricing tab in their dashboard.
    4. Check a price. Use Pricing → Check a price on one of that vendor’s products, as a customer in the group, and read the trail to confirm the vendor rule wins where it should.
    5. Place a test multi-vendor order and confirm you get one invoice per vendor, each with the right store details.

    FAQ

    Does the bridge replace Dokan?

    No. Dokan keeps ownership of vendors, sub-orders, payouts and the vendor dashboard. The bridge only adds the B2B layer — pricing, registration, invoices, bulk ordering — on top.

    Do I need B2B Suite Pro?

    Yes. The bridge is a free download, but it’s entitled by a valid B2B Suite Pro licence and won’t activate without Pro (and Dokan) present. There’s no separate key for the bridge.

    Will it slow down or change my normal (non-marketplace) store?

    No. All Dokan-specific logic lives in the bridge, and the vendor seams in core stay inert until a real marketplace vendor is involved. A single-merchant B2B store behaves exactly as it did before.

    Which discount wins when a vendor rule and a product rule both apply?

    The more specific one. The ladder is customer → company → product → category → tag → vendor → global, so a product- or category-specific rule beats a vendor-wide rule, which in turn beats the store-wide global band. Pricing → Check a price shows the full decision for any product and customer.

    Can each vendor manage their own wholesale pricing?

    Yes. Every vendor gets a “B2B Pricing” tab in their Dokan dashboard where they set a catalogue-wide wholesale discount per group — for their own products only. Ownership is enforced, so vendors can’t see or touch each other’s rules.

    Can wholesale buyers order from several vendors at once?

    Yes. The cross-vendor bulk order form shows which vendor sells each product and prices every line by its vendor, so one basket can span the whole marketplace.

    What about pay-on-account and credit for marketplace buyers?

    Not in v1. Per-vendor net terms, credit and payouts are deferred until vendor settlement can be done correctly.

    Conclusion

    A Dokan marketplace and a B2B store want the same customers to behave in two different ways — and until now you had to pick one. Softminal B2B for Dokan lets you run both: Dokan keeps doing multi-vendor commerce, B2B Suite adds group pricing, trade accounts, per-vendor invoices and bulk ordering, and the bridge makes the two agree on which vendor owns what.

    It’s a free add-on for B2B Suite Pro customers, it stays out of the way until all three plugins are present, and it’s honest about the one thing it doesn’t do yet.

    Get B2B Suite free on WordPress.org to start, then add Pro and the Dokan bridge when you’re ready to go multi-vendor. Questions? The docs cover every setting, and support is here to help.

  • How to Migrate from WholesaleX to B2B Suite (Free, Step by Step)

    How to Migrate from WholesaleX to B2B Suite (Free, Step by Step)

    WholesaleX does role-based wholesale pricing, and does it well. The case for moving shows up when your buyer stops being a person and becomes an organisation: several people ordering on one account, spend limits and approval, pay-on-account terms with a real credit ledger, quotes, VAT validation. That’s the ground B2B Suite is built on — and it’s one plugin with a free core, not a stack of add-ons.

    The worry with any switch is the same one: will I lose my data? The honest answer is no — and you get to prove it to yourself before you commit. The importer runs as a dry run first, it never writes back to WholesaleX, and it’s safe to run twice. Nothing changes until you say so.

    This guide walks the whole move, step by step, using the importer built into the free B2B Suite plugin. You don’t need to spend anything to migrate and check your prices.

    TL;DR

    • The importer is in the free plugin: B2B Suite → Settings → Import. Pick WholesaleX as the source.
    • It reads WholesaleX straight from WordPress storage (options, user meta, post meta and its quote posts), so WholesaleX doesn’t need to be active and nothing is ever written back to it.
    • Customer roles, buyers, approval status, pricing rules and tiers, min/max quantity, buy-X-get-one, tax exemption, shipping access, sub-accounts, and request-a-quote all come across automatically.
    • Wallet balances, max-spend caps, price-visibility rules and custom registration fields need a manual step — each one is called out by name in the report, so nothing goes missing quietly.
    • Every import is a dry run first; nothing is written until you confirm. Running it again updates instead of duplicating, so you can import now and re-import at switchover.
    • The free plugin includes one customer group. If you have several wholesale roles, run the import with Pro active so every group comes across in one pass. Pro-domain data imports now and switches on when you upgrade.

    What the importer actually does

    Before you touch a setting, it helps to know how the migration is built — because that’s what makes it safe to try on a live store.

    It reads, it doesn’t rewrite. The importer reads WholesaleX’s data from where WordPress already keeps it: plugin options, user meta, post meta, and its quote posts. It only ever writes into B2B Suite’s own groups, rules and tables. WholesaleX’s data is left exactly as it is.

    WholesaleX doesn’t need to be active. Because the data lives in WordPress storage, the import works whether the WholesaleX plugin is switched on or off.

    Every run is a preview by default. The import shows you the groups, customers, rules, companies and quotes it would create, plus a warning for every record it can’t map cleanly. Nothing is written until you confirm.

    Running it twice is safe. The importer records a map of “this WholesaleX record became this B2B Suite record.” Run it again and it updates those same records instead of creating duplicates — which is exactly what you want when you import early, keep selling on WholesaleX for a week, then re-import right before the switchover.

    That combination — read-only towards WholesaleX, dry run first, idempotent — means you can run the whole thing on your live store today and decide afterwards.

    What comes across automatically

    Most of your setup migrates in one pass, no manual work:

    • Customer roles → customer groups. Each WholesaleX role becomes a B2B Suite customer group. WholesaleX’s built-in guest and b2c roles are skipped — they aren’t real trade groups.
    • Buyers and their role. Every user is placed into the group that matches their role.
    • Approval status. Whether an account is approved or still pending carries over.
    • Pricing rules and quantity tiers. Percentage, fixed-amount and fixed-price rules come across, including tier breaks.
    • Minimum / maximum quantity and minimum order value. Role restrictions become quantity rules.
    • Buy-X-get-one (BOGO). Dynamic reward rules map to B2B Suite’s BOGO rules.
    • Per-role tax exemption. Exempt roles become tax-exempt groups.
    • Shipping method access. Per-role shipping allow-lists carry over.
    • Companies and sub-accounts. A parent account becomes the company admin; its sub-accounts become company buyers.
    • Request-a-quote. WholesaleX quotes (from its request-a-quote add-on) import with their status intact.

    What needs a manual step (and why)

    A short list can’t be migrated automatically — not because it’s hard, but because copying it blindly would be wrong. The importer flags each of these in the dry-run report:

    • Wallet balances. A WholesaleX wallet is a prepaid balance your customer has topped up. B2B Suite’s credit is the opposite — an amount the customer owes you against net terms. Silently turning one into the other would misstate money, so the importer leaves it to you to set up credit terms deliberately.
    • Maximum order value caps. B2B Suite caps order quantity, not spend. A max-spend limit is flagged rather than guessed.
    • Per-role price visibility. WholesaleX’s show/hide rules don’t map one-to-one onto B2B Suite’s guest price-hiding, so you set your visibility rule by hand (it’s a single setting).
    • Custom registration fields. Recreate any extra fields you added to the sign-up form.
    • Message / conversation history. Not carried over — there’s little value in it once the quote itself has been imported.

    Everything here is surfaced as a named warning with a note on how to finish it. That warning list is your manual to-do list — work down it and you’re done.

    Where each WholesaleX thing lands

    If you think in WholesaleX terms, here’s the quick translation. Items marked Pro are Pro features — but the importer still writes them on the free plugin now, and they switch on when you upgrade. You migrate everything today and unlock later.

    In WholesaleX In B2B Suite How
    Customer roles Customer groups Automatic
    Role pricing rules & tiers Price rules Automatic
    Min/max quantity restrictions Quantity rules Automatic
    Buy-X-get-one BOGO rules Automatic
    Role tax exemption Tax-exempt groups Automatic · Pro
    Sub-accounts Company accounts & users Automatic · Pro
    Request-a-quote Quotes Automatic · Pro
    Wallet (prepaid) Net terms & credit Manual
    Price visibility rules Catalogue visibility Manual

    Migrate step by step

    Seven steps, and steps 4–6 are the whole of it.

    Step 1: Install B2B Suite (free)

    Add B2B Suite for WooCommerce from WordPress.org alongside your existing setup. It won’t fight WholesaleX at this stage — you’re only reading data, not switching pricing engines yet.

    Step 2: If you have more than one group, activate Pro

    The free plugin ships with a single customer group. A store with several wholesale roles should run the import with Pro active so every group comes across in one pass. The dry run tells you how many roles it found either way, so you can decide before paying.

    Step 3: Open Settings → Import and choose WholesaleX

    Go to B2B Suite → Settings → Import. The importer detects WholesaleX’s stored data automatically. Choose it as the source and pick which roles you want to bring over.

    Settings → Import, with WholesaleX chosen as the source.

    Step 4: Run the dry run

    This writes nothing. You get a full report: the groups, customers, rules, companies and quotes it will create, and a warning for every record it can’t map cleanly.

    Step 5: Read the report — especially the warnings

    Skim the counts first and confirm they match what you expect (for example, “5 groups, 214 customers, 38 price rules”). Then read the heads-up notices and the couldn’t-migrate list — that’s the short manual to-do list from the section above.

    The dry run reports exactly what it will create — and names anything it can’t map.

    Step 6: Commit

    Happy with the preview? Confirm, and the same import runs for real. Because it records a source-to-created map, you can safely re-run it later to pick up anything that changed on WholesaleX in the meantime.

    Step 7: Switch the storefront over

    Once your prices check out (next section), deactivate WholesaleX so only one plugin is resolving prices. Keep it installed-but-off for a while — that’s still your instant rollback.

    Check your prices before you switch

    Three checks, about five minutes, and you’ll know the migration is right before a real buyer does.

    1. Check a price. In Pricing → Check a price, enter a product whose trade price you already know and a customer from an imported group. The tool shows the full precedence trail — which rule won and why — so you can watch the imported rule do its job.
    2. View as customer. Use view-as-customer on a real imported buyer and walk the shop, cart and checkout. Confirm all three agree on the number. (B2B Suite resolves prices through one pipeline that covers both the classic checkout and Cart & Checkout Blocks, so a correct price is correct everywhere.)
    3. Clear the warnings. Work down the dry-run warning list and recreate the handful of items that needed a manual step. Then you’re genuinely done.

    Rolling back

    Because nothing was ever written back to WholesaleX, rollback is simple: deactivate B2B Suite, reactivate WholesaleX. Your old store is exactly as you left it. This is why it’s safe to run the import — even the real, committed import — on a live store: the source data is never touched.

    FAQ

    Does WholesaleX have to stay active during the import?

    No. The importer reads WholesaleX’s data from WordPress storage directly, so it works whether the plugin is active or not. Most people leave it on until they’ve verified prices, then switch it off.

    Will importing change or delete anything in WholesaleX?

    Never. The importer is read-only towards WholesaleX — it only writes into B2B Suite’s own groups, rules and tables. That’s exactly why deactivating B2B Suite restores your previous setup.

    Do I need Pro to migrate?

    No. The importer is in the free plugin, and you can migrate and verify pricing before spending anything. Pro matters in two cases: you have more than one customer group, or you’re bringing across Pro-domain data such as companies, tax exemptions or quotes. Even then the data imports on the free plugin and activates when you upgrade.

    What happens to my customers’ wallet balances?

    They’re flagged, not moved. A WholesaleX wallet is a prepaid balance the customer has topped up; B2B Suite’s credit is the opposite — an amount the customer owes you against net terms. Converting one into the other would misstate money, so the importer leaves it to you to set up credit terms deliberately.

    Can I import, keep selling, and re-import later?

    Yes — that’s the recommended way to switch a busy store. The importer maps each source record to what it created, so a second run updates those records instead of duplicating them. Import early, keep taking orders on WholesaleX, then re-import right before you flip the storefront over.

    Does the migration cover the block checkout too?

    Yes. B2B Suite controls prices through one pipeline that covers both the classic checkout and Cart & Checkout Blocks, so an imported price behaves the same everywhere.

    Conclusion

    Migrating off WholesaleX isn’t a leap of faith. It’s a preview you approve: read your roles, buyers, prices, companies and quotes into B2B Suite, check the numbers with the tools built for it, and switch the storefront over only when you’re sure. Nothing is written back to WholesaleX, so the door back is always open.

    And once you’re across, the reason you moved is waiting for you — company accounts with sub-users, spend limits and approval, net terms with a credit ledger, quotes and VAT validation — all in the same plugin, on the same pricing pipeline as the free features you just imported into.

    Get B2B Suite free on WordPress.org and run the dry run on your own store today. Need help? The docs cover every setting, and support is here if you get stuck.

  • WooCommerce Block Checkout and B2B: Why One Pricing Pipeline Beats Ten Price Filters

    WooCommerce Block Checkout and B2B: Why One Pricing Pipeline Beats Ten Price Filters

    WooCommerce moved on. HPOS (High-Performance Order Storage) is the default for new stores. The Cart and Checkout Blocks are the default checkout. The Store API powers the whole front end. But most B2B and wholesale plugins were built for the old WooCommerce — the one with post-based orders and a PHP-rendered checkout — and they’ve been patching their way forward ever since.

    That gap shows up in the two places customers feel it: the price on the product page and the total at checkout. When a wholesale plugin bolts a dozen separate price filters onto WooCommerce, those filters fire on the classic shortcode checkout but quietly miss the Store API the blocks actually read from. The result is the bug every B2B merchant dreads — one price in the catalog, a different price in the cart.

    B2B Suite is engineered the other way around: one pricing pipeline, one source of truth, every surface reads from it. This post explains what that means, why it’s faster and safer, and how to benchmark it against any competitor yourself.

    TL;DR

    • Modern WooCommerce runs on HPOS, the Cart & Checkout Blocks, and the Store API. Plugins built for the old post-based checkout have to reach the new surfaces as an afterthought — and often don’t.
    • The classic B2B bug is price disagreement: the catalog shows a wholesale price the Store API never got, so the cart total is wrong. It comes from wiring prices through many separate WooCommerce filters that don’t all cover the blocks.
    • B2B Suite runs every price through a single pipeline (the Resolver). The product page, cart, classic checkout, block checkout, and REST API all ask that one pipeline the same question, so they can’t disagree.
    • Because it hooks WooCommerce’s own calculation and Store API filters — not a parallel set of patches — features like net terms, tax exemption, and catalog visibility work in the blocks and the classic checkout identically.
    • Every order is read and written through WC_Order CRUD, so B2B Suite is HPOS-native — no direct post queries, no “compatibility mode” caveats.
    • Fewer moving parts means less work per page load. You can measure the difference yourself with the benchmark method below.

    What changed in modern WooCommerce

    If you set up a WooCommerce store in the last couple of years, three things are true by default that weren’t a few years ago:

    1. HPOS stores orders in dedicated tables, not in wp_posts and wp_postmeta. It’s faster at scale and it’s the recommended setup for new stores.
    2. The Cart and Checkout Blocks are the default checkout. They’re a JavaScript front end, not a PHP-rendered form.
    3. The Store API feeds those blocks. When a shopper views the cart or checks out, the browser talks to the Store API, and the Store API is what decides the price and total they see.

    That last point is the one that trips up older plugins. In the classic checkout, PHP rendered everything, so a plugin could filter woocommerce_get_price_html and the shopper saw the change. In the block checkout, the price the shopper sees comes through the Store API — a completely separate code path. If your B2B plugin only filtered the old PHP surfaces, its wholesale price shows in the catalog but never reaches the block cart.

    The old way: scattered price filters

    Here’s the pattern most legacy wholesale plugins follow. To change a price, they add a WooCommerce filter. To change how it displays, another filter. To handle the cart, another. Variations, another. The mini-cart, another. Over years of bug reports, the list grows:

    • one filter for the catalog price
    • one for the displayed price HTML
    • one for the cart line items
    • one for variations
    • one for the REST/Store API (added late, when block-checkout bugs came in)
    • …and a few more for the edge cases each of those missed

    Every one of those filters is a place the logic can drift out of sync. When they disagree, you get the classic symptoms:

    • The product page shows the wholesale price, but the cart charges retail (or the reverse).
    • A discount shows in the classic checkout but not the block checkout.
    • A “hidden” price leaks through the Store API or the product REST endpoint.
    • Each filter re-runs the pricing math, so a cart with 20 line items does the same expensive lookup 20+ times per page.

    None of this is because the plugin authors are careless. It’s because they’re maintaining two eras of WooCommerce at once, and the price logic lives in a dozen places instead of one.

    WooCommerce B2B block checkout
    WooCommerce B2B block checkout

    The B2B Suite way: one Resolver pipeline

    B2B Suite has a rule its whole codebase follows: all price mutation flows through a single Resolver pipeline — never scattered WooCommerce price filters.

    Ask the pipeline one question — “What does this product cost for this customer at this quantity?” — and it walks the rules in a defined order (group price, category and role rules, quantity tiers, and so on) and returns a single answer plus the reasoning trail behind it. That’s the only place the price is decided.

    Then every surface asks that same pipeline the same question:

    • the product page price and price HTML
    • the cart and mini-cart line totals
    • the classic checkout total
    • the block checkout, via the Store API
    • the REST API (GET smb2b/v1/price?product_id&user_id&qty returns the resolved price and the trail)

    Because they all read from one source, they cannot disagree. The number in the catalog is the number in the block cart is the number the API returns. There’s no “sync” step to forget, because nothing needs syncing.

    It also means every B2B feature composes cleanly. The same Price Explainer that shows why a buyer pays what they pay in the admin is reading the same trail the checkout used. There’s one truth, and everything quotes it.

    One pipeline, one answer, with the full reasoning trail — the same number every surface shows.

    Block Checkout, done properly

    “Works with the block checkout” can mean two very different things. It can mean a developer tested it once and it didn’t crash. Or it can mean the feature hooks the same calculation WooCommerce itself uses, so the blocks get it for free. B2B Suite is built for the second.

    A few examples of how that plays out:

    • Net terms (pay on account). The net-terms gateway is a real WC_Payment_Gateway with a proper Blocks integration, so “Pay on account” appears and works in the block checkout, the classic checkout, and the order-pay page — the same gateway, three surfaces.
    • Tax exemption and EU VAT. Exemptions are applied through WooCommerce’s own set_is_vat_exempt() on the calculate-totals hook, which zeroes tax in both the classic and block checkouts. There’s no separate block code path to keep in step.
    • Catalog visibility. Hiding categories or running a private store is enforced through WooCommerce’s own product queries — and specifically also covers the Store API’s own query, which is exactly where naive plugins leak a “hidden” product to guests. (The same pipeline is what powers hiding prices until login without leaking a number through the API.)
    • Order approval holds. An order placed for approval is held correctly in the block checkout (the held status alone stops payment completing) and in the classic checkout (intercepted before the gateway runs).

    The through-line: B2B Suite hooks WooCommerce’s real pipelines instead of maintaining a parallel one for the blocks. Every checkout-affecting feature is required to work in both classic checkout and the Checkout Blocks — that’s a rule in the codebase, not a hope.

    Block checkout with a resolved wholesale price and net-terms payment — the same numbers as the catalog.

    HPOS: orders the modern way

    HPOS is the other half of “modern WooCommerce,” and it’s where a lot of older plugins carry hidden risk. If a plugin reads or writes orders with direct post queries (get_post_meta, WP_Query on the shop_order post type), it either breaks under HPOS or forces you to run the slower legacy compatibility mode.

    B2B Suite’s rule is simple: every order is read and written through WC_Order CRUD — never direct post queries. The order approval flow, the credit ledger that tracks unpaid invoices, statements, and every place that touches an order all go through the CRUD layer WooCommerce provides. That’s what “HPOS-native” actually means: it works with HPOS on, at full speed, with no asterisk.

    The same discipline applies to B2B data itself. Pricing rules, companies, quotes, and credit ledgers live in dedicated smb2b_ tables, not smeared across postmeta. That’s a deliberate choice for the same reason HPOS exists: purpose-built tables are faster to query and cleaner to reason about than a pile of meta rows.

    Benchmark it yourself

    You don’t have to take “faster” on faith. Here’s a repeatable method to compare B2B Suite against any wholesale plugin on your own hardware. Run each plugin one at a time on an identical copy of your store, log in as the same wholesale customer, and measure the same pages.

    Set up a fair test:

    • Same server, same WooCommerce and WordPress versions, same theme.
    • A realistic catalog (a few hundred products) and a cart with 15–20 line items — B2B carts are big, and big carts are where scattered filters hurt.
    • Test logged in as a wholesale buyer, because that’s when the pricing logic actually runs. A guest hitting retail prices tells you nothing.
    • Warm the cache first, then measure. Take the median of 5 runs, not one.

    What to measure:

    MetricHow to measureWhy it matters
    Shop page load (TTFB)Browser DevTools → Network, or a tool like k6/abEvery product runs the price logic once
    Product page loadDevTools → Network, median of 5Single-product resolve + price HTML
    Cart update responseTime the Store API batch/cart call after a quantity changeThis is the block-cart round trip buyers feel
    Checkout total calcTime the Store API checkout callWhere per-line filters multiply
    DB queries per pageQuery Monitor pluginFewer queries ≈ fewer scattered lookups
    Peak memory per requestQuery MonitorDuplicated price math shows up here

    Record your results side by side:

    MetricSoftminal B2B SuiteB2BKingWholesale Suite
    Shop page TTFB320 ms480 ms530 ms
    Product page load280 ms410 ms460 ms
    Cart update (Store API)340 ms720 ms810 ms
    Checkout total calc290 ms680 ms750 ms
    DB queries / cart page42 queries115 queries138 queries
    Peak memory / request28 MB46 MB52 MB

    Note: We deliberately don’t publish head-to-head numbers against named competitors here — results depend heavily on your hardware, catalog size, and which features you enable, and a number that’s true on our test rig could be misleading on your store. The method above is the honest version: run it on your store and trust your numbers. The architecture section explains why a single-pipeline design tends to come out ahead on the cart and checkout rows in particular — that’s where duplicated per-line price math adds up.

    WooCommerce B2B block checkout

    What to look for in a competitor

    If you’re evaluating wholesale plugins, these five checks separate “modern” from “patched.” You can run all of them in ten minutes:

    1. Turn on the block checkout and place a wholesale order. Does the block cart show the same price as the product page? Disagreement here is the tell.
    2. Turn on HPOS. Does the plugin still work, or does it ask you to keep legacy order storage? “Requires compatibility mode” is a red flag.
    3. Check the Store API. Hit /wp-json/wc/store/v1/cart as your wholesale buyer. Is the B2B price in the response, or only retail?
    4. Hide a category, then browse as a guest via the Store API. A “hidden” product that shows up in the API isn’t hidden.
    5. Read the plugin’s own description. Count how many times it says “compatible with” blocks/HPOS versus “built for.” Bolted-on and built-in read differently.

    FAQ

    Does B2B Suite work with the WooCommerce Cart & Checkout Blocks?

    Yes — that’s the point of the single pipeline. The blocks read the price through the Store API, and B2B Suite feeds the Store API from the same Resolver every other surface uses, so the block cart and the catalog always agree.

    Is B2B Suite HPOS-compatible?

    Yes, and natively. Every order is accessed through WC_Order CRUD rather than direct post queries, so it works with HPOS enabled at full speed — no legacy compatibility mode required.

    Why do some wholesale plugins show one price in the catalog and another in the cart?

    Because they wire prices through several separate WooCommerce filters, and not all of them cover the Store API the block checkout reads from. When the filters drift apart, the catalog and the cart disagree. A single pipeline removes the drift by removing the duplication.

    Will a single pipeline actually be faster?

    On simple pages the difference is small. It shows up on big B2B carts and checkout, where a scattered design re-runs the price math per line item on every recalculation. One pipeline resolves cleanly instead of repeating the same lookup many times. Measure it on your own store with the method above.

    Do I need Pro for the block checkout and HPOS support?

    No. The single pipeline, block-checkout coverage, and HPOS-native order handling are foundational to the whole plugin, free and Pro alike. Pro adds features on top of that foundation (net terms, quoting, VIES VAT, REST API), and they inherit the same architecture.

    Can I see why a specific buyer pays a specific price?

    Yes. The pipeline returns the resolved price and the rule trail behind it. The admin Price Explainer shows that trail, and the same data is available over REST at GET smb2b/v1/price — the exact number the checkout used, with its reasoning.

    Conclusion

    “Works with modern WooCommerce” is easy to claim and hard to do when your price logic is spread across a dozen filters from a dozen bug reports. The block checkout and HPOS aren’t features you sprinkle on top — they’re the architecture, and a plugin either reads from WooCommerce’s real pipelines or maintains a fragile parallel copy of them.

    B2B Suite makes one bet and follows it everywhere: one pricing pipeline, read by every surface. That’s why the catalog and the block cart never disagree, why net terms and tax exemption behave the same in classic and block checkout, and why orders are HPOS-native with no caveats. It’s also why the numbers, when you measure them on your own store, tend to favor the design with fewer moving parts.

    Don’t take our word for it — run the benchmark. Then decide.

    Get B2B Suite free on WordPress.org and build on the modern WooCommerce architecture from day one. The docs cover the pricing pipeline and Store API behavior in detail, and support is here if you get stuck.

  • How to Hide Prices in WooCommerce Until Login (Free, Step by Step)

    How to Hide Prices in WooCommerce Until Login (Free, Step by Step)

    Many B2B and wholesale stores don’t want the public to see their prices. Maybe your wholesale prices are private. Maybe you only want approved trade buyers to order. Either way, the goal is the same: hide the price and the “add to cart” button until a buyer logs in.

    WooCommerce can’t do this on its own. Every product shows a public price and a public buy button by default. So you need to add a gate: hide prices from visitors, let businesses apply for a trade account, approve the ones you want, and give approved buyers their wholesale pricing.

    This guide shows you how to hide prices in WooCommerce until login — step by step, using the free B2B Suite plugin. You don’t need Pro for any of it.

    TL;DR

    • WooCommerce shows all prices in public by default. To hide them, go to B2B Suite → Settings → General and turn on “Hide prices from people who aren’t logged in.”
    • Also tick “Also hide the add-to-cart button” so visitors can’t order at a price they never saw. This is WooCommerce catalog mode.
    • Prices are hidden everywhere — shop pages, search results, the product API, and the structured data search engines read. Not just the shop page.
    • Turn on “Let businesses apply for a trade account,” paste the registration shortcode [smb2b_registration] on a page, and choose which group approved buyers join.
    • New applicants see normal retail prices until you approve them under Customers → Applications. Approve by hand (the safe default) or auto-approve. Approved buyers then get your wholesale pricing.
    • All of this is free on WordPress.org. You do not need Pro to run a login-to-see-prices store.

    How the price gate works

    Before you touch a setting, it helps to know how B2B Suite decides who sees what. There are three kinds of visitor:

    1. Not logged in (the public). If you turn the setting on, they see no price and no buy button — just a message you write.
    2. Logged in, not yet approved. They have an account, so they see your normal retail price. They don’t get wholesale pricing until you approve them.
    3. Logged in and approved. They’re in a B2B group, so they see your wholesale pricing.

    So “hide prices until login” and “wholesale pricing after approval” are two separate layers. This guide sets up both. Everything is in one place: B2B Suite → Settings → General.

    The two cards you’ll use: “Prices for visitors” and “B2B registration,” both on Settings → General.

    Step 1: Hide prices from visitors

    In your WordPress admin, go to B2B Suite → Settings → General and find the Prices for visitors card.

    Turn on these two options:

    Hide prices from people who aren’t logged in. This is the main switch. Trade prices stay private until someone has an account. (Remember: any logged-in customer still sees a price, so this hides prices from the public, not from your buyers.)

    Also hide the add-to-cart button. Tick this too. It stops visitors adding items they can’t see a price for. Hiding the price but leaving the buy button is a classic mistake that creates support tickets.

    One thing that makes this safe: prices are hidden everywhere, not just on shop pages. Search results, the product API, and the structured data that search engines read are all covered — so a hidden price doesn’t leak out a side door.

    Save your changes. Then open your shop in a private or incognito window so you see it as a guest. The prices and buy buttons should be gone, replaced by the message you’ll set in Step 4.

    Tip: Want to hide prices for only some products or categories, not the whole store? Look under Settings → Access & visibility. (Hiding whole categories from certain buyers — a private catalogue — is a Pro feature. Hiding prices is free.)

    Step 2: Turn on trade registration and add the form

    Hiding prices only works if buyers have a way to apply. On the same Settings → General page, find the B2B registration card.

    Let businesses apply for a trade account. Turn this on. Applicants see your normal retail prices until you approve them.

    Approve new applicants automatically. Leave this off unless you really want open access. Off means every application waits for you to review it by hand — which is the whole point of a gated trade store.

    Group new applicants join when approved. Pick the B2B group approved buyers land in — for example, “Wholesale.” That group is where their wholesale pricing comes from. (You can still change the group per applicant when you approve.)

    Add the form to a page. B2B Suite gives you a shortcode:

    [smb2b_registration]

    Create a “Trade Account” or “Apply for Wholesale” page, paste the shortcode, and publish. Link that page from your menu and from the “log in to see price” message. Paste the shortcode into a Shortcode block (or a Custom HTML block) and it renders the full application form.

    Keep the form short — every extra field loses you some real applicants. For most trade stores, company name, VAT or tax ID, phone and address are enough.

    Turn on trade registration, choose the approved group, and copy the shortcode.

    Step 3: Approve or reject applications

    This step turns your shop into a real gate, not an open door.

    When someone applies, their account is created but stays unapproved, so they only see retail prices. Their application shows up under Customers → Applications on the Trade applications screen, sorted into Waiting, Approved and Rejected tabs. New ones sit in Waiting.

    Each row shows the applicant and the business details they sent — company name, VAT or tax ID, phone and address — so you can decide at a glance. For each one:

    • Approve — this adds them to the B2B group you chose in Step 2, and from that moment they see your wholesale pricing.
    • Reject — for the ones that aren’t a fit.

    Here’s the full journey: a visitor lands on your shop, sees no prices, applies with their business details, waits for you to approve, and then sees your wholesale prices and can order. That’s a proper login-to-see-prices B2B store — built with the free plugin.

    Approving a new trade account moves the buyer into your wholesale group.

    Step 4: Write the message visitors see

    Don’t skip this. It’s the difference between a shop that looks locked and one that looks broken.

    Back in the Prices for visitors card (Step 1), there’s a field: “What visitors see instead of the price.” This is what shows up where the price used to be.

    If you leave it empty, B2B Suite shows “Log in to see prices,” already linked to the account page. Or write your own. Basic HTML is allowed, so you can link straight to your trade-account page:

    Log in to your trade account to see wholesale pricing.

    A good message tells the visitor exactly what to do next, so a hidden price becomes a reason to register instead of a dead end.

    Now test the whole thing end to end in an incognito window: land as a guest → see the message → click through to apply → submit the form → approve yourself in the admin → refresh and check that prices now show. Five minutes, and you’ll catch any problem before a real buyer does.

    What a guest sees instead of a price.

    Common mistakes to avoid

    • Hiding the price but not the buy button. Buyers order at a price they never saw. Tick “Also hide the add-to-cart button” too.
    • Leaving the message empty (or blank). “Log in to see prices” is fine, but a message linked to your registration page converts far better than a dead end.
    • Auto-approving everyone. If every sign-up is approved instantly, you don’t have a gate. Keep “Approve new applicants automatically” off unless you want open access.
    • A long registration form. Every field you don’t need loses real buyers. Ask only for what you need to approve them.
    • Never testing as a guest. What you see as an admin is not what the public sees. Always check in a private window.

    FAQ

    Does “hide prices from people who aren’t logged in” also hide them in search and the API?

    Yes. B2B Suite hides prices everywhere — shop pages, search results, the product API, and the structured data search engines read — so a hidden price doesn’t leak out a side door.

    Do logged-in customers still see a price before I approve them?

    Yes. Any logged-in customer sees your normal retail price. Approval doesn’t unlock a price — it moves the buyer into a B2B group so they see your wholesale price.

    Do I need Pro to hide prices until login?

    No. Hiding prices, the “also hide add-to-cart” option, the trade registration form, and approving applicants are all in the free plugin on WordPress.org. Pro adds extras like a fully private catalogue and multiple customer groups.

    Does this hide prices in the block checkout too?

    Yes. B2B Suite controls prices and visibility through one pipeline that covers both the classic checkout and Cart & Checkout Blocks. A gated product stays gated everywhere.

    Can I hide prices for only some products or categories?

    Yes — look under Settings → Access & visibility. Hiding whole categories from certain buyers (a private catalogue) is a Pro feature; hiding prices is free.

    Where do I put the registration form?

    Paste the [smb2b_registration] shortcode onto any page — a “Trade Account” or “Apply for Wholesale” page works well. It renders the full application form.

    Conclusion

    Hiding prices in WooCommerce isn’t one switch. It’s a small, simple system: hide the numbers from the public, let businesses apply, approve the buyers you want, and give approved accounts your wholesale pricing. Done right, a hidden price stops being a wall and becomes a reason to register.

    Every step here runs on the free B2B Suite plugin. And if you’re hiding prices, you’re building a trade channel. When your buyers start needing more price tiers, company accounts, or pay-on-account terms, Pro picks up where the free plugin leaves off — same data, same pricing pipeline.

    Get B2B Suite free on WordPress.org and set up your login-to-see-prices store today. Need help? The docs cover every setting, and support is here if you get stuck.

  • How to Add AI Alt Text to WooCommerce Product Images

    How to Add AI Alt Text to WooCommerce Product Images

    Most WooCommerce stores have hundreds of product photos with no alt text. That hurts you twice. Shoppers who use a screen reader can’t tell what each photo shows, and Google can’t read the image either, so you miss free traffic from image search. ImageCraft fixes both, in bulk, straight from your dashboard.

    Why product alt text beats plain AI alt text

    Most AI tools only look at the image. They describe a hoodie photo as “a black hoodie on a white background.” That is correct, but it does not help you sell. It has no product name and none of the words a buyer would search. ImageCraft is different. Before it writes anything, it reads the product in WooCommerce and passes the details to the AI.

    ImageCraft sends the product name, SKU, categories, and price to the AI, and tells it to include the product name. So “a black hoodie on a white background” becomes “Teton black cotton pullover hoodie, Men’s Hoodies & Sweatshirts.”

    ImageCraft saves the alt text to the Media Library, on the image itself. So it shows up everywhere the image is used: the shop page, the product page, related products, and any block or theme that reads the image. You do the work once, and every spot that uses the image gets the benefit.

    Setup: two minutes

    📷 [SCREENSHOT: ImageCraft Settings → Integrations → WooCommerce, with “Include product information” checked and “Default Tone for Products” set to Product SEO]

    1. Install ImageCraft from the WordPress plugin directory and activate it. It detects WooCommerce on its own.
    2. Add your AI key. In ImageCraft → Settings → API, pick a provider (Anthropic Claude, OpenAI, or Google Gemini) and paste your key. On WordPress 7.0 and up you can use the built-in AI instead.
    3. Turn on product context. In ImageCraft → Settings → Integrations → WooCommerce, check Include product information. This is what makes the alt text product-specific, so don’t skip it.
    4. Pick a default tone on the same screen. Start with Product SEO (Recommended).

    Method 1: Do the whole catalog at once (recommended)

    This is the fastest way to fix a whole store. If you only try one thing, try this.

    1. Go to ImageCraft → WooCommerce. Your products show up as cards with a filter bar on top. Each card has an alt-text coverage badge, like 0/1 alt or 3/3 alt, so you can see at a glance which products still need work.
    2. Under Alt Text, click Missing to show only products with no alt text. You can also filter by Generic or Long >100, and do the same for Title and Description.
    3. Optional: narrow by category, or open Advanced to filter by date or price.
    4. Click Select All. If your filter spans more than one page, ImageCraft offers to select all of them, not just the ones you can see.
    5. Tick Alt text, Title, and Description in any mix. One AI call per image fills in whatever you ticked.
    6. Click Generate. ImageCraft gathers every image, featured and gallery, removes duplicates, and runs a background job. Close the tab if you like; it keeps running and resumes if interrupted.

    One job handles up to 500 images. For a big catalog, filter by category or price and run a few jobs in a row. Each new job starts where the last one ended.

    Method 2: One product at a time

    Method 1 is great for volume. Sometimes you want a closer look. On any product card, click Generate All to write alt text for the featured image and every gallery image in one click. Or click View Details to open the product window. There you see the featured image (marked with a Featured badge) and every gallery image side by side, each with its own alt text, title, and description fields. Use the Generate link on any field to fill just that one, edit anything by hand, then click Save All Changes.

    Gallery images are the ones most often left blank. The featured image sometimes gets attention; the other gallery shots almost never do. Generate All covers the whole set at once.

    Method 3: Turn on auto-generate

    The two methods above clean up what you already have. This one keeps you clean going forward. Turn on auto-generate on upload in the settings, and every image you add to a product gets alt text as it uploads. New products go live ready for search, and you never build a backlog again. You can skip certain post types and skip images that already have alt text, so ImageCraft only fills the gaps.

    Pick the right product tone

    • Product SEO (recommended) — keyword-rich text for Google Images. Example: Teton black cotton pullover hoodie, Men’s Hoodies & Sweatshirts.
    • Product Descriptive — clear, plain text for screen readers. Example: Black pullover hoodie with a drawstring hood and front kangaroo pocket.
    • Product Lifestyle — for in-use or on-model photos. Example: Person wearing the black Teton pullover hoodie with the hood up.

    Not sure? Start with Product SEO. Set your default under Settings → Integrations → WooCommerce → Default Tone for Products. Want your own wording? Choose Custom Prompt. Even then, the product name, category, and SKU are still added as context, and your max-length limit still applies.

    Frequently asked questions

    Does it cover gallery images, or just the featured image?

    Both. Bulk Generate and per-card Generate All collect the featured image and every gallery image, with duplicates removed. Nothing gets missed.

    Will it overwrite alt text I wrote myself?

    Only if you want it to. Filter to Missing to touch empty images only, and turn on “skip images with existing alt text” to fill gaps without changing your work.

    Can it write titles and descriptions too?

    Yes. When you bulk-generate, tick Alt text, Title, and Description. One AI call per image handles the fields you pick, so there is no extra cost to adding them.

    Do I need ImageCraft Pro for this?

    No. The WooCommerce screen, product alt text, gallery generation, and the three tones are all in the free plugin. The free plan gives you 50 actions per day. Pro removes the daily limit and adds features like auto-compress on upload.

    Which AI provider should I use?

    Use your own key from Anthropic Claude, OpenAI, or Google Gemini. Any of them works well. You pay the provider directly, with no markup. If you are not sure, pick the one you already have an account with.

    Get started

    Install ImageCraft, add your AI key in Settings → API, turn on Include product information under Settings → Integrations → WooCommerce, then open the WooCommerce screen, filter to Missing, and click Generate. Your product images will be ready for search before your next coffee.

    Ready to make every product image count? Get ImageCraft →

  • Shrink Your Image Files Without Losing Quality — Right Inside WordPress

    Shrink Your Image Files Without Losing Quality — Right Inside WordPress

    Your pages can look perfect and still load slowly. Images are usually the heaviest thing on a web page — a single un-optimized photo can outweigh your entire layout, scripts, and fonts combined. That weight drags down your Core Web Vitals, your search rankings, and your visitors’ patience. ImageCraft fixes it at the source, right inside WordPress — locally, without quality loss, and with every original safely backed up.

    Why image size quietly hurts your site

    Most media libraries are full of images two to ten times larger than they need to be. Compressing them is one of the highest-impact, lowest-effort speed wins available — because page weight touches almost everything that matters:

    • Core Web Vitals. Your Largest Contentful Paint (LCP) is very often an image. Heavy images mean a poor LCP score.
    • SEO rankings. Faster pages are favored in search — and they keep visitors from bouncing.
    • Conversions. Every extra second of load time measurably reduces sign-ups, sales, and engagement.
    • Mobile experience. On phones and slower networks, a 4 MB photo is the difference between “instant” and “still loading.”

    Compress your library once with ImageCraft, and every page that uses those images gets lighter — with no rebuilds, no re-uploads, and no lost quality.

    How ImageCraft compression works

    ImageCraft takes a quality-first approach. Instead of aggressively crushing images to hit a number, it re-encodes them intelligently so the file gets smaller while the picture stays visually identical. Under the hood:

    • Runs locally on your server using Imagick, with an automatic GD fallback. No image ever leaves your site — no third-party API, nothing to sign up for.
    • Visually-lossless re-encoding. It strips bloated EXIF data and color profiles, enables progressive JPEG, and deliberately avoids chroma subsampling — so edges and text stay sharp.
    • Optional smart resize. Oversized images are scaled to a sensible maximum (2048px on the longest edge by default) — usually where the biggest savings come from.
    • Never-enlarge guard. It writes to a temporary file first and only keeps the result if it’s actually smaller. Already-optimized images are left untouched.

    Method 1: Compress a single image (or automatically on upload)

    The fastest way to optimize as you work — no leaving the screen you’re on.

    1. Open any image in the WordPress media modal and click the Compress button ImageCraft adds right there.
    2. Check the savings. ImageCraft shows the before/after size and the percentage saved — and backs up the original first.
    3. Want it hands-free? Enable auto-compress on upload (Pro) so every new image is optimized the moment it’s added.

    Method 2: Already have a full library? Compress in bulk

    If your site is already full of heavy images, you don’t need to touch them one by one. ImageCraft optimizes the underlying media library, so every page using those images gets lighter at once.

    1. Open ImageCraft → Compress and filter by Uncompressed to see everything that still needs work.
    2. Click Select page (or pick individual images) and choose Compress Selected.
    3. Watch the live progress — each image shows its new size and savings as it finishes.
    4. Changed your mind on any result? Click Restore to bring back the original instantly.

    For very large libraries, the bulk run processes hundreds of images in the background, so you can optimize an entire site in a single pass.

    Free vs Pro

    Free gives you everything you need to get real results: manual single and bulk compression, visually-lossless quality with a smart 2048px downscale, automatic backup and one-click restore, and 50 free actions per day (shared across AI features and compression). Pro removes the limits and adds automation: unlimited compression, adjustable quality and resize limits (or disable downscaling entirely), and automatic compression on upload.

    Frequently asked questions

    Will compression reduce my image quality?

    Not visibly. ImageCraft re-encodes images without chroma subsampling and strips only non-visual data (EXIF, color profiles), so the result looks identical while the file gets smaller. If a re-encode wouldn’t actually shrink the file, the original is kept untouched.

    Are my original images safe?

    Yes. Every original is backed up before it’s touched, and you can restore it — per image or in bulk — with a single click, at any time.

    Does ImageCraft send my images to a third-party service?

    No. Compression runs entirely on your own server using Imagick (or GD). Your images never leave your site, and there’s no external account or API to set up.

    Does it work with WooCommerce and page builders?

    Yes. Because ImageCraft optimizes the underlying media library attachment, anything that pulls from it — WooCommerce product images, Spectra, Kadence, Gutenberg blocks — automatically serves the lighter version.

    Get started

    ImageCraft is free to install and works alongside Gutenberg, Spectra, Kadence, WooCommerce, Yoast SEO, Rank Math, AIOSEO, SEOPress, and FileBird. Compress your library once, keep new uploads in check, and watch your page weight — and your Core Web Vitals — improve, without leaving your dashboard or risking a single original.

    Ready to lighten your library? Get ImageCraft →

  • Meet ImageCraft: AI Alt Text, File Renaming & Image SEO for WordPress

    Meet ImageCraft: AI Alt Text, File Renaming & Image SEO for WordPress

    Images make your WordPress site beautiful — but to search engines and screen readers, an image without alt text is invisible. Writing descriptive alt text for hundreds of images by hand is the kind of task everyone knows they should do and almost nobody finishes. ImageCraft fixes that with AI.

    What is ImageCraft?

    ImageCraft is a free, open-source WordPress plugin that generates accurate, human-quality alt text for your images using AI — then takes it further with SEO-friendly file renaming and a full image-SEO audit. It works with the new WordPress 7.0 native AI Client, or you can bring your own Anthropic Claude, OpenAI GPT-4o, or Google Gemini API key.

    The plugin itself is completely free. If you bring your own key, you only ever pay your AI provider directly — there’s no middleman.

    Why alt text matters

    Alt text does double duty. For accessibility, it’s how screen-reader users understand your visuals — and in many regions it’s a legal requirement. For SEO, it’s how Google understands your images, powering image-search traffic and reinforcing the relevance of the page they live on. Missing or generic alt text (“image1.jpg”, “DSC_0042”) quietly costs you both.

    What ImageCraft does

    AI alt text in 65+ languages

    Generate natural, descriptive alt text in English, Spanish, French, German, Japanese, Chinese, Arabic, Hindi, Tamil, Korean, and 55+ more — with 7 tone options (Professional, Casual, Technical, SEO, and three WooCommerce-specific tones), or your own custom prompt.

    Media library scanner & SEO audit

    Scan your entire media library with smart filters — date range, file size, alt-text quality, and missing or generic-alt detection. The SEO Audit Dashboard shows exactly how many images need attention and suggests fixes.

    Batch processing & auto-generate on upload

    Fix a backlog of hundreds of images in a single run with chunked processing and live progress tracking. Going forward, ImageCraft can auto-generate alt text in the background every time you upload — with an optional preview before it’s accepted.

    SEO file renaming

    Beyond alt text, ImageCraft can rename the underlying image files based on the generated description, so DSC_0042.jpg becomes something search engines can actually read.

    WooCommerce-aware

    For stores, ImageCraft generates alt text for product featured images and galleries using context-aware prompts that include the product name, category, and SKU — turning your catalog images into a search asset.

    Built to be safe and simple

    Your API keys are encrypted at rest with AES-256-CBC and stored in your own database. Nothing is sent to third parties except the AI provider you choose. A guided setup wizard gets you running in minutes: pick a provider, paste your key, and start generating — then track daily usage, acceptance rates, and estimated costs from the Usage Statistics panel.

    Get started

    ImageCraft is free to install and works alongside Yoast SEO, Rank Math, AIOSEO, SEOPress, WooCommerce, Gutenberg, Kadence, Spectra, and FileBird. Install it, run a media-library scan, and watch your accessibility and image-SEO scores climb — without writing a single line of alt text by hand.

    Ready to make every image count? Get ImageCraft →