B2B Commerce
Overview
B2B commerce adds wholesale capabilities to your store: company accounts where multiple employees order under one credit limit, custom pricing per account, a quote-to-order workflow for large or custom orders, and net payment terms (Net 30/60/90) with invoice generation. Most platforms have first-party B2B features or dedicated apps that handle these requirements without custom development.
When to Use This Skill
- When onboarding wholesale customers who require account-level pricing, catalogs, and credit terms
- When building a distributor portal where multiple employees at the same company can place orders under a shared credit limit
- When implementing a configure-price-quote (CPQ) flow for custom or large-volume orders
- When replacing a phone/email-based wholesale ordering process with a self-service portal
- When B2B customers require purchase order numbers on invoices for their accounts payable process
Core Instructions
Step 1: Determine your platform and choose the right B2B tool
| Platform |
Recommended Tool |
Why |
| Shopify Plus |
Shopify B2B (built-in) |
Shopify Plus includes Company accounts, custom catalogs, payment terms, and a dedicated B2B checkout — no extra app needed |
| Shopify (non-Plus) |
Wholesale Club or Wholesale Gorilla |
Both apps add customer-tag-based wholesale pricing, minimum order quantities, and hidden wholesale sections without requiring Plus |
| WooCommerce |
WooCommerce B2B (WooCommerce.com extension) or B2BWoo |
WooCommerce B2B handles company registration, role-based pricing, and net terms; B2BWoo is a premium alternative |
| BigCommerce |
BigCommerce B2B Edition or the built-in Customer Groups |
BigCommerce B2B Edition adds company accounts and quotes; Customer Groups (all plans) handle tiered wholesale pricing |
| Custom / Headless |
Build company accounts, custom catalogs, and a quote workflow from scratch |
Full control over credit limits, approval workflows, and invoice generation |
Step 2: Set up company accounts and wholesale pricing
Shopify Plus — B2B (built-in)
- In Shopify admin, go to Customers → B2B → Companies → Create company
- Enter the company name, billing address, payment terms (e.g., Net 30), and credit limit
- Add company locations (shipping addresses) and assign buyer contacts to the company
- Create a Price List for the company: go to Customers → B2B → Price Lists → Create price list and set custom prices per product or a percentage discount on all products
- Assign the price list to the company — company buyers see these prices when logged in
- Company buyers see a B2B-specific checkout with net terms payment options and a PO number field
Quote workflow on Shopify Plus:
- Shopify's built-in B2B includes a Draft Orders feature — sales reps create draft orders for buyers, the buyer reviews and approves, then the draft converts to an order
- Go to Orders → Create order to create a draft; share the link with the buyer for approval
Shopify (non-Plus) — Wholesale Club
- Install Wholesale Club from the Shopify App Store
- Create a "Wholesale" customer tag in Shopify
- In Wholesale Club, create a discount tier for the "Wholesale" tag: e.g., 30% off everything for tagged customers
- Apply the wholesale tag to customer accounts when you approve them for wholesale
- Tagged customers see the discounted prices when logged in; non-tagged customers see retail prices
- For minimum order quantities: Wholesale Club's paid tier supports MOQs per product or order
WooCommerce
WooCommerce B2B (official extension):
- Install from WooCommerce.com
- Go to WooCommerce → B2B → Registration to create a wholesale account registration form with business details (company name, tax ID, etc.)
- Manually approve wholesale registrations in WooCommerce → B2B → Customers
- Set pricing rules: apply a percentage discount to user role "Wholesale Customer" across all products or per category
- For net terms: WooCommerce B2B adds a "Pay by Invoice" payment gateway — orders placed with net terms generate an invoice PDF and allow deferred payment
Alternative — WooCommerce Role-Based Pricing:
- Create a "Wholesale" user role (using the User Role Editor plugin)
- Use the WooCommerce Role-Based Pricing plugin to set per-role prices per product or per category
BigCommerce
Customer Groups (available on all plans):
- Go to Customers → Customer Groups → Add
- Create a "Wholesale" group with a percentage discount on all products or category-specific discounts
- Assign wholesale customers to this group manually or via registration form rules
- Customers in the Wholesale group see group-specific pricing at checkout
BigCommerce B2B Edition (add-on for growing wholesale operations):
- Contact BigCommerce sales to add B2B Edition to your plan
- B2B Edition adds: company accounts with multiple buyers, quote requests, corporate payment methods, and a buyer portal
- The buyer portal lets company admins manage users, view order history, and request quotes from a self-service interface
Step 3: Set up a quote workflow
For large or custom orders, a quote workflow lets buyers request a price before committing.
Shopify Plus
- Use Draft Orders — a sales rep creates a draft order with custom pricing
- Share the draft order link with the buyer via email
- The buyer reviews the order in Shopify's checkout and approves/places the order
- For a more formal quote system: install QuoteIQ or CPQ Configurator apps from the Shopify App Store
WooCommerce
- Install WooCommerce Request a Quote (free, by YITH or similar)
- Add a "Request a Quote" button to product pages — buyers add items to a quote cart
- Buyer submits the quote request; you receive an email with the items and quantities
- Edit the quote (adjust pricing) and send back to the buyer with an approval link
- Buyer approves → quote converts to a WooCommerce order automatically
BigCommerce B2B Edition
- B2B Edition includes a native quote module — buyers click "Request a Quote" on any product
- You receive the quote request in the BigCommerce admin, set pricing, and send it back
- Buyers approve quotes and place the order in one step
Step 4: Configure net payment terms and invoice generation
Net terms let B2B buyers pay after receiving goods (Net 30 = pay within 30 days of invoice).
Shopify Plus
- On the company record: set Payment Terms to Net 15, Net 30, Net 60, or Net 90
- When a B2B buyer places an order, Shopify creates a "due on" date automatically
- Track outstanding invoices in Customers → B2B → Orders → Invoices
- Send payment reminders: Shopify automatically emails buyers when invoices are due (configure in Settings → Notifications)
Accounting integration for net terms:
- Connect Shopify to QuickBooks Online or Xero via their Shopify connectors
- Net terms orders sync as unpaid invoices in QuickBooks/Xero
- Your accounting team manages the payment collection follow-up from QuickBooks/Xero
WooCommerce
- The WooCommerce B2B extension's "Pay by Invoice" gateway creates PDF invoices with due dates based on net terms
- Connect to QuickBooks via the QuickBooks Online WooCommerce extension for AR tracking
- For automated payment reminders: use AutomateWoo to send reminder emails 7 days before and on the invoice due date
BigCommerce
- B2B Edition's corporate payment methods include "Net terms" options
- Connect to QuickBooks or NetSuite via their BigCommerce connectors for invoice tracking
Step 5: Custom / Headless — core B2B data model
// Company account with credit management
interface Company {
id: string;
name: string;
taxId?: string; // EIN, VAT number
billingAddress: Address;
paymentTerms: 'prepay' | 'net15' | 'net30' | 'net60' | 'net90';
creditLimitCents: number | null; // null = no limit
creditUsedCents: number;
status: 'pending' | 'approved' | 'suspended';
}
// Check credit before placing an order
async function checkCreditAvailability(
companyId: string,
orderTotalCents: number
): Promise<{ approved: boolean; reason?: string }> {
const company = await db.companies.findById(companyId);
if (company.status !== 'approved') {
return { approved: false, reason: 'Company account not approved' };
}
if (company.creditLimitCents !== null) {
const availableCredit = company.creditLimitCents - company.creditUsedCents;
if (orderTotalCents > availableCredit) {
return {
approved: false,
reason: `Order exceeds available credit. Available: $${(availableCredit / 100).toFixed(2)}`,
};
}
}
return { approved: true };
}
// Record credit usage when order is placed (in same DB transaction as order creation)
async function consumeCredit(companyId: string, amountCents: number): Promise<void> {
// Atomic update prevents race condition when multiple buyers order simultaneously
await db.raw(
'UPDATE companies SET credit_used_cents = credit_used_cents + ? WHERE id = ? AND credit_used_cents + ? <= COALESCE(credit_limit_cents, 2147483647)',
[amountCents, companyId, amountCents]
);
}
Best Practices
- Require company approval before enabling net terms — run a basic credit check or manual review before setting net terms; at minimum, verify the company's business registration
- Enforce credit limits atomically — check and update credit in the same database transaction that creates the order; race conditions can allow two buyers to exceed the limit simultaneously
- Always put the PO number on invoices — B2B buyers require their internal PO number on every invoice for their accounts payable workflow; missing this causes payment delays of 30–60 days
- Release credit when orders are paid or cancelled — decrement credit_used when you receive payment; this lets buyers place new orders without waiting for manual adjustments
- Set quote expiration dates — approved quotes with custom pricing should expire after 30 days to prevent buyers from ordering at stale prices after costs change
- Audit all quote price changes — log who changed which line item price and when; this is important for margin tracking and potential disputes
Common Pitfalls
| Problem |
Solution |
| Individual buyer sees another company's pricing |
Scope all catalog and pricing queries strictly by company ID; test by logging in as buyers from different companies |
| Credit limit exceeded due to concurrent orders |
Use atomic SQL update with a WHERE clause checking credit headroom; Shopify Plus's built-in B2B handles this automatically |
| B2B checkout bypasses the approval flow |
Enforce approval checks server-side in your order creation logic, not just in the UI |
| Wholesale prices show to non-wholesale customers |
Customer tags on Shopify and user roles in WooCommerce must be verified server-side; never trust client-side state for pricing |
Related Skills
- @vendor-management
- @order-management-system
- @returns-refund-policy
- @multi-channel-selling
- @accounts-payable-management
1---2name: b2b-commerce3description: Enable wholesale and B2B sales with company accounts, custom catalogs, quote workflows, purchase orders, and net payment terms4---56# B2B Commerce78## Overview910B2B commerce adds wholesale capabilities to your store: company accounts where multiple employees order under one credit limit, custom pricing per account, a quote-to-order workflow for large or custom orders, and net payment terms (Net 30/60/90) with invoice generation. Most platforms have first-party B2B features or dedicated apps that handle these requirements without custom development.1112## When to Use This Skill1314- When onboarding wholesale customers who require account-level pricing, catalogs, and credit terms15- When building a distributor portal where multiple employees at the same company can place orders under a shared credit limit16- When implementing a configure-price-quote (CPQ) flow for custom or large-volume orders17- When replacing a phone/email-based wholesale ordering process with a self-service portal18- When B2B customers require purchase order numbers on invoices for their accounts payable process1920## Core Instructions2122### Step 1: Determine your platform and choose the right B2B tool2324| Platform | Recommended Tool | Why |25|----------|-----------------|-----|26| **Shopify Plus** | Shopify B2B (built-in) | Shopify Plus includes Company accounts, custom catalogs, payment terms, and a dedicated B2B checkout — no extra app needed |27| **Shopify (non-Plus)** | Wholesale Club or Wholesale Gorilla | Both apps add customer-tag-based wholesale pricing, minimum order quantities, and hidden wholesale sections without requiring Plus |28| **WooCommerce** | WooCommerce B2B (WooCommerce.com extension) or B2BWoo | WooCommerce B2B handles company registration, role-based pricing, and net terms; B2BWoo is a premium alternative |29| **BigCommerce** | BigCommerce B2B Edition or the built-in Customer Groups | BigCommerce B2B Edition adds company accounts and quotes; Customer Groups (all plans) handle tiered wholesale pricing |30| **Custom / Headless** | Build company accounts, custom catalogs, and a quote workflow from scratch | Full control over credit limits, approval workflows, and invoice generation |3132### Step 2: Set up company accounts and wholesale pricing3334#### Shopify Plus — B2B (built-in)35361. In Shopify admin, go to **Customers → B2B → Companies → Create company**372. Enter the company name, billing address, payment terms (e.g., Net 30), and credit limit383. Add company locations (shipping addresses) and assign buyer contacts to the company394. Create a **Price List** for the company: go to **Customers → B2B → Price Lists → Create price list** and set custom prices per product or a percentage discount on all products405. Assign the price list to the company — company buyers see these prices when logged in416. Company buyers see a B2B-specific checkout with net terms payment options and a PO number field4243**Quote workflow on Shopify Plus:**44- Shopify's built-in B2B includes a **Draft Orders** feature — sales reps create draft orders for buyers, the buyer reviews and approves, then the draft converts to an order45- Go to **Orders → Create order** to create a draft; share the link with the buyer for approval4647#### Shopify (non-Plus) — Wholesale Club48491. Install **Wholesale Club** from the Shopify App Store502. Create a "Wholesale" customer tag in Shopify513. In Wholesale Club, create a discount tier for the "Wholesale" tag: e.g., 30% off everything for tagged customers524. Apply the wholesale tag to customer accounts when you approve them for wholesale535. Tagged customers see the discounted prices when logged in; non-tagged customers see retail prices546. For minimum order quantities: Wholesale Club's paid tier supports MOQs per product or order5556#### WooCommerce5758**WooCommerce B2B (official extension):**591. Install from WooCommerce.com602. Go to **WooCommerce → B2B → Registration** to create a wholesale account registration form with business details (company name, tax ID, etc.)613. Manually approve wholesale registrations in WooCommerce → B2B → Customers624. Set pricing rules: apply a percentage discount to user role "Wholesale Customer" across all products or per category635. For net terms: WooCommerce B2B adds a "Pay by Invoice" payment gateway — orders placed with net terms generate an invoice PDF and allow deferred payment6465**Alternative — WooCommerce Role-Based Pricing:**66- Create a "Wholesale" user role (using the **User Role Editor** plugin)67- Use the **WooCommerce Role-Based Pricing** plugin to set per-role prices per product or per category6869#### BigCommerce7071**Customer Groups (available on all plans):**721. Go to **Customers → Customer Groups → Add**732. Create a "Wholesale" group with a percentage discount on all products or category-specific discounts743. Assign wholesale customers to this group manually or via registration form rules754. Customers in the Wholesale group see group-specific pricing at checkout7677**BigCommerce B2B Edition (add-on for growing wholesale operations):**781. Contact BigCommerce sales to add B2B Edition to your plan792. B2B Edition adds: company accounts with multiple buyers, quote requests, corporate payment methods, and a buyer portal803. The buyer portal lets company admins manage users, view order history, and request quotes from a self-service interface8182### Step 3: Set up a quote workflow8384For large or custom orders, a quote workflow lets buyers request a price before committing.8586#### Shopify Plus87881. Use **Draft Orders** — a sales rep creates a draft order with custom pricing892. Share the draft order link with the buyer via email903. The buyer reviews the order in Shopify's checkout and approves/places the order914. For a more formal quote system: install **QuoteIQ** or **CPQ Configurator** apps from the Shopify App Store9293#### WooCommerce94951. Install **WooCommerce Request a Quote** (free, by YITH or similar)962. Add a "Request a Quote" button to product pages — buyers add items to a quote cart973. Buyer submits the quote request; you receive an email with the items and quantities984. Edit the quote (adjust pricing) and send back to the buyer with an approval link995. Buyer approves → quote converts to a WooCommerce order automatically100101#### BigCommerce B2B Edition102103- B2B Edition includes a native quote module — buyers click "Request a Quote" on any product104- You receive the quote request in the BigCommerce admin, set pricing, and send it back105- Buyers approve quotes and place the order in one step106107### Step 4: Configure net payment terms and invoice generation108109Net terms let B2B buyers pay after receiving goods (Net 30 = pay within 30 days of invoice).110111#### Shopify Plus1121131. On the company record: set **Payment Terms** to Net 15, Net 30, Net 60, or Net 901142. When a B2B buyer places an order, Shopify creates a "due on" date automatically1153. Track outstanding invoices in **Customers → B2B → Orders → Invoices**1164. Send payment reminders: Shopify automatically emails buyers when invoices are due (configure in Settings → Notifications)117118**Accounting integration for net terms:**119- Connect Shopify to **QuickBooks Online** or **Xero** via their Shopify connectors120- Net terms orders sync as unpaid invoices in QuickBooks/Xero121- Your accounting team manages the payment collection follow-up from QuickBooks/Xero122123#### WooCommerce124125- The **WooCommerce B2B** extension's "Pay by Invoice" gateway creates PDF invoices with due dates based on net terms126- Connect to QuickBooks via the **QuickBooks Online** WooCommerce extension for AR tracking127- For automated payment reminders: use **AutomateWoo** to send reminder emails 7 days before and on the invoice due date128129#### BigCommerce130131- B2B Edition's corporate payment methods include "Net terms" options132- Connect to QuickBooks or NetSuite via their BigCommerce connectors for invoice tracking133134### Step 5: Custom / Headless — core B2B data model135136```typescript137// Company account with credit management138interface Company {139 id: string;140 name: string;141 taxId?: string; // EIN, VAT number142 billingAddress: Address;143 paymentTerms: 'prepay' | 'net15' | 'net30' | 'net60' | 'net90';144 creditLimitCents: number | null; // null = no limit145 creditUsedCents: number;146 status: 'pending' | 'approved' | 'suspended';147}148149// Check credit before placing an order150async function checkCreditAvailability(151 companyId: string,152 orderTotalCents: number153): Promise<{ approved: boolean; reason?: string }> {154 const company = await db.companies.findById(companyId);155 if (company.status !== 'approved') {156 return { approved: false, reason: 'Company account not approved' };157 }158 if (company.creditLimitCents !== null) {159 const availableCredit = company.creditLimitCents - company.creditUsedCents;160 if (orderTotalCents > availableCredit) {161 return {162 approved: false,163 reason: `Order exceeds available credit. Available: $${(availableCredit / 100).toFixed(2)}`,164 };165 }166 }167 return { approved: true };168}169170// Record credit usage when order is placed (in same DB transaction as order creation)171async function consumeCredit(companyId: string, amountCents: number): Promise<void> {172 // Atomic update prevents race condition when multiple buyers order simultaneously173 await db.raw(174 'UPDATE companies SET credit_used_cents = credit_used_cents + ? WHERE id = ? AND credit_used_cents + ? <= COALESCE(credit_limit_cents, 2147483647)',175 [amountCents, companyId, amountCents]176 );177}178```179180## Best Practices181182- **Require company approval before enabling net terms** — run a basic credit check or manual review before setting net terms; at minimum, verify the company's business registration183- **Enforce credit limits atomically** — check and update credit in the same database transaction that creates the order; race conditions can allow two buyers to exceed the limit simultaneously184- **Always put the PO number on invoices** — B2B buyers require their internal PO number on every invoice for their accounts payable workflow; missing this causes payment delays of 30–60 days185- **Release credit when orders are paid or cancelled** — decrement credit_used when you receive payment; this lets buyers place new orders without waiting for manual adjustments186- **Set quote expiration dates** — approved quotes with custom pricing should expire after 30 days to prevent buyers from ordering at stale prices after costs change187- **Audit all quote price changes** — log who changed which line item price and when; this is important for margin tracking and potential disputes188189## Common Pitfalls190191| Problem | Solution |192|---------|----------|193| Individual buyer sees another company's pricing | Scope all catalog and pricing queries strictly by company ID; test by logging in as buyers from different companies |194| Credit limit exceeded due to concurrent orders | Use atomic SQL update with a WHERE clause checking credit headroom; Shopify Plus's built-in B2B handles this automatically |195| B2B checkout bypasses the approval flow | Enforce approval checks server-side in your order creation logic, not just in the UI |196| Wholesale prices show to non-wholesale customers | Customer tags on Shopify and user roles in WooCommerce must be verified server-side; never trust client-side state for pricing |197198## Related Skills199200- @vendor-management201- @order-management-system202- @returns-refund-policy203- @multi-channel-selling204- @accounts-payable-management