Free for Craft Commerce 5 · Pro $149
Wholesale, without leaving Commerce
WooCommerce has B2BKing, Wholesale Suite and WooCommerce B2B. Craft has had Bulk Pricing and catalog pricing rules, and nothing for the rest. Forklift adds company accounts, contract price lists, approvals, quotes, net terms and tax exemption to the Commerce store you already run.
One price, and why it is that price
A wholesale buyer looking at £8.40 wants to know whether that is their contract rate, a break they have just earned, or the public price. Every price Forklift computes comes from one place and carries its reason with it, so the price a buyer is shown cannot disagree with the price they are charged.
{% set price = craft.forklift.price(variant, 12) %}
{{ price.price|commerceCurrency(cart.currency) }} {# £8.40 #}
{{ price.listPrice|commerceCurrency(cart.currency) }} {# £10.50 #}
{{ price.sourceLabel }} {# Quantity break at 12+ #}
{% if price.nextBreak %}
{{ price.nextBreak.qty }}+ at {{ price.nextBreak.price|commerceCurrency(cart.currency) }} each
{% endif %}
{# The cart, the pad, the CSV upload, reorder and the quote builder
all read this same PriceResult. #}
Features
Everything a trade account needs, built on Commerce's own carts, gateways and tax engine rather than beside them.
Company accounts, buyers and roles
A company is a Craft element with a field layout of your own. Buyers attach as members, and the role belongs to the membership, so the same person can administer one account and only view another.
- Administrator, approver, buyer and viewer, with no permission matrix
- Per-buyer spend limits: blank means none, zero means not unassisted
- On hold stops new orders and nothing else
Contract price lists
A price list is a document: a name, an owner, dates it is good between, and rows. Fixed prices, percentage or amount off, by variant, product, product type or everything, with quantity breaks.
- The highest priority list wins only for the lines it mentions
- A contract price above list is refused, and the CP says why
- A cheaper public promotion beats the contract
Spend approvals
Orders need signing off by company threshold, by the buyer's own limit, or by a flag on the buyer. The reason is recorded when the request is raised and never recomputed.
- Approvers decide from an email link, with no login needed
- An approval covers an amount: a basket that grows needs approving again
Quotes with pay-by-link
The buyer asks, you edit quantities and prices, add delivery and set an expiry, then send. Forklift builds a real Commerce cart carrying those prices and emails a signed link that loads it.
- This is craftcms/commerce#1156, still open in Commerce
- From the click it is an ordinary checkout, every gateway included
Net terms and credit limits
A purchase-order gateway that authorises rather than purchases. The order completes and totalPaid stays at zero, which is true, until you capture the payment with Commerce's own machinery.
- Over the limit withdraws the gateway, not the checkout
- The balance is a SUM over an append-only ledger, every time
- Aged statements as printable HTML and CSV
Quick order, CSV and reorder
Wholesale buyers do not browse. Type part numbers into the pad, upload a spreadsheet, or reorder last month's order. All three return the same result, and nothing is silently dropped.
- Exact SKU match, then case-insensitive, and no guessing
- Every failed row says why, with its line number
- Reorder re-prices at today's rates and names what changed
Tax exemption certificates
Certificates are held per company with a jurisdiction and an expiry. Tax is removed only when one is approved by a person, unexpired, and covers the delivery address.
- A Texas resale certificate does not exempt a delivery to Ohio
- A subclass of Commerce's own adjuster, so the tax arithmetic stays Commerce's
- Avalara and TaxJar stores keep their own engine
Lite is a real plugin, not a demo
Lite is free and uncapped: companies, buyers, roles and spend limits, order history and the buyer portal, PO numbers, tax certificates, the quick-order pad and reorder. Pro is the money half.
- Pro adds price lists, approvals, terms and credit, quotes and CSV upload
- A lapsed licence never breaks a store: Pro settings are ignored, not obeyed
Frequently Asked Questions
The questions worth answering before you install it.
Lite is, and it is not a trial. Company accounts, buyers, roles and spend limits, company order history, the buyer portal, purchase-order numbers, tax exemption certificates, the quick-order pad and reorder, with no cap on companies, buyers or orders. Pro is $149 with a $129/year renewal and adds contract price lists, spend approvals, net terms with credit limits and statements, quotes with pay-by-link, and CSV order upload.
Catalog pricing rules price by condition: this product type, that user group, over that quantity. What they cannot express is a negotiated sheet of prices belonging to one named customer, with quantity breaks, imported from a spreadsheet. The two coexist: Commerce's rules produce the list price, and Forklift prices the contract on top of it.
Bulk Pricing does quantity breaks. Forklift does quantity breaks inside customer-specific price lists, which is a different problem, plus the rest of the suite.
Yes. Forklift never writes to Commerce's tables, and an order with no company on it picks up no B2B rules at all. That matters, because most stores that install this do it for one customer in twelve.
No. The approval email carries a single-purpose tokenised link and they decide from their inbox. The people who sign off spend very often have no account on your site, and a workflow that requires one gets bypassed by forwarding the email.
No, and that is the point. The purchase-order gateway authorises rather than purchases, so the order completes and totalPaid stays at zero until you capture the transaction. Every report and integration in your store already understands that.
The purchase-order gateway withdraws itself. Checkout does not stop: a customer over their limit holding out a credit card should be allowed to use it.
Forklift replaces the tax engine only when Commerce's own is in place. A store running Avalara or TaxJar keeps theirs. Certificates are still recorded; they just are not applied, and the log says so.
Nothing breaks. Price lists stop applying, so buyers pay list price. The purchase-order gateway withdraws, so no new credit is opened. Approvals stop blocking checkout, because a store that cannot check out is worse than one that lets an order through, and every such order is flagged on the order, in the approvals screen and in forklift/maintenance/doctor.
Run php craft forklift/maintenance/doctor. Every check in it is something that fails silently: an account with an approval threshold and nobody able to approve, a price list whose SKUs do not exist in your store, an order that completed without the approval it needed.
Start free, upgrade when the money is involved
Lite is free and uncapped: companies, buyers, roles, the portal, PO numbers, certificates, quick order and reorder. Pro is $149 with a $129/year renewal, and adds price lists, approvals, net terms, quotes and CSV upload.