Magento
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.

Install
Section titled “Install”Install B2B Suite with Composer using your AgenticEcom licence key (find it on your My Licences page — one key unlocks every module you own):
# 1. Register the AgenticEcom repository (once per store)composer config repositories.agenticecom composer https://repo.agenticecom.netcomposer config --global --auth http-basic.repo.agenticecom.net <YOUR-LICENCE-KEY> x
# 2. Require this modulecomposer require agenticecom/module-b2b-suite
# 3. Apply itphp bin/magento setup:upgrade && php bin/magento setup:di:compile && php bin/magento cache:flushCompatibility
Section titled “Compatibility”PHP
Storefront
Guests
Quick start
Section titled “Quick start”-
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.)
-
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.)
-
Decide who can quote: set Allow Quote Requests for Customer Groups (e.g. Wholesale), and whether guests may request quotes.
-
Place “Add to Quote” buttons on the product page and/or category listing.
-
(Optional) Turn on Hide Price / Call for Price to replace prices with a quote CTA for trade products or groups.
-
Submit a test quote from the storefront and process it in Sales → B2B Quotes.
The quote lifecycle
Section titled “The quote lifecycle”-
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).
-
Pending — the quote lands in Sales → B2B Quotes as Draft/Pending. You’re notified by email (if Admin Notifications are on).
-
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.
-
Approve / Reject — approve the quote (manually, or automatically within the guardrails you set) or reject it with a reason. The customer is emailed.
-
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.
-
Expire / Remind — approved quotes can expire after N days, with a reminder email sent beforehand.
What the buyer actually does
Section titled “What the buyer actually does”Before the admin side makes sense, it helps to see the four screens your customer moves through. Everything below is stock Luma with no theme customisation.
-
They add products to a quote. Add to Quote sits beside Add to Cart on the product page. Quantity and any product options are carried across exactly as chosen — so a quote for “2 × Standard support tier” arrives as that, not as a bare SKU.

-
They review the quote basket and send the request. This is a separate basket from the shopping cart — a buyer can collect a requirement without disturbing anything they are also buying outright. Quantities are editable here, and the form asks only for what you need to price the job.

-
They watch it in My Quotes. Every quote they have raised, with its current status.

-
They accept the approved quote and check out. Your reply and the agreed line prices are on the page, and Accept & add to basket builds their basket at those prices — no waiting for someone to convert it by hand.

Working a quote in the admin
Section titled “Working a quote in the admin”Open any quote from Sales → B2B Quotes. The detail screen is organised into seven tabs, and the toolbar carries Back · Reject · Convert to Order · Download PDF · Proforma PDF · Email Proforma · Save and Continue Edit · Approve · Save Quote:

| Tab | What you do here |
|---|---|
| Quote Information | The header: Quote # (RFQ number), status, customer name & email, company, PO number, requested delivery date. |
| Pricing & Negotiation | Adjust unit prices and discounts line by line; margin is shown against your Cost Attribute. Also where the shipping amount is set. |
| Quote Items | The line items — SKU, quantity, price, line note. Edit quantities or remove lines. |
| Expiration & Reminder | Per-quote expiry date and reminder schedule (overrides the global default). |
| Notes & Comments | Internal notes and the customer-facing comment thread; the full change history. |
| Proforma Invoice | Destination country, VAT treatment, lead times and bank details for the proforma — see Proforma invoices. |
| Order Conversion | Convert the approved quote into a Magento order and see the resulting order link. |
Pricing & Negotiation is where you actually do the deal — set each unit price, or apply an overall discount or surcharge, and watch the margin against your cost attribute as you go:

Quote Items is the requirement itself — search to add products, change quantities, remove lines, then Save Items:

Notes & Comments keeps the negotiation trail. Each entry is marked visible to the customer or internal only, so you can record “matched competitor price, do not repeat” without the buyer seeing it:

