Skip to content
7 min read · WordPress

WooCommerce B2B Checkout: What Changes for Trade Buyers

FWritten byFaisal AhmedSoftware Engineer
Updated on 16 August 2026
A WooCommerce trade checkout with a purchase order number field reading PO-4471, a validated VAT number, pallet delivery quoted on despatch selected over next-day courier, pay on account net 30 selected over card, and an order summary reading subtotal ex VAT £2,940.00, VAT 20 per cent £588.00 and total £3,528.00

A trade checkout has to do four things a consumer checkout never does: carry a purchase order reference, capture and act on a VAT number, price delivery for a pallet rather than a parcel, and complete an order that nobody pays for today. WooCommerce core gives you a proper place for the first and almost nothing for the other three.

That is a smaller gap than it sounds, and it is worth being precise about where it falls, because most trade stores overspend on the parts core already handles and underspend on the one that decides whether an order can be placed at all, which is payment.

What WooCommerce core gives a trade checkout, and what it does not

Start with the field layer, because it is the part people expect to be hard and is not any more. The Checkout block supports additional fields registered in one of three locations: contact information, where fields "will be saved to the shopper’s account"; address, where they are saved to both the customer and the order and are collected twice, once for billing and once for shipping; and order information, for anything that describes the order rather than the person. The supported types are text, checkbox and select, and the documentation is explicit that "there are plans to expand this list, but for now these are the types available", at developer.woocommerce.com/docs/cart-and-checkout-additional-checkout-fields.

So the trade fields have a home, and the location you choose is a decision rather than a detail: a purchase order number belongs to the order, an account reference belongs to the customer, and a tail-lift requirement belongs to the address, because the same buyer has one site with a loading bay and another without. Choose wrong and the field either fails to persist for the next order or gets asked twice.

A WooCommerce admin screen listing six registered additional checkout fields with their location and type, showing purchase order number as an order text field, VAT number and account reference as contact text fields, tail lift required as an address checkbox and delivery window as an order select, above a note reading supported types text, checkbox, select

What core will not do is make any of it conditional. Every field you register is a field every shopper sees, and a consumer buying one item does not want to be asked for a purchase order number. Showing trade fields to trade customers only is the first piece of real work on this page, and it is the same audience question that decides which price they were shown in the first place.

Purchase order references, and where they have to go

A purchase order number is not a note. It is the reference the buyer’s finance system will match your invoice against, and an invoice arriving without it is an invoice that does not get paid on time. Capturing it is trivial. Carrying it is the job.

It has to appear on the order confirmation email, on the packing note, on the invoice and in whatever your accounts team looks at, and it has to be searchable, because half the queries a trade store receives begin with a purchase order number rather than an order number. Decide early whether it is required, and for whom. Some buyers cannot raise one before ordering, so a hard requirement on every trade order will produce a phone call rather than a sale.

Payment terms, and what pay on account really is

This is the requirement that decides the whole build, and it is mechanically simpler than it sounds: a payment method that completes the order without taking money, offered only to approved accounts. Everything else is policy dressed as software. The order is placed, the status reflects that payment is outstanding, and an invoice follows on your terms.

Three things travel with it, and all three are commercial decisions somebody in finance has to make before a developer touches anything. Which accounts qualify, which is the approval flow from the wider trade account build. What the credit limit is and what happens at checkout when an order would exceed it, which is either a block, a warning or nothing at all. And what the terms actually say, because net 30 from invoice date and net 30 from despatch are different numbers on the same order.

Be careful with the vocabulary when buying an extension. An invoice gateway that lets an approved account check out unpaid is open account. Scheduled instalments taken from a stored card are not, however they are labelled. Only one of those answers a purchasing department, and finding out which one you bought after promising terms to a customer is an expensive conversation.

VAT numbers and tax at a trade checkout

WooCommerce has exactly two settings for how tax is displayed, one for the shop catalogue and one for the cart and checkout, and both are store-wide with no per-customer variation, per woocommerce.com/document/setting-up-taxes-in-woocommerce. Trade buyers read net prices and consumers read the price they pay, so a store selling to both is overriding that display somewhere, and the place it usually breaks is the order confirmation email, which nobody put in scope.

