Grocery Express: A hybrid B2B and B2C commerce build on nopCommerce 4.70 with Syspro ERP





A brief background on Grocery Express
Grocery Express is a South African foodservice and grocery supplier serving both trade buyers and consumers. Established in 2005, it joined the JH Group and its Foodgistics ecosystem in 2023. Its storefront runs on the Comalytics and nopStation hybrid B2B and B2C stack, built on nopCommerce 4.70 with Syspro as the ERP system of record. Jannie, our partner at Comalytics, approached team nopStation to extend the storefront to serve two very different buyer types on one site: trade accounts that need credit, account pricing, loyalty, delivery routes, and sales-rep support, and consumer buyers that need a lighter way to register and order. Standard nopCommerce follows a single B2C model, so meeting both sets of rules on one platform was the heart of the engagement.
Challenges
Grocery Express came to us with a live nopCommerce 4.70 storefront and a clear goal: one public site for trade and consumer buyers, with Syspro as the single source of truth for accounts, stock, and pricing. After reviewing the platform and the client's commercial rules, our team identified the key challenges below.
Serving two commerce models on one storefront: A single public site had to support wholesale trade accounts and walk-in consumers at once, without splitting into two shops. The two audiences follow different rules for registration, pricing, payment, and fulfilment. If the site could not tell them apart, buyers would see confused registration, the wrong prices, and orders posted to Syspro as the wrong document type.
Correct ERP identity for trade and consumer buyers: B2B buyers must map to a real Syspro company account carrying their credit limit, loyalty balance, price group, assortment, and delivery routes. Most consumers have no trade account and cannot be forced into that model. Without a clean split, consumers could not order or would inherit trade pricing by mistake, while trade buyers would lose the account data their purchasing depends on.
Wholesale pricing, credit, loyalty, and pack rules: Trade purchasing runs on rules standard nopCommerce does not cover: special and group pricing, payment on account, credit and loyalty balances, box and kilogram pack increments, and prices often hidden until login. Left unenforced online, these gaps cause wrong margins, phone price checks, invalid pack quantities, unused loyalty, and credit risk.
Delivery routing, cutoffs, and deliver versus collect: Wholesale fulfilment depends on ERP delivery routes, warehouses, and cutoff times, and on whether an address sits on a delivery route or is collect-only. Cold-chain grocery cannot rely on generic shipping. Get it wrong and orders ship from the wrong warehouse, miss their cutoff, or promise delivery the network can only fulfil as collection.
Consumer ship-to and address experience: Consumer buyers need a flexible ship-to and address flow with validation, different from the ERP ship-to lists tied to company accounts. Forcing consumer addresses through a B2B-only model would create failed deliveries, checkout friction, and support load.
Our Solution
Our team took a plugin-driven approach on the existing nopCommerce 4.70 codebase rather than rebuilding the storefront. The work spans the nopStation B2B stack, chiefly the B2BB2CFeatures, ERPIntegrationCore, ManageB2CandB2BCustomer, SysproIntegration, and Payments.B2BAccount plugins, with order-processing overrides where trade rules needed custom logic. The platform runs on .NET 8 with an MSSQL database on custom hosting, DooFinder search, and Peach Payments for card and EFT. One Emporium-themed catalog then behaves differently for each buyer once identity is known.
Dual B2B and B2C user model: Every ERP-linked user is typed as a B2B or B2C user, with ordering and registration enabled per type. An eight-role access model then applies distinct pricing, credit, ordering, and document-type rules per segment, from trade accounts and sales representatives to consumers and accounting staff. Both audiences browse the same Emporium storefront, categories, brands, and DooFinder search; behaviour diverges only after identity, when prices, payment, credit, loyalty, ship-tos, routes, and order type take effect.

Image 1.2: B2B trade registration form

Image 1.3: B2C consumer registration form
Separate registration with a B2C default account: The storefront first asks whether the buyer already has an account, then routes them accordingly. B2B registration can carry trade and credit application fields with admin approval; B2C registration is lighter and attaches the buyer to a configured default B2C ERP account and organization, so consumers order without a full trade setup.
Dual ERP order and quote document types: Orders and quotes post to Syspro as one of four types, B2B Sales Order, B2B Quote, B2C Sales Order, or B2C Quote, keeping trade and consumer transactions separate at the ERP level so the correct pricing, credit, loyalty, and fulfilment rules apply. A scheduled sync keeps accounts, products, stock, prices, ship-tos, invoices, routes, and credit aligned, and place-order runs post each transaction into Syspro at checkout.
B2B account commerce and pricing: Trade buyers inherit their company account's commercial rules. Pricing resolves through five tiers, from list price and group or account price to special or contract price, a combined price, and a live real-time ERP price check, with login-gated prices where required. Accounts also carry credit limits and payment on account, a pre-filtered assortment, and box or kilogram pack increments. For constrained supply, special prices can enforce a percentage-of-allocated-stock rule so each account draws only its fair share, and variable-weight products can attract a COD surcharge for cash-on-delivery accounts.

Image 1.4: Product detail — fixed pack quantity increment

Image 1.5: Admin — ERP group/account price codes (tiered pricing)
Loyalty balances and ERP payment sync: Trade accounts carry a loyalty balance and card, and buyers can apply loyalty at checkout. Usage is tracked with an in-use and failed history, order notes record the credit and loyalty applied, and loyalty payments sync back to Syspro alongside Peach Payments, treating loyalty as part of the account relationship rather than a coupon.
Delivery routes, warehouses, and cutoffs: Ship-to addresses link to ERP delivery route codes, and the route sets the warehouse when an order posts to Syspro. Delivery days, cutoff times, advanced cutoffs, and optional ERP-determined dates control when an order can be fulfilled, which matters for scheduled cold-chain delivery. Administrators manage routes from a dedicated screen kept current by a scheduled sync.
Deliver versus collect geofence checks: At checkout, an address is evaluated against delivery-route coverage and no-shop or collect-only zones, and the delivery option is set to deliver or collect accordingly. This OPSI-style check is especially relevant for consumer ship-tos and stops the site promising delivery where only collection is available.

Image 1.6: Admin — delivery routes, cutoffs, and warehouse mapping
Consumer ship-to and trade self-service: Consumer buyers use their default ERP account while managing their own ship-to addresses through a selector widget with validation and sales-org awareness. For repeat purchasing, buyers work from favourites and quick-order templates and reorder from their last five or frequent items, while trade accounts self-serve invoices and statements. Sales representatives can also impersonate assigned trade buyers to place or assist with orders in the field.
Together these capabilities let one storefront run two commercial models side by side, with Syspro as the system of record for both. A Flutter-based mobile app for iOS and Android is planned as the next phase.
Results:
- Delivered a hybrid B2B and B2C storefront on a single nopCommerce 4.70 and .NET 8 instance, avoiding two separate shops.
- Automated posting of four ERP document types to Syspro so trade and consumer transactions stay separate at the ERP level.
- Implemented a five-tier pricing engine with login-gated prices and a live ERP price check, replacing phone-based price enquiries for trade accounts.
- Enabled account credit, loyalty balances, and loyalty payment sync back to Syspro as part of the trade relationship.
- Integrated delivery routes, warehouses, and cutoffs with deliver-versus-collect geofence checks for scheduled cold-chain fulfilment.
- Added trade self-service through favourites and quick order, reorder, invoices and statements, and sales-rep impersonation.
- Enforced fair stock allocation and variable-weight COD surcharges for constrained-supply and weight-based grocery lines.