Selling B2B: per-account pricing, quotes and credit limits
A trade store looks like a consumer store right up to the moment you look at the price. From there almost everything diverges: who sees which rate, from what quantity, ex-VAT or inc-VAT, and paid when.
Price is not a property of the product
In trade selling, price belongs to the triplet customer × product × quantity. In PrestaShop that runs through the specific_price table, which takes an id_group, an id_customer, an id_product_attribute and a from_quantity, with a priority rule deciding which row wins. It is the first thing to check the day a buyer swears they can see a rate nobody ever granted them: there is almost always a more specific row than the one you had in mind.
Then comes display. Ex-VAT or inc-VAT by group, but above all rounding: rounding each line and rounding the total do not produce the same figure, and across an order of several dozen lines the gap eventually shows on the invoice. A trade buyer reconciles their invoices; they will report the penny.
What no CMS handles on its own for trade selling
- Intra-community VAT number: format check, validation against the European VIES service, automatic exemption when validation succeeds, and above all defined behaviour when the service is unavailable — which happens.
- Full quote cycle: basket, quote request, sales approval, conversion into an order. None of the three CMS platforms ships it, and it is the development most often asked for on this kind of store.
- Document generation and revision tracking: a quote gets discussed and amended, every version must stay readable, and conversion must carry the accepted amounts rather than today’s list prices.
- Deferred payment and credit limits: an order confirmed with no immediate charge, an invoice due later, a ceiling per account and an automatic block beyond it. Checkout must accept a payment method that collects nothing but commits.
- Pack sizes: the selling unit is not the stock unit. An item is ordered by cases of twelve or by pallet, with enforced multiples and a quantity step applied server-side, not only as an attribute on the input field.
- Fast entry by product code and basket upload from a file: a buyer who knows the catalogue does not browse categories, they key in codes one after another.
- Partitioning: some ranges must only appear to certain accounts, and a negotiated rate must never show to a logged-out visitor or leak into a product feed.
How I take over a trade store
-
Map the pricing rules already in place
Before touching code I inventory what applies: groups, cart rules, per-account prices, quantity breaks, forgotten validity dates. On a store running for several years that map alone explains a good share of the rates people call inconsistent.
-
Settle rounding once and for all
I fix the rounding mode and the number of decimals, apply them from basket to accounting document, then check on a deliberately long order that the displayed, stored and printed amounts agree to the penny.
-
Make VAT number checking dependable
The check relies on the European service, with the result cached and an explicit status when it is unreachable. An order must neither sit blocked with no explanation nor be exempted by default when verification could not complete.
-
Model the quote as its own object
The quote gets its own states, numbering, revisions, validity date and document. Conversion copies the accepted amounts and locks the lines, so a change in list price never alters a quote already agreed.
-
Enforce pack sizes server-side
Quantity step, order minimum and enforced multiple are re-validated on add to basket and again at confirmation. An input field can be bypassed, and an uploaded basket never goes through the interface at all.
Related topics covered elsewhere
-
Different prices by customer group
Why a buyer sees an amount nobody assigned them, and in what order the rules apply.
-
Connecting the store to its suppliers
A type of work I take on: catalogue, stock and order synchronisation with a partner system.
-
Trade catalogue on Shopify
What the platform genuinely supports for per-account pricing, and where the workarounds begin.
-
Multi-supplier catalogue
A production release built around a catalogue fed by several sources with differentiated rates.
Frequently asked questions
Why does a customer see a price I never gave them?
Should prices show with or without VAT?
Does the quote cycle exist as standard?
How is a credit limit enforced?
What if the VAT checking service is down?
How do I allow ordering by product code?
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.