Store Platforms

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 Avatar

Long Nguyen

Fullstack Developer · AI Engineer · Researcher

• • 5 min read •

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:

AreaConsumer storeWholesale portal
CustomerOne person, one accountA company with several buyers, locations, and roles
PriceOne public priceDepends on who is logged in and how many they buy
CatalogEverything is visibleAssortment can differ per customer or region
OrderingBrowse, then add to cartSKU entry, pasted lists, reorder from history
QuantityAnyMinimums, case packs, increments
PaymentCard at checkoutNet terms, purchase orders, credit limits, plus card or bank transfer
TaxCharged by defaultExemptions 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.

FeatureWhat it doesWhen
Trade account applicationProspects apply; you approve before they see pricesLaunch
Company accounts with rolesBuyer, approver, and admin under one company, with several ship-to locationsLaunch
Customer-specific pricingPrice lists and quantity breaks per company or tierLaunch
Quick order and reorderType or paste SKUs and quantities; repeat a past order in one stepLaunch
Quantity rulesMinimum order quantity, case-pack increments, minimum order valueLaunch
Payment termsNet 15/30/60, PO number capture, credit limit checkLaunch
Orders and documentsOrder status, invoices, tracking, statementsLaunch
Spreadsheet uploadLarge orders straight from the buyer's own fileLater (launch if typical orders run to dozens of lines)
QuotesBuyer requests a quote, a rep adjusts it, the buyer converts it to an orderLater
Rep ordering on behalfA sales rep logs in as the customer and places the orderLater
Approval workflowsOrders above a threshold wait for a managerLater
Punchout (cXML or OCI)The portal opens inside the buyer's procurement softwareOnly 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.

RouteFits whenWatch for
Shopify B2BYou already run Shopify, or want retail and wholesale on one store, and sell on a few price tiersCatalog cap below Plus; deposits and partial payments are Plus-only
BigCommerce B2B EditionYou need quoting, buyer roles, and rep ordering without custom codeConfirm current plan packaging with BigCommerce before you budget
OdooYou want the portal, inventory, invoicing, and purchasing in one databaseIt is an ERP project: data migration and process change, not just a storefront
Custom buildYour pricing, approval, or product rules don't fit a platform, or an ERP you are keeping must stay the source of truthYou 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.00

Twenty 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:

DataOwnerDirectionFreshness
Products and attributesERP or PIMTo portalDaily, or on change
Price listsERPTo portalOn change, re-checked at submit
Stock availabilityERP or warehouse systemTo portalMinutes, plus a live check at submit
Customers, terms, creditERP or accountingTo portalOn change
OrdersPortalTo ERPImmediately, with retries
Invoices and payment statusAccountingTo portalDaily, or on change
Shipments and trackingWarehouse system or carrierTo portalOn 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.

DriverLower effortHigher effort
PricingTwo or three tier price listsPer-customer contracts, formulas, stacking promotions
CatalogHundreds of SKUs with clean dataTens of thousands, variants, per-customer assortments
ERPOne system with a modern APINo API, several systems, custom fields
PaymentsCard plus invoice on termsCredit limits, deposits, partial payments, several currencies
WorkflowBuyers order directlyQuotes, approvals, rep-assisted ordering
RegionsOne country, one languageMulti-currency, multi-language, VAT handling
MigrationA new channelExisting 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

  1. 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.
  2. 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.
  3. Two-way integration. Orders post to the ERP; stock, order status, and invoices flow back.
  4. Terms and credit. Net terms at checkout, credit limit checks, statements, online invoice payment.
  5. Sales tools. Quotes, rep ordering, approvals, and spreadsheet upload, in the order your reps and buyers ask for them.
  6. 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.

Stay updated with Netalith

Get coding resources, product updates, and special offers directly in your inbox.