Scaling a B2B store on PrestaShop often comes down to accommodating how corporate clients actually buy. Standard retail checkout processes simply don't cut it when handling volume buyers who expect personalized rates and flexible payment terms.
In this guide, you’ll learn step-by-step how to set up custom tiered pricing structures and seamless credit-line approval workflows. From configuring group-based discounts to managing credit risk on large orders, here is how to upgrade your platform for serious commercial sales.
Why PrestaShop's Native Groups Aren't Enough for B2B
You build tiered B2B pricing in PrestaShop by combining customer groups with quantity-based Specific Prices (or Cart Rules), and you add a credit line by storing a per-customer limit and blocking the checkout when the customer's outstanding balance would exceed it. Because PrestaShop has no native credit-limit field, most merchants use a dedicated B2B module that adds both tiered price tables and a checkout-time credit check, while developers can replicate it with a custom module hooked into actionValidateOrder and the cart validation step.
That first half sounds workable until you sit down with a trade customer's price list. PrestaShop gives you groups and it gives you discounts, but it stops there. Everything a wholesale relationship depends on sits outside the platform.
Before the pricing side gets complicated, it helps to have your account data clean. If you are still approving trade applicants by email, the PrestaShop B2B registration module collects company details, VAT numbers and trade references through a custom form, so each approved customer lands in the right group with the fields your invoicing later depends on.
Want to keep trade buyers updated on price changes and new stock lines? The Prestashop Advance Newsletter lets you import a subscriber list from a CSV file, display a subscription box in the footer or a column, and target specific products and categories in each campaign, which suits merchants who price by account rather than by public promotion.
Here is what the core really offers, and where each piece runs out:
- Customer groups apply one discount percentage to a whole account, so you cannot give a builder merchant different rates on fixings and on power tools.
- Specific Prices work per product and per quantity, the closest native fit to a tier table, but they are managed product by product. With a large catalogue and many trade accounts, the maintenance load becomes the job.
- Cart Rules handle basket-level promotions, not negotiated per-account terms, and they stack in ways that are hard to audit after the fact.
Then comes the gap that costs real money. PrestaShop has no field for a credit limit, no running balance per customer, and no way to stop a checkout because an account is already over its line. A trade customer orders on account, the order ships, and the invoice sits unpaid. Multiply that by even a handful of accounts, and you are financing your customers' cash flow with your own.
The native group price is the easy part; the payment-on-account gate is the part PrestaShop never shipped.
Most merchants close that gap in one of two ways: install a PrestaShop B2B module that adds tiered price tables and a checkout-time credit check together, or write a custom module that hooks into order validation. The module route costs less than bespoke development and survives upgrades. The code route gives you exact control, and you own every edge case it misses. This guide covers both, including the checkout-time credit check that most tutorials skip entirely.
What You'll Need Before You Start
Gather these requirements first so you are not hunting for back-office access halfway through a price table.
- Permissions: SuperAdmin or a back-office profile with rights to install modules, edit customers and groups, and change payment methods.
- Platform: A live PrestaShop 1.7 or 8.x store, plus a staging clone you can break without consequence.
- Accounts: At least one test customer per trade tier, each assigned to its group and (later) given a deliberately small credit ceiling.
- Data: Your tier bands on paper (quantity thresholds and rates), plus a list of approved accounts and their agreed credit lines.
- Backups: A full database and file backup taken immediately before you touch any pricing or validation setting.
- Time: Roughly 60-90 minutes for the module route; a full day or more for the manual code route once testing is included.
- Difficulty: Intermediate for the module route (settings only), advanced for the custom module (PHP, hooks, database columns).
Method 1: Building It Fast With a Merchant-Ready B2B Module
The module route exists because customer groups handle discounts, not commercial agreements. A wholesaler who buys in bulk at one rate and a wholesaler who buys a small quantity at another are not the same customer, and neither is the one who settles invoices later. Modules specialising in PrestaShop B2B pricing treat those as separate rules that stack, so a quantity break, a customer-specific rate and a credit ceiling can all apply to the same order.
Work through the steps in order. Each depends on the layer above it, and skipping ahead usually means rebuilding the tables later.
Step 1: Install and Activate the Module
Nothing else works until the module hooks into PrestaShop's pricing and cart logic, so installation comes first. Upload the module archive or install it from the back office, then open its configuration page to confirm the pricing tables and credit fields have been registered.
You should now see the module's configuration panel alongside your existing settings, with any new database columns added automatically during activation.
Tip: Test on a staging copy before touching live prices. A misapplied tier on a production catalogue can quote the wrong rate to every account in a group within minutes.
Step 2: Create the Customer Groups Your Tiers Will Attach To
Every price rule needs a group to attach to, so build the group structure before the tables. Navigate to Customers, then Groups, and create one group per commercial tier, for example Wholesale Bronze, Wholesale Silver and Distributor.
- Name: the label your team will recognise on the customer record and in order exports.
- Discount: leave this at zero if your module applies its own price tables, so the two systems never compete.
- Price display method: choose whether the group sees prices tax included or tax excluded, which matters for trade buyers claiming VAT back.
You should now see your new groups listed with a customer count beside each one. If you also need approval before an account becomes active, the PrestaShop B2B registration module handles the application form and validation step separately.
Step 3: Define Your Tiered Price Tables
This is the core of PrestaShop B2B pricing: prices that change with quantity rather than a flat group percentage. In the module's price rule section, add rules per product, per category, or per customer group, depending on how granular your contracts are.
- Select the scope: a single product, a whole category, or an entire customer group.
- Set the quantity break that triggers the tier, such as a small, medium and large order volume.
- Choose the price type: a fixed unit price, a percentage off the base price, or a fixed discount amount.
- Set the validity dates if the contract is seasonal or tied to a promotion window.
You should now see each tier listed against its scope, with the widest break applied automatically when a customer adds enough units to the cart. Overlapping rules need an explicit priority, otherwise two tables can both claim the same basket.
Step 4: Assign Credit Limits Per Customer
Tiered pricing decides what a buyer pays; a credit limit decides how much they may owe before settling. Open the customer record and locate the credit field the module adds, then set the ceiling in your store's default currency.
- Credit limit: the maximum outstanding balance this account may carry at any time.
- Current balance: the running total of unpaid invoices, which the module updates as orders are validated.
- Group default: an optional ceiling applied to every new customer in that group, overridden per account where a contract says otherwise.
You should now see the limit and the current balance side by side on the customer record, so your team can answer "can this account order more?" at a glance.
Step 5: Enforce the Checkout Block
A credit limit that only displays a number is a report, not a control. The module's checkout rule is what stops an order from completing once the account is at or over its ceiling, so enable the block and decide how it behaves.
- Block over limit: stops checkout entirely and shows the buyer a message explaining why.
- Warn over limit: allows the order but flags it for your team to review manually.
- Message text: the wording the buyer sees, which should tell them who to contact rather than simply refusing.
You should now see the block trigger in a test basket belonging to an over-limit account, with the order placed on hold rather than confirmed.
Step 6: Enable Payment on Account and Invoice Terms
Credit accounts rarely pay by card at checkout, so the last configuration piece is the payment method itself. Enable the module's payment-on-account option so approved buyers can confirm an order without paying immediately.
- Payment on account: lets the order complete against the customer's balance instead of a gateway.
- Invoice terms: the payment window shown on the invoice, such as a set number of days from the order date.
- Authorised groups: restrict the method to the trade groups you have actually vetted.
You should now see an invoice payment option at checkout for approved accounts only, with the order amount added to their outstanding balance.
Tip: Keep one test account per group with a deliberately tiny credit limit. It gives you a permanent, safe way to confirm the checkout block still fires after any module update.
How Do You Enforce a Credit Limit at PrestaShop Checkout?
A tiered price list tells a trade customer what a pallet of fixings costs. It says nothing about whether that customer has already spent their agreed credit line this month. That is the gap most B2B tutorials never close, because the check has to fire at the moment the order is validated, not when the catalogue is browsed.
The logic is simple arithmetic. Read the customer's outstanding balance from open invoices, add the total of the cart they are trying to submit, then compare the result against the credit ceiling stored on their account. If the sum exceeds the ceiling, the order is refused before it is ever accepted into the order table.
Where the check belongs in the order flow
In PrestaShop, validation happens on the controller that runs when the customer confirms the order. A custom credit module should hook into that validation stage and stop the process before payment or order creation proceeds, rather than letting the order through and cancelling it afterwards.
Stopping early matters for three reasons:
- Stock is not decremented for an order that will never ship.
- No invoice number is burned on an order you are about to void.
- The accounts team does not have to reconcile a phantom entry later.
If you build this yourself, the hook you attach to must be the one that fires on order confirmation, and your module should return the customer to the cart with a clear message rather than a blank error page.
What the customer sees when the limit is hit
A refusal with no explanation generates a phone call. A refusal that names the ceiling, the outstanding balance and the shortfall does not. A well-built credit module typically shows a plain message on the checkout page explaining that the order exceeds their available credit, and often gives them the option to reduce the cart or contact their account manager.
For trade customers buying on account, that message is the whole user experience of your credit policy. Treat it as a feature, not an error state.
How admin overrides work
| Scenario | Typical admin action |
|---|---|
| Long-standing customer goes slightly over the limit | Raise the credit ceiling on the customer record, then let them resubmit |
| New account still being assessed | Hold the order in a pending state for manual approval |
| Customer wants to pay part of the balance immediately | Record the payment, which reduces the outstanding figure, then release the order |
None of these require bypassing the credit check. They require changing the inputs the check reads, which keeps the audit trail clean and means your policy is enforced consistently rather than argued away at the till.
If your store already collects company details at registration, keeping the credit ceiling as a customer field rather than a free-text note means the checkout check has something reliable to read. A PrestaShop B2B registration module that captures company, VAT and account type at sign-up gives you that structured record from day one, instead of a back office full of inconsistent notes.
Credit control is not a price list problem; it is a validation-timing problem, and getting the timing wrong is what turns a policy into an argument.
Set the ceiling per customer, check it before the order is accepted, and give the customer a sentence they can act on when it trips.
Method 2: The Manual / Code Route in PrestaShop
If you have a developer on hand and no budget for a module, PrestaShop gives you enough raw material to rebuild part of what a B2B module does. The work splits into three jobs: hand-building customer groups and quantity-based prices in the back office, adding a credit limit field to the customer record, and hooking into order validation so a customer over their limit cannot complete checkout.
This route is slower to set up and you own every bug. It also breaks quietly on upgrades, which is worth knowing before you start.
Step 1: Build Customer Groups and Quantity Discounts by Hand
Go to Customers > Groups and create one group per pricing tier, for example "Wholesale Bronze" or "Reseller Tier 2". Then open a product, move to the Pricing tab in the product editor, and add a Specific Price row for each group and quantity break you sell at.
The gotchas surface fast. PrestaShop stores specific prices as either a fixed amount, a percentage reduction, or a new price, and applies them by group, country, currency, and even shop, so a single product can end up needing several price rows before you have covered your main markets. Group prices can also stack with cart rules if you are not careful, so audit your existing discount rules before going live.
There is no native credit limit field anywhere in this workflow, and no native way to cap an order at a spending ceiling.
Step 2: Add a credit_limit Field to the Customer
Attach the field to the customer rather than the address, because credit belongs to the account, not the delivery point. In a custom module, add a column such as credit_limit and an outstanding_balance column to the customer table, or use PrestaShop's object model and a definition class to extend the Customer object cleanly.
Expose it in the back office so your accounts team can set a limit per customer without touching the database. Keep the field tax-exclusive and store it in your shop's default currency; mixing currencies in one column is how reconciliation goes wrong later.
Step 3: Recalculate Outstanding Balance on Order
Hook into the order creation and status change events. When an order moves to a paid or shipped status, add its total to the customer's outstanding balance. When a payment is recorded, subtract it.
This is where tax and currency bite hardest. Compare tax-inclusive totals against the limit if you invoice with tax, and tax-exclusive totals if you do not, but pick one and stay consistent. If you sell in more than one currency, convert everything to a single base currency before storing the balance, and decide up front whether you recalculate at the historical rate or the current rate.
Guest checkout is the other silent failure. A guest has no customer record, so there is nowhere to store a limit and no balance to check. Disable guest checkout entirely, or accept that guest orders bypass your credit logic.
Every hand-rolled credit check is only as reliable as the order statuses and currencies you remembered to handle.
Step 4: Block Validation Above the Limit
Use the cart and order validation hooks. On cart validation, read the customer's outstanding balance plus the current cart total and compare it against the limit. If the sum exceeds the limit, throw an error so the cart cannot proceed to payment.
Order validation runs a second time before the order is persisted, which catches carts that slipped past. Test both, because a customer who edits quantities at the last moment can push a passing cart over the limit.
Warning: Back up your database before adding columns, and build this on a staging copy first. Custom database columns are not tracked by PrestaShop's upgrade scripts and can be lost when you update the core.
If the maintenance burden of all four steps sounds like more than your team wants to carry, the module route in Method 1 handles the same ground with a settings screen instead of a codebase. Merchants who also sell configured or made-to-order products often pair tiered pricing with a builder module, so the price a customer sees reflects what they assembled; a custom PC builder or a custom bike configurator is a typical example.
Troubleshooting Tiered Pricing and Credit-Limit Problems
Most of what goes wrong after a working setup is a visibility, sequencing, or balance problem rather than a broken module. Work through the cause-and-fix pairs below in order before you touch any configuration again.
If tiered prices show for guests but disappear once a customer logs in
The tier table is usually attached to a group the customer's account never joined, or the shop's default customer group takes precedence in the price calculation. This is the classic symptom of building tiers on a group that only your sales team assigns manually.
- Open Customers > Groups and confirm the account is genuinely assigned to the tier group, not just the default one.
- Check whether the account has multiple group memberships, since conflicting assignments resolve unpredictably.
- Re-test in a private browser window so no cached guest price is served from the previous session.
If your B2B account creation never assigns groups automatically, that gap is upstream, and a PrestaShop B2B registration module that collects the right details at signup prevents it from recurring.
If the credit limit is ignored for some payment methods
The limit check typically runs in the module's own payment path, so any method that bypasses it (bank wire, cheque, an offline order created in the back office) never sees the balance. A credit check is only as strong as the payment methods it actually covers.
- List every enabled payment method and note which ones honour the limit.
- Disable offline methods for credit accounts, or route them through a manual approval step.
- Watch for orders placed by staff in the back office, which often skip checkout validation entirely.
If the balance drifts because of tax
An outstanding balance should be calculated from the same tax basis as the invoice the customer receives. When one side uses catalogue prices excluding tax and the other charges tax at a different rate or rounding rule, small differences accumulate into a visible discrepancy.
Compare a real invoice with the module's balance figure for the same order. If they disagree, align the shop's price display and tax settings with the module's calculation rather than adjusting the limit by hand.
If the balance stays wrong after refunds or cancelled orders
Not every module releases credit when an order is refunded, partially refunded, or cancelled. Outstanding balances then sit too high and block customers who have actually paid. Decide your policy first: does a refund free the limit immediately, or only when the credit note is issued?
Test the flow end-to-end with a small order. Place it on credit, refund it, then check the customer's account balance in the back office. If the figure does not move, the refund path is not wired into the limit logic.
If customers are stuck at the limit with no way to clear it
A hard block with no explanation generates support tickets. Give the customer visibility instead: show the outstanding balance and remaining headroom on their account page, and let them pay down the balance directly. Customers who can see the number top it up themselves.
Promotional emails work well here too, particularly reminders that a balance payment restores full ordering. The Prestashop Advance Newsletter module (available for $49.00) lets you segment subscribers and send targeted reminders about account status alongside product and discount campaigns.
Why Tiered Pricing and Credit Limits Decide Whether Your PrestaShop B2B Store Scales
PrestaShop gives every B2B merchant the same starting wall: group prices, and nothing else. You can create a "Wholesale" group, apply a discount percentage, and that is genuinely the end of the native ladder.
That gap matters because real trade accounts are not one flat discount. A hardware distributor might give a builders' merchant one rate at a single pallet, a better rate at several pallets, and a contract rate at a full load. Their accounts team also expects a credit ceiling on every trade customer, checked before the order is accepted.
If PrestaShop cannot price that ladder or check that ceiling, your reps end up quoting by email and your finance team reconciles by spreadsheet. This guide covers the tiered pricing decision first, then the credit limit wall, then the checkout-time check that almost every tutorial forgets.
How B2B Pricing and Credit Control Work in PrestaShop?
Two separate problems sit under one roof, and they fail in different ways. Pricing failures lose you margin quietly. Credit failures lose you cash loudly.
PrestaShop's native toolkit for the first problem is Specific Prices and Cart Rules. Specific Prices let you override a product's price for a customer group, a country, a currency, or a date range. Cart Rules apply a discount at basket level when conditions match. Neither one understands "this account gets a better rate once the order passes a certain volume."
The credit side is worse. PrestaShop tracks orders and invoices, but it has no concept of an outstanding balance ceiling per customer. Nothing stops a trade account that already owes you money from placing another order online late at night.
- Group discounts scale to one percentage per group, not to volume bands.
- Quantity breaks across a product family require separate rules per product.
- Credit exposure lives in your accounting system, not in the basket.
- Approval-free checkout means bad debt can arrive before your finance team wakes up.
Quick Answer
PrestaShop's built-in group prices cannot deliver true quantity-tiered B2B pricing or account credit ceilings. The reliable fix is a PrestaShop module that adds price bands per customer group and a credit limit field on the customer record, enforced during checkout. A custom override on the cart controller is the hands-on alternative.
Method 1: PrestaShop B2B Pricing and Credit Limit Module
A dedicated module keeps your theme and core files untouched, which matters at upgrade time. Install it through your back office, confirm it is compatible with your PrestaShop version, and test on a staging copy. Tiered pricing rules applied to live trade accounts are hard to unwind if a band is wrong.
Step 1: Define Your Customer Groups and Wholesale Bands
Group structure drives everything downstream, so map your bands on paper before touching the back office. Decide which accounts belong to which tier and what volume threshold separates them.
Navigate to Customers, then Groups in the back office.
- Create one group per commercial tier, for example Trade Bronze, Trade Silver and Trade Gold.
- Leave the default Discount (%) at zero on each tier group. The band pricing you configure later will handle the discount per product.
- Assign existing B2B accounts to the correct group from each customer record under Customersthen Customers.
- Set Show prices to yes for each group so logged-in trade customers see their own rates.
You should now see your trade accounts split by tier, with no discount applied yet at group level.
Tip: Keep tax rules identical across tier groups. A group with a different tax rule will show confusing net figures next to your other tiers.
Step 2: Configure Quantity-Based Price Bands Per Product
This is the step that closes the gap native group discounts leave open. Each product carries its own ladder of minimum quantities and matching prices per group.
Open a product from Catalog, then Products, and locate the tiered pricing panel added by the module.
- Customer group: which tier the band applies to.
- Minimum quantity: the lowest order quantity that unlocks the band.
- Price: the unit price charged at that quantity and above.
- Discount type: whether the band is expressed as a fixed price or a percentage off the base.
Repeat the band for each threshold, from your smallest break up to your largest contract rate.
You should now see a price ladder on the product that changes as a logged-in trade customer increases quantity in the basket.
Warning: Set the Minimum quantity values in ascending order. Overlapping or out-of-order thresholds produce unpredictable prices at checkout.
Step 3: Add Credit Limits to Trade Customer Accounts
Pricing gets the order placed. Credit control decides whether you should accept it. This step puts a ceiling on every trade account record.
Open the customer from Customers, then Customers, and find the credit section on the account.
- Credit limit: the maximum outstanding balance you will allow this account.
- Credit period: the number of days before an invoice counts as overdue.
- Allow order over limit: whether the account can push past the ceiling or is blocked.
- Customer group: which tier determines the default ceiling for new accounts.
You should now see a credit figure stored against the customer record, visible when you review the account from the back office.
Tip: Set the ceiling slightly below your true comfort level. Accounts drift, and a buffer absorbs the gap between an order being placed and an invoice being issued.
Verdict: Which Route Should You Take?
If your trade accounts only need a single discount percentage, PrestaShop's native groups will carry you, and neither route here is necessary. The moment you need quantity bands that differ per account, or a credit ceiling that actually stops an order, the native ladder runs out and you have to choose how to replace it.
The module route wins for almost every merchant running a live store. You configure groups, bands, credit ceilings and the checkout block from a settings screen; you keep your core files untouched, and the whole thing survives a PrestaShop upgrade. The code route only makes sense when a contract demands logic no module covers, and you have a developer on retainer to maintain it.
Whichever route you pick, do the checkout block first. A price list without a credit gate is a discount with no control attached.
Start with Prestashop Advance Newsletter | Build Subscribers and Send Custom Emails at $49.00 to keep every trade group informed about its own price list and account terms, then layer your pricing and credit rules on top.