Skip to content

B2B Suite

B2B Suite turns a standard Magento store into a wholesale/trade store. It adds the features B2B buyers expect and B2B sellers need to run a margin-aware sales desk:

  • a full request-a-quote (RFQ) workflow — customers build a quote, you negotiate line prices, approve or reject, and convert the agreed quote into a real Magento order;
  • branded PDF quotes with your logo, address and terms;
  • auto-approval guardrails so small, low-discount quotes clear without a human;
  • Hide-Price / Call-for-Price rules — show “Request a Quote” or “Call for Price” instead of a price for chosen products, categories or customer groups;
  • Price Requests — a lightweight “call for price” enquiry inbox;
  • PO-number and delivery-date checkout fields for purchase-order buyers.

Everything works on a standard Luma store and on a headless (Astro) storefront through GraphQL and REST — driven by the same rule engine, so both behave identically.

B2B quotes grid in the admin

Magento

Open Source 2.4.9 GA (and later 2.4.x).

PHP

Tested on 8.4 and 8.5.

Storefront

Luma/PWA and headless (Astro) via GraphQL/REST.

Guests

Optional guest quotes with auto-created accounts.
  1. Enable the module: Stores → Configuration → AgenticEcom · Sales, Customers & Marketing → B2B Suite → General Settings → Enable B2B Suite = Yes. (Admin screens live under Sales → B2B Suite: B2B Quotes, Price Requests, Hide Price Rules.)

  2. Open General Settings → Quick Setup and click Apply Recommended B2B Defaults — this sets a 14-day quote expiry, hides prices for guests, enables PO numbers and delivery dates, and turns on email notifications. (You can fine-tune everything afterwards.)

  3. Decide who can quote: set Allow Quote Requests for Customer Groups (e.g. Wholesale), and whether guests may request quotes.

  4. Place “Add to Quote” buttons on the product page and/or category listing.

  5. (Optional) Turn on Hide Price / Call for Price to replace prices with a quote CTA for trade products or groups.

  6. Submit a test quote from the storefront and process it in Sales → B2B Quotes.

  1. Request — a customer adds products via Add to Quote (PDP/PLP) and submits a request with their details (name, email, company, optional PO number and delivery date, and — if enabled — a proposed price per line).

  2. Pending — the quote lands in Sales → B2B Quotes as Draft/Pending. You’re notified by email (if Admin Notifications are on).

  3. Negotiate — open the quote, adjust quantities and unit prices, see the margin against your cost attribute, and add internal notes. Every change is recorded in the quote history.

  4. Approve / Reject — approve the quote (manually, or automatically within the guardrails you set) or reject it with a reason. The customer is emailed.

  5. Accept → Convert — the customer accepts the approved quote; you Convert to Order and it becomes a standard Magento order with the agreed items and prices.

  6. Expire / Remind — approved quotes can expire after N days, with a reminder email sent beforehand.

Open any quote from Sales → B2B Quotes. The detail screen is organised into tabs, with Approve, Reject, Convert to Order and Download PDF actions in the toolbar:

B2B quote detail screen

TabWhat you do here
Quote InformationThe header: Quote # (RFQ number), status, customer name & email, company, PO number, requested delivery date.
Pricing & NegotiationAdjust unit prices and discounts line by line; margin is shown against your Cost Attribute.
Quote ItemsThe line items — SKU, quantity, price, line note. Edit quantities or remove lines.
Expiration & ReminderPer-quote expiry date and reminder schedule (overrides the global default).
Notes & CommentsInternal notes and the customer-facing comment thread; the full change history.
Order ConversionConvert the approved quote into a Magento order and see the resulting order link.

The grid itself supports filtering, search and mass actions (Approve, Reject, Cancel, Delete). You can also create a quote on a customer’s behalf from the admin — useful when a buyer phones or emails their requirement.

Replace the price (and optionally the Add-to-Cart button) with a call-to-action for selected products, categories or customer groups. There are two ways to target it, and rules win over the global setting.

Sales → B2B Suite → Hide Price Rules. Each rule targets products by conditions (SKU, attribute, category, customer group), carries a priority, and has its own mode and replacement content. The lowest priority number is evaluated first, and the first matching rule wins.