A VAT number field is the easy half of the cross-border story. The hard half is what happens after it is entered: validating it against the published registry, deciding whether an invalid number blocks the order or merely charges tax, storing it against the customer so it is not retyped, and applying the right treatment to the order rather than to the display. A field that collects a VAT number and does nothing with it is a field that tells a buyer you handle their tax position when you do not.

Delivery when the order is a pallet

Core ships three shipping methods, flat rate, free shipping and local pickup, and that is the entire list at woocommerce.com/document/setting-up-shipping-zones. None of them can price a pallet. A trade buyer offered a courier rate on four hundred units assumes the site is broken, and they are not wrong.

There are three honest answers and one dishonest one. Quote freight after the order, stated plainly on the delivery step so nobody is surprised by a second invoice. Price by weight or pallet count through a carrier integration. Or set a threshold above which delivery becomes a conversation. The dishonest answer is a flat rate you absorb, which works until somebody orders a tonne of it. Whichever you pick, collect the access details with the address: tail lift, forklift on site, delivery hours and a name for the driver to ask for.

Minimum orders, multiples and failing well

Minimum order values and required multiples are not core settings, so they arrive with an extension or as cart validation you write. The rule itself is easy. Where it is enforced is what separates a good trade store from an irritating one.

  • Say the minimum on the product page and in the basket, not for the first time at checkout.
  • Show the shortfall as a number the buyer can act on, not as a rejection: 68.00 short of the 250.00 minimum, with a link back to the catalogue.
  • Enforce required multiples at the quantity input, so a case of twelve cannot become an order for seven in the first place.
  • Exempt the accounts you have agreed to exempt, because a negotiated exception that the website refuses is worse than no rule.
  • Never fail silently on the payment step, which is where a blocked order looks like a broken store rather than a policy.
  • Log every blocked cart, because a minimum that blocks a tenth of your trade baskets is a pricing decision nobody made.

What to build, and in what order

Payment first, because an account that cannot pay the way it pays everybody else will not use the site at all. Then the audience rule that decides which fields and which tax display a given customer sees. Then the purchase order reference and its journey through to the invoice. Then delivery. Minimums and multiples last, since they only matter once orders are actually being placed.

And leave the consumer checkout alone while you do it. The field economy, the express wallets and the one-page-or-several question are the same on a trade store as anywhere else, and they are answered in the general WooCommerce checkout work. A B2B checkout is that checkout with four fields, one payment route and one tax rule added, and the fact that four fields is the whole gap is also why the platform question is worth asking once before you build it. It is ordinary WooCommerce engineering rather than a separate platform. If your trade orders still arrive by email because the checkout cannot take them, that is worth a conversation.

Sharein𝕏f

The questions people ask first

Not out of the box, but the place to put one is now first-class. The Checkout block supports additional fields registered in three locations, contact, address and order information, and a purchase order reference belongs in order information because it describes the order rather than the person or the place. What core will not do is validate it, print it on the invoice or make it required only for trade accounts.

Through a payment gateway that completes the order without taking money, exposed only to approved accounts. That is the whole mechanism, and it is why the feature is sold under several different names. Check what you are buying: an invoice gateway that lets an approved account check out unpaid is credit terms, while scheduled instalments against a stored card are not, and a purchasing department can tell the difference immediately.

Not in core. WooCommerce has exactly two tax display settings, one for the shop and one for the cart and checkout, and both are store-wide. Showing ex VAT to trade and inc VAT to retail means overriding the display per audience, and the failure to plan for is partial coverage, where the catalogue and cart switch but the order confirmation email still renders gross.

It is not a core setting, so it arrives with a B2B extension or as code hooked into cart validation. Wherever it comes from, put the rule on the cart page rather than only at checkout: a buyer who has entered a purchase order number and a delivery address before being told the order is too small will not add the difference, they will leave.

A purchase order reference, a company name and account reference, a VAT number where cross-border tax treatment depends on it, and delivery access details such as whether a tail lift is needed and what hours the site accepts deliveries. Everything else on a trade checkout is the same form a consumer sees, which is why adding four fields is a smaller job than most stores assume.

FWritten byFaisal AhmedSoftware Engineer

Faisal builds the storefronts and the tests that run on them, and treats every dependency as something that has to earn its place.

Do you like what you see?

Optimize your store