B2B Quote Request — Complete Guide
Install, configure and operate B2B quote requests: Quote button, quote cart, line-by-line price negotiation, discount, native PDF, customer acceptance and order conversion for PrestaShop 8 and 9.
Overview
The B2B Quote Request module (dfb2bquote) adds a true quote-based sales flow to your PrestaShop store. A “Quote” button replaces or complements add-to-cart: your professional customers build their request in a dedicated quote cart, submit it, and you take over in the back office to negotiate prices line by line, apply a discount, set a validity date and generate a PDF in your store style. Once the customer accepts the quote, one click converts it into a real order with the negotiated prices frozen.
Built for B2B and made-to-measure selling: wholesalers, professional supplies, large volumes, configurable products. Your retail customers’ standard purchase journey stays intact: the Quote button can replace the purchase, or simply sit alongside it.
Compatibility
- PrestaShop 8.0 to 9.x
- PHP 7.4 to 8.3
- Single-shop and multistore
- Multilingual (translated statuses, emails provided in FR and EN)
- Classic theme and custom themes (the button is injected even if the theme does not call the hook)
- No dependency (neither Composer nor framework)
Installation
- In the back office, open Modules > Module Manager.
- Click Upload a module and select the
dfb2bquote.zipfile. - Once installed, click Configure.
On installation, the module creates its tables (quotes, lines, statuses, quote cart, history), initializes the seven default statuses, registers its hooks (product page, header, customer account, authentication) and adds the Quotes tab under Orders in the admin menu. A My Quotes link appears in the customer area.
Configuration
Button and display
- Enable the module: enables or disables the entire quote flow on the front office.
- Button mode: Replace (the Quote button takes the place of add-to-cart, for a fully quote-based store) or Complement (the button sits next to the regular purchase, to serve both B2C and B2B).
- Button label: text shown on the button (“Quote”, “Request a price”…).
- Hide prices: hides catalog prices on the front office, for a fully quote-based logic.
- Customer groups: leave empty to show the button to everyone, or select groups (for example your professional groups) to restrict it to B2B.
Request and rules
- Allow guests: lets a non-logged-in visitor submit a request by entering their details (name, email, company, phone). Disable to accept logged-in customers only.
- Minimum amount: tax-excluded threshold required to submit a request.
- Validity (days): default validity period applied to quotes.
- Show the “My Quotes” link: displays the quote indicator and access link in the header.
Conversion and documents
- Administrator email: address that receives the notification on every new request.
- Order status on conversion: status applied to the order generated when converting an accepted quote.
- Terms (T&C): text shown at the bottom of the quote PDF.
Usage — customer side
Requesting a quote
On the product page and listings, the customer clicks the Quote button. The product (and its variant) is added to their quote cart, independent of the purchase cart. A “My quote” indicator updates in the header.
The quote cart
On the quote cart page, the customer adjusts quantities, removes lines, adds a message, then submits the request. If they are not logged in and guest mode is allowed, they enter their details. On submission, the quote is created with the New request status and a notification is sent to your team.
The quote cart is tied to the visitor’s session and persists across pages. On login, a cart built as a guest is automatically transferred to the customer account.
The “My Quotes” area
From their account, the customer finds the list of their quotes with their status. On a quote’s detail, they review the lines and totals, download the PDF, and once the quote has been sent to them, can accept or decline it. A guest accesses their quote via a link secured by a unique key.
Usage — back office
Quote list
The Quotes tab (under Orders) lists every request with its reference, the customer, a colored status badge, the tax-excluded total and the date. A click opens the management screen.
Negotiating the quote
On the detail screen, for each line, the catalog price is recalled and you enter the negotiated price (excl. tax). You can also:
- apply a global discount as a tax-excluded amount or a percentage;
- add indicative shipping costs;
- enter a message for the customer;
- set or adjust the validity date.
Status and notification
You change the quote status and, by ticking Notify the customer, trigger an email. Move the quote to Quote sent so the customer can accept it from their area. The full status history is kept, timestamped.
Converting to an order
When the quote is Accepted, the Convert to order button appears. The conversion creates a cart, applies each negotiated price via a SpecificPrice attached to that cart, adds any global discount via a cart rule (CartRule), then creates the order via validateOrder with the configured status.
The specific prices and temporary rules are cleaned up automatically after the order is created: your catalog is never modified, and the order carries exactly the negotiated amounts.
Quote statuses
- New request: quote received, to be processed.
- In progress: being prepared on the store side.
- Quote sent: sent to the customer, who can accept or decline it.
- Accepted: validated by the customer, ready to convert to an order.
- Declined: turned down by the customer.
- Expired: validity date passed.
- Converted to order: turned into a real order.
FAQ and troubleshooting
The “Quote” button does not show
Check that the module is enabled, that the visitor belongs to an allowed group (if you restricted the display), and clear the PrestaShop cache. The module can inject the button even if your theme does not call the product-page hook; for a heavily customized theme, check the presence of the purchase container.
Blank page or “invalid JSON” error when adding
Clear the cache (Advanced Parameters > Performance) and, while testing, disable the combination/compression of files (CCC). The module’s AJAX responses are strict JSON, returned directly to stay compatible with PrestaShop 9.
Prices are not hidden
Enable the Hide prices option. Depending on your theme, some very specific price locations may need adjustment; the module hides PrestaShop’s standard locations.
The customer cannot accept their quote
Accepting and declining are only possible when the quote is at the Quote sent status. Move the quote to that status from the back office.
Emails are not received
Check the address set in Administrator email and PrestaShop’s email configuration (Advanced Parameters > E-mail). The templates are provided in French and English and remain customizable.
Is it compatible with PrestaShop 9 and multistore?
Yes. The module is compatible with PrestaShop 8 and 9, in single-shop as well as multistore. Quotes are tied to the customer’s shop and language.