Proforma invoices — getting paid before you ship
Section titled “Proforma invoices — getting paid before you ship”A proforma is how most UK trade suppliers take payment before goods leave the building. The Proforma Invoice tab prepares it, and the two toolbar actions produce it: Proforma PDF downloads a copy, Email Proforma sends it to the buyer.

| Field | What it does |
|---|---|
| Destination Country | VAT is worked out from your own tax rules for this country — 20% for a UK delivery, 0% for an export. |
| VAT % Override | Leave blank to auto-calculate. Fill it in only to force a rate. |
| Shipping Time | Free text, e.g. “3–5 working days”. Printed only when filled in. |
| Lead Time to Ship | Free text, e.g. “Ships in 2 weeks”. Printed only when filled in. |
| Hide Customer Notes on Proforma | Keeps the buyer’s own message off the printed document. |
| Show Bank Transfer Details | Prints your bank details so the buyer can pay on receipt. |
| Bank Transfer Instructions | Pre-filled from Stores → Configuration → Payment Methods → Bank Transfer when left blank. |
| Send-a-copy Email | Email Proforma also copies this address — usually your accounts inbox. |
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.
Hide Price / Call for Price
Section titled “Hide Price / Call for Price”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.
Rules (recommended — granular)
Section titled “Rules (recommended — granular)”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.

Inside a rule:

| Field | What it does |
|---|---|
| Rule Name | Internal label (e.g. Trade Pricing). |
| Enable Rule | Toggle the rule on/off without deleting it. |
| Mode | What the storefront shows — see the six modes below. |
| Priority | Lower number = evaluated first. Default 0. The first matching rule wins. |
| Replacement Text / HTML | What appears where the price/button was. Supports HTML; use {{request_quote_button}} to drop in the Astro quote button. |
| Cart Action (this rule) | Overrides the store-wide Add-to-Cart replacement for products this rule matches: inherit the global behaviour, show an Add to Quote button, or show a custom link. |
| Custom Link URL | The target, used only when Cart Action is set to the custom link. |
Rule Conditions is four plain fields, not a condition tree:
| Field | What it does |
|---|---|
| Customer Groups | Multi-select. Leave empty to match every group. |
| Specific Product SKUs or IDs | Comma-separated. Leave empty to match on category alone. |
| Category IDs | Comma-separated. |
| Apply Only on Weekends | Restricts the rule to Saturday and Sunday. |
Global config (simple — store-wide)
Section titled “Global config (simple — store-wide)”Configuration → B2B Suite → Price & Add-to-Cart Rules sets a single store-wide rule by customer group and/or category. Use this when you just want “hide all prices for guests”.
The six modes
Section titled “The six modes”hide_all — hides both the price and the Add-to-Cart button. The product becomes
“enquiry only”.
hide_price_only — hides the price but keeps Add to Cart (useful when checkout
pricing is negotiated later).
quote_only — the only mode that keeps the price visible while removing Add to Cart,
replacing it with Add to Quote. Use it when you are happy for buyers to see list price
but every sale must go through a quote — the usual trade-counter arrangement.
replace_with_quote — swaps Add to Cart for a Request a Quote button that drops the
product into the RFQ flow.
call_for_price — shows your Replacement Text (e.g. “Call for Price”) and optionally
a contact/enquiry CTA.
login_to_see — hides the price from guests and shows a Login to see price link;
logged-in eligible customers see it normally.
Price Requests
Section titled “Price Requests”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.

Configuration reference
Section titled “Configuration reference”Stores → Configuration → AgenticEcom · Sales, Customers & Marketing → B2B Suite