Hide-price rules grid

Inside a rule:

Edit a hide-price rule

FieldWhat it does
Rule NameInternal label (e.g. Trade Pricing).
Enable RuleToggle the rule on/off without deleting it.
ModeWhat the storefront shows — see the five modes below.
PriorityLower number = evaluated first. Default 0. The first matching rule wins.
Replacement Text / HTMLWhat appears where the price/button was. Supports HTML; use {{request_quote_button}} to drop in the Astro quote button.
Rule ConditionsStandard Magento condition tree — target by SKU, attribute set, category, price, customer group, etc.

Configuration → B2B Suite → Hide Price / Call for Price sets a single store-wide rule by customer group and/or category. Use this when you just want “hide all prices for guests”.

hide_all — hides both the price and the Add-to-Cart button. The product becomes “enquiry only”.

A lightweight “call for price” enquiry inbox. When a shopper uses the hide-price Get a Quote / popup form, the enquiry lands in Sales → B2B Suite → Price Requests and you reply by email straight from the admin.

Price requests grid

Stores → Configuration → AgenticEcom · Sales, Customers & Marketing → B2B Suite

B2B Suite configuration

FieldWhat it does
Enable B2B SuiteMaster on/off switch for the whole module.
Frontend Quote URL KeyURL key for the quote pages ({key}/cart/, {key}/account/). Default quote. Min 3 chars.
Allow Guest Quote RequestsLet visitors request a quote without logging in.
Auto-Create Customer Account for GuestsWhen a guest submits a quote, create a customer account for them automatically (depends on guest quotes).
Allow Quote Requests for Customer GroupsWhich groups can request quotes. Leave empty for all groups.
Minimum Quote AmountMinimum cart total required to request a quote. 0 disables the check.
”Add to Quote” on Product PageShow/hide/position the Add-to-Quote button on the PDP.
”Add to Quote” on Category ListingSame control for the category/search listing (PLP).
Disable Quotation for Categories”Add to Quote” is hidden for products in these categories.
FieldWhat it does
Allow Customer to Edit Submitted QuotesLet customers change a quote after submitting it.
Allow Customer to Propose PricesCustomers can suggest their own price per line item when requesting.
Quote Expiry (Days)Days before an approved quote expires. Overridable per quote; empty disables expiry.
Send Reminder (Days Before Expiry)Send a reminder email this many days before a quote expires.
Auto-Approve QuotesApprove quotes automatically when they’re within the guardrails below.
Auto-Approve if Discount Less Than (%)Auto-approve only if total discount is under this percentage (1–100).
Auto-Approve if Total Below (Amount)Auto-approve only if the quote total is under this amount. 0 disables.
Cost Attribute (for Margin Display)Product attribute used to compute profit margin on quotes (e.g. cost).
Show Discount % on Approved QuotesShow the customer their savings percentage on approved quotes.
Custom Shipping Method LabelDisplay name for the quote-specific shipping method (e.g. “Quote Shipping Rate”).
FieldWhat it does
Enable Hide PriceTurn the global hide-price behaviour on.
Default Hide ModeOne of the five modes above, applied store-wide.
Hide Prices for Customer GroupsGroups the global rule applies to. Empty = product-level rules only.
Hide Prices for CategoriesHide price for all products in these categories.
Exclude Product IDsComma-separated product IDs that always show their price.
Replacement TextText shown instead of the price (e.g. “Call for Price”).
Replacement ImageOptional image shown instead of the price.
Hide “Add to Cart” ButtonHide it, or replace it with a custom button.
Replace Button Text / Link URLLabel and target for the replacement button (URL, or popup for the AJAX quote form).
Show “Login to See Price” LinkShow a login prompt to guests in place of the price.
Hide “Add to Wishlist” / “Add to Compare”Also hide wishlist/compare actions on affected products.
GDPR Consent Checkbox / Consent TextRequire and word a consent checkbox on the enquiry form.
FieldWhat it does
Send Admin Email on New QuoteNotify staff whenever a quote is submitted.
Admin Email AddressRecipient of new-quote notifications.
Email SenderStore identity used as the sender.
New Quote Email TemplateTemplate for the new-quote notification.
Price Request Email TemplateTemplate for hide-price “Get a Quote” popup submissions.
FieldWhat it does
Enable Customer Email NotificationsMaster switch for buyer-facing emails.
Email SenderStore identity used as the sender.
Quote Submitted / Approved / Modified / Rejected / ExpiredA template per quote-status transition.
Expiry Reminder TemplateThe reminder sent before a quote expires.
Admin Reply Email TemplateSent when an admin replies to a hide-price (price) request.
FieldWhat it does
Attach PDF to Approved Quote EmailAutomatically attach the quote PDF when a quote is approved.
Company Name / AddressPrinted in the PDF header.
Company LogoYour logo on the PDF.
Terms & Conditions TextPrinted in the PDF footer.
FieldWhat it does
Enable PO Number Field (+ Required)Add a Purchase-Order number field at checkout, optionally mandatory.
Enable Delivery Date Picker (+ Required)Add a requested-delivery-date picker, optionally mandatory.
Minimum Delivery Lead Time (Days)Earliest selectable delivery date, measured from today.
# Product fields the storefront uses to decide what to show
{ products(filter: { sku: { eq: "AE-MOD-ASTROCORS" } }) {
items { sku
agentic_hide_price agentic_hide_price_mode agentic_hide_price_text
agentic_quote_allowed } } }
# Submit a quote request from a list of items (no Magento cart needed — used by
# the decoupled quote cart). Works for guests (pass customer_name/customer_email).
mutation {
submitB2bQuoteRequest(input: {
items: [{ sku: "AE-MOD-ASTROCORS", qty: 5 }]
customer_name: "Jane Buyer", customer_email: "jane@acme.test", company_name: "Acme"
}) { success message quote_increment_id }
}
# List the signed-in customer's quotes, then accept an approved one
# (acceptB2bQuote returns a checkout-ready Cart; quote_id is a String).
query { customerB2bQuotes { items { quote_id status grand_total created_at } total_count } }
mutation { acceptB2bQuote(quote_id: "12") { id total_quantity } }

