B2B Wholesale Ordering Portal Development: Build vs Buy in 2026
B2B wholesale ordering portal development explained: must-have features, Shopify vs BigCommerce vs Odoo vs custom, ERP integration, and a phased build plan.
Long Nguyen
Fullstack Developer · AI Engineer · Researcher
What a B2B wholesale ordering portal actually does
A B2B wholesale ordering portal is a login-gated storefront where approved trade customers see their own prices, place and repeat bulk orders, and pay on agreed terms without emailing a sales rep. B2B wholesale ordering portal development is mostly the work of encoding your commercial rules — who pays what, in which quantities, on which terms — into software that stays in sync with your ERP.
That is why a consumer store with a discount code is not a portal. The differences are structural:
| Area | Consumer store | Wholesale portal |
|---|---|---|
| Customer | One person, one account | A company with several buyers, locations, and roles |
| Price | One public price | Depends on who is logged in and how many they buy |
| Catalog | Everything is visible | Assortment can differ per customer or region |
| Ordering | Browse, then add to cart | SKU entry, pasted lists, reorder from history |
| Quantity | Any | Minimums, case packs, increments |
| Payment | Card at checkout | Net terms, purchase orders, credit limits, plus card or bank transfer |
| Tax | Charged by default | Exemptions and VAT rules per account |
If most of the right-hand column describes how you sell today by phone, email, and spreadsheet, you need a portal, not a new theme.
The features wholesale buyers use every week
A buyer on a portal is doing a job, not shopping. They already know what they want. On a Ford auto-parts store we built and operate, most organic visits arrive on part-number searches: people type the code, not the product name. Trade buyers behave the same way inside a portal, so the shortest path from SKU to submitted order matters more than any merchandising feature.
| Feature | What it does | When |
|---|---|---|
| Trade account application | Prospects apply; you approve before they see prices | Launch |
| Company accounts with roles | Buyer, approver, and admin under one company, with several ship-to locations | Launch |
| Customer-specific pricing | Price lists and quantity breaks per company or tier | Launch |
| Quick order and reorder | Type or paste SKUs and quantities; repeat a past order in one step | Launch |
| Quantity rules | Minimum order quantity, case-pack increments, minimum order value | Launch |
| Payment terms | Net 15/30/60, PO number capture, credit limit check | Launch |
| Orders and documents | Order status, invoices, tracking, statements | Launch |
| Spreadsheet upload | Large orders straight from the buyer's own file | Later (launch if typical orders run to dozens of lines) |
| Quotes | Buyer requests a quote, a rep adjusts it, the buyer converts it to an order | Later |
| Rep ordering on behalf | A sales rep logs in as the customer and places the order | Later |
| Approval workflows | Orders above a threshold wait for a manager | Later |
| Punchout (cXML or OCI) | The portal opens inside the buyer's procurement software | Only when a customer requires it |
Punchout deserves a warning because it often gets scoped by accident. If your customers buy through procurement suites such as SAP Ariba or Coupa, they will ask for it. It is a separate integration with its own testing per buyer, so keep it out of the first release unless a signed customer needs it.
Build, buy, or extend: Shopify, BigCommerce, Odoo, or custom
There are four realistic routes. The right one depends on how unusual your pricing is and which system already holds your stock and customers.
| Route | Fits when | Watch for |
|---|---|---|
| Shopify B2B | You already run Shopify, or want retail and wholesale on one store, and sell on a few price tiers | Catalog cap below Plus; deposits and partial payments are Plus-only |
| BigCommerce B2B Edition | You need quoting, buyer roles, and rep ordering without custom code | Confirm current plan packaging with BigCommerce before you budget |
| Odoo | You want the portal, inventory, invoicing, and purchasing in one database | It is an ERP project: data migration and process change, not just a storefront |
| Custom build | Your pricing, approval, or product rules don't fit a platform, or an ERP you are keeping must stay the source of truth | You own hosting, security, and maintenance |
Shopify B2B: no longer Plus-only
Until 2026, Shopify's native B2B features required Plus. On , Shopify extended key B2B features to the Basic, Grow, and Advanced plans at no additional cost: company profiles, payment terms, volume pricing, up to three active B2B catalogs assigned through Markets, ACH payments (US only), and vaulted credit cards.
Still Plus-only: unlimited catalogs, assigning a catalog directly to a company or location, partial payments, and deposits.
Three catalogs is the number to plan around. If you sell on three tiers — distributor, dealer, installer — a non-Plus plan can now carry a real wholesale channel. If every large account has its own negotiated price file, you hit the cap on day one, and the choice becomes Plus or a different route.
BigCommerce B2B Edition: sales-led wholesale
BigCommerce's B2B Edition lists company account credit management, buyer tiers with role-based access, a configure-price-quote engine, shared shopping lists and reordering, purchase orders and net terms per account, and the ability for staff to log in and order on behalf of a company. That covers most of the ‘later’ rows in the feature table without custom code, which is its appeal when sales reps drive your wholesale business.
Odoo: the portal is part of the ERP
Odoo comes at the problem from the back office. Pricelists (per-customer prices with minimum-quantity rules and date ranges), the customer portal for quotations, orders, and invoices, and the online store all read the same product, stock, and customer records. There is no sync to build between portal and back office because they are one system. The price is that adopting Odoo means moving your operations into it.
When a custom portal is the right call
Go custom when the rules are the product: prices computed from a formula, configurable products, thousands of per-customer assortments, multi-step approvals, or an existing ERP that must remain the single source of truth.
Custom also covers the common middle path: keep the platform for catalog and checkout, and build the missing pieces as an app or middleware against its API. That is the eCommerce platform development and API integration work we do on Shopify, BigCommerce, and Odoo eCommerce.
The data model that decides everything: companies, price lists, and terms
Pricing rules discovered mid-build are the most expensive kind of change, because price touches the catalog, the cart, the order, and the invoice. Write the model down before anyone designs a screen:
- Company — the legal entity: tax status, credit limit, payment terms, assigned price lists.
- Location — ship-to and bill-to addresses, sometimes with their own tax rules and catalog.
- Contact — a person who logs in, with a role at one or more locations.
- Price list — SKU, quantity breaks, unit price, currency, validity dates.
- Assortment — which SKUs this company may see and buy.
- Order — a snapshot of price, terms, and tax at the moment of submission.
Price resolution is the rule you must make explicit. A common, defensible order is contract price first, then tier price, then base price:
from decimal import Decimal
def resolve_price(sku, qty, company, price_lists, base_prices):
# Unit price a company pays for `qty` units of `sku`.
for list_id in company['price_list_ids']: # ordered: contract, then tier
breaks = price_lists.get(list_id, {}).get(sku, [])
reached = [b for b in breaks if qty >= b[0]] # b = (min_qty, unit_price)
if reached:
return max(reached)[1] # highest break reached wins
return base_prices[sku]
price_lists = {
'contract-acme': {'BRK-204': [(1, Decimal('18.40'))]},
'tier-dealer': {
'BRK-204': [(1, Decimal('21.00')), (50, Decimal('19.50'))],
'FLT-880': [(12, Decimal('6.20'))],
},
}
base_prices = {'BRK-204': Decimal('26.00'), 'FLT-880': Decimal('8.00')}
acme = {'price_list_ids': ['contract-acme', 'tier-dealer']}
print(resolve_price('BRK-204', 60, acme, price_lists, base_prices)) # 18.40
print(resolve_price('FLT-880', 12, acme, price_lists, base_prices)) # 6.20
print(resolve_price('FLT-880', 6, acme, price_lists, base_prices)) # 8.00Twenty lines, and three decisions that belong to your sales team rather than your developer:
- First list wins, or lowest price wins? In the code above, the 18.40 contract price beats the tier list. If a promotion drops the tier price below a contract price, the contract customer pays more. Decide that on purpose and put it in the customer agreement.
- What happens below the first break? The third call returns the 8.00 base price for six units. Many wholesalers would rather block that order with a minimum quantity. Both are valid; pick one.
- Where do quantity rules live? Minimums and increments often differ per customer, so store them beside the price list, not on the product.
Two implementation rules follow. Resolve the price on the server when the order is submitted and store it on the order line; a price read from a cache an hour ago is not the price you can invoice. And round at line level exactly as your ERP does, or portal orders and invoices will disagree by cents, which is enough for an accounts-payable team to reject an invoice.
Tax status belongs to the account
Wholesale tax is decided per customer, not per product. In the EU, a sale to a VAT-registered business in another member state is generally zero-rated under the reverse-charge mechanism, which means validating the buyer's VAT number through the EU's VIES service at onboarding. In the US, resale buyers supply an exemption certificate that you keep on file. The portal needs a tax status on the company record and a human approval step; confirm the specifics with your accountant.
Integrating the portal with ERP, inventory, and accounting
A portal that isn't connected to the back office only moves the retyping from the buyer's email to your order desk. For every piece of data, name one owner and one direction:
| Data | Owner | Direction | Freshness |
|---|---|---|---|
| Products and attributes | ERP or PIM | To portal | Daily, or on change |
| Price lists | ERP | To portal | On change, re-checked at submit |
| Stock availability | ERP or warehouse system | To portal | Minutes, plus a live check at submit |
| Customers, terms, credit | ERP or accounting | To portal | On change |
| Orders | Portal | To ERP | Immediately, with retries |
| Invoices and payment status | Accounting | To portal | Daily, or on change |
| Shipments and tracking | Warehouse system or carrier | To portal | On event |
One owner per field is the rule that matters. The classic failure in any sync project is two systems that both believe they own the same field, usually price or stock, and keep overwriting each other.
- Make order export idempotent. Send a unique portal order reference so a retried request cannot create a second sales order.
- Queue, don't block. If the ERP is down, accept the order, mark it pending confirmation, and retry. Buyers forgive a late confirmation. They don't forgive a lost order.
- Choose what stock buyers see. Exact counts, bands (in stock, low, on request), or lead times. Exact counts invite three customers to order the same last unit.
- No ERP API? Scheduled file exchange — CSV over SFTP — is a legitimate first version. It is less elegant than an API and far better than rekeying.
What drives B2B portal development cost and timeline
Two portals with identical screens can differ widely in cost, because the effort hides in rules and integrations, not in pages.
| Driver | Lower effort | Higher effort |
|---|---|---|
| Pricing | Two or three tier price lists | Per-customer contracts, formulas, stacking promotions |
| Catalog | Hundreds of SKUs with clean data | Tens of thousands, variants, per-customer assortments |
| ERP | One system with a modern API | No API, several systems, custom fields |
| Payments | Card plus invoice on terms | Credit limits, deposits, partial payments, several currencies |
| Workflow | Buyers order directly | Quotes, approvals, rep-assisted ordering |
| Regions | One country, one language | Multi-currency, multi-language, VAT handling |
| Migration | A new channel | Existing accounts, order history, and logins to move |
As a rough shape: configuring a platform's native B2B features for a few price tiers is a matter of weeks, while a custom portal with two-way ERP integration is a matter of months. Portal work is priced to scope, and the surest way to lower the number is to arrive with written price rules, a sample of real orders, and ERP API access already in hand.
A phased build plan that gets buyers ordering early
- Discovery: rules before screens. Collect price files, a sample of real orders from different customers, payment terms, and the exceptions sales handles by hand. Output: written pricing and quantity rules and the data-ownership table.
- Pilot on read-only ERP data. Catalog, customer-specific prices, quick order, and order submission to your order desk. Invite a handful of friendly accounts.
- Two-way integration. Orders post to the ERP; stock, order status, and invoices flow back.
- Terms and credit. Net terms at checkout, credit limit checks, statements, online invoice payment.
- Sales tools. Quotes, rep ordering, approvals, and spreadsheet upload, in the order your reps and buyers ask for them.
- Rollout. Move the remaining accounts in waves and keep phone and email ordering open for a transition period.
Adoption is the metric that counts: the share of each account's orders placed through the portal. Buyers drift back to email for three reasons — the portal price doesn't match their agreement, reordering takes longer than replying to an old email, or they can't find an invoice. Fix those before adding anything new.
The one-page brief to write before you ask for a quote
- Number of active wholesale accounts and how many price tiers or contracts they sit on.
- Your ERP or accounting system, and whether it has an API.
- SKU count, and where product data lives today.
- Payment terms you offer and how credit limits are enforced.
- Countries, currencies, and languages you sell in.
- Three ordering scenarios that are painful right now.
Send that page to every vendor you are considering and the estimates you get back become comparable. If you want us to read it, request a free quote from Netalith — no cost, no account — and we will tell you whether a platform, Odoo, or a custom build fits, including when the honest answer is to configure what you already have.
FAQ
Frequently asked questions
What is a B2B wholesale ordering portal?
It is a login-gated online store for approved trade customers. Each company sees its own prices and assortment, orders in bulk by SKU or from past orders, and pays on agreed terms such as Net 30. Unlike a consumer store, it models companies with several buyers and locations, quantity rules, credit limits, and account-level tax status.
Can I run a wholesale ordering portal on Shopify without Shopify Plus?
Yes, within limits. Since April 2, 2026, the Basic, Grow, and Advanced plans include company profiles, payment terms, volume pricing, up to three active B2B catalogs assigned through Markets, ACH payments in the US, and vaulted credit cards. Unlimited catalogs, direct catalog assignment to companies and locations, partial payments, and deposits remain Plus-only.
How long does B2B wholesale ordering portal development take?
It depends on pricing complexity and ERP integration more than on the number of pages. Configuring a platform's native B2B features for a few price tiers is a matter of weeks. A custom portal with two-way ERP integration is a matter of months. Written price rules and ready ERP API access shorten both.
Should the wholesale portal be separate from my retail store?
Run both on one store when retail and wholesale share the same catalog and stock and your platform supports company-specific pricing. Separate them when wholesale needs a different assortment, different content, or rules the retail platform cannot express. Either way, keep one inventory source so the two channels don't oversell each other.
Do I need ERP integration at launch?
Not two-way. A sound first release reads products, prices, and stock from the ERP and sends orders to your order desk. Posting orders into the ERP automatically and returning status and invoices comes next. Skipping integration entirely only moves manual retyping from your customers to your staff.
What is punchout, and does my portal need it?
Punchout lets a buyer open your catalog from inside their own procurement software, using protocols such as cXML or OCI, and return the cart there for approval. You need it only if customers who purchase through such systems require it. Treat it as a separate project per customer rather than a launch feature.