General Settings
Section titled “General Settings”| Field | What it does |
|---|---|
| Enable B2B Suite | Master on/off switch for the whole module. |
| Frontend Quote URL Key | URL key for the quote pages ({key}/cart/, {key}/account/). Default quote. Min 3 chars. |
| Allow Guest Quote Requests | Let visitors request a quote without logging in. |
| Auto-Create Customer Account for Guests | When a guest submits a quote, create a customer account for them automatically (depends on guest quotes). |
| Allow Quote Requests for Customer Groups | Which groups can request quotes. Leave empty for all groups. |
| Minimum Quote Amount | Minimum cart total required to request a quote. 0 disables the check. |
| ”Add to Quote” on Product Page | Show/hide/position the Add-to-Quote button on the PDP. |
| ”Add to Quote” on Category Listing | Same control for the category/search listing (PLP). |
| Disable Quotation for Categories | ”Add to Quote” is hidden for products in these categories. |
| Hide Cart (Catalogue / Quote-Only Mode) | Hides the cart entirely, turning the store into a browse-and-request-a-quote catalogue with no direct checkout. Synced to a headless storefront via Global Data, so the Astro MiniCart honours it too. |
Quote Management
Section titled “Quote Management”| Field | What it does |
|---|---|
| Allow Customer to Edit Submitted Quotes | Let customers change a quote after submitting it. |
| Allow Customer to Propose Prices | Customers 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 Quotes | Approve 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 Quotes | Show the customer their savings percentage on approved quotes. |
| Custom Shipping Method Label | Display name for the quote-specific shipping method (e.g. “Quote Shipping Rate”). |
Price & Add-to-Cart Rules (global config)
Section titled “Price & Add-to-Cart Rules (global config)”This is the config group’s exact name in the admin (Stores → Configuration → B2B Suite → Price & Add-to-Cart Rules).
| Field | What it does |
|---|---|
| Enable Price / Add-to-Cart Rules | Turn the global hide-price behaviour on. |
| Mode | One of the six modes above, applied store-wide. |
| Apply to Customer Groups | Groups the global rule applies to. Empty = product-level rules only. |
| Apply to Categories | Hide price for all products in these categories. |
| Exclude Product IDs | Comma-separated product IDs that always show their price. |
| Replacement Text | Text shown instead of the price (e.g. “Call for Price”). |
| Replacement Image | Optional image shown instead of the price. |
| Hide “Add to Cart” Button | Hide it, or replace it with a custom button. |
| Replace Button Text / Link URL | Label and target for the replacement button (URL, or popup for the AJAX quote form). |
| Show “Login to See Price” Link | Show 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 Text | Require and word a consent checkbox on the enquiry form. |
Admin Notifications
Section titled “Admin Notifications”| Field | What it does |
|---|---|
| Send Admin Email on New Quote | Notify staff whenever a quote is submitted. |
| Admin Email Address | Recipient of new-quote notifications. |
| Email Sender | Store identity used as the sender. |
| New Quote Email Template | Template for the new-quote notification. |
| Price Request Email Template | Template for hide-price “Get a Quote” popup submissions. |
Customer Notifications
Section titled “Customer Notifications”| Field | What it does |
|---|---|
| Enable Customer Email Notifications | Master switch for buyer-facing emails. |
| Email Sender | Store identity used as the sender. |
| Quote Submitted / Approved / Modified / Rejected / Expired | A template per quote-status transition. |
| Expiry Reminder Template | The reminder sent before a quote expires. |
| Admin Reply Email Template | Sent when an admin replies to a hide-price (price) request. |
PDF Quotes
Section titled “PDF Quotes”| Field | What it does |
|---|---|
| Attach PDF to Approved Quote Email | Automatically attach the quote PDF when a quote is approved. |
| Company Name / Address | Printed in the PDF header. |
| Company Logo | Your logo on the PDF. |
| Terms & Conditions Text | Printed in the PDF footer. |
Checkout Custom Fields
Section titled “Checkout Custom Fields”| Field | What 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. |
Headless / API
Section titled “Headless / API”# 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.
POST /V1/b2b/quote/submit → submit a quote request (guest allowed)GET /V1/b2b/quote/{incrementId} → fetch a quote's status by its RFQ number (requires a logged-in customer token — returns PII, so not anonymous)Submit body: customerName, customerEmail, companyName, phone, customerMessage, items[] where each item is { sku, qty, note? }.
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.