requestB2bQuote(input: { cart_id }) turns an existing Magento cart into a quote (returns the Cart). Cart B2B fields are also exposed: agentic_is_b2b_quote, agentic_quote_status, agentic_po_number, agentic_delivery_date, agentic_quote_notes, agentic_quote_expires_at.

Can customers negotiate the price?

Yes — enable Allow Customer to Propose Prices. Customers can propose a price per line when requesting; you then approve, counter or reject on the Pricing & Negotiation tab. Every change is recorded in the quote history.

Does a quote become a real order?

Yes. Once you approve and the customer accepts, Convert to Order creates a standard Magento order with the agreed items and prices, so the rest of your fulfilment, invoicing and shipping works unchanged.

How do I let small quotes clear automatically?

Turn on Auto-Approve Quotes and set the two guardrails — discount under X % and total under Y. Quotes inside both limits approve instantly; anything outside waits for a human, so you keep control of margin on the big deals.

What’s the difference between a Hide-Price rule and the global setting?

The global setting is one store-wide rule by group/category — good for “hide all prices for guests”. Rules are granular (conditions, priority, per-rule mode and text) and take priority over the global setting, so you can carve out exceptions. The first matching rule (lowest priority number) wins.

Will hide-price rules work on my headless storefront?

Yes — the GraphQL product fields (agentic_hide_price, agentic_hide_price_mode, agentic_hide_price_text) are produced by the same HidePriceMatcher as the Luma storefront, matched against the current customer group, so both behave identically with no duplicated logic.

Can buyers add a PO number and required delivery date?

Yes — enable the Checkout Custom Fields group. You can add a PO Number field and a Delivery Date picker, make either mandatory, and enforce a minimum lead time so buyers can’t pick an impossible date.

Is it secure?

Admin actions are behind a granular ACL (AgenticEcom_B2bSuite); quote endpoints validate input server-side; guest submissions are gated by the Allow Guest Quotes setting; and the module is verified clean on PHP 8.4 and 8.5.