Request for Quotation: Turning WooCommerce into a B2B Platform
70% of B2B transactions begin not with a “Buy” button, but with a request for a quote. Let's look at how to turn WooCommerce into a full-fledged B2B platform with RFQ workflow, dialog system, PDF auto-generation and integration with 1C.
COS / KNOWLEDGE BASE
Last week the director of a small company that sells industrial lubricants wrote to me. The essence of his problem fit into one sentence: “We use WooCommerce, and we cannot normally accept requests for commercial proposals.” The following was a story that I hear at least once a month, and from completely different businesses. The client goes to the site, sees the catalog, finds the desired items - and then the circus begins. He calls the manager, the manager opens 1C, searches for goods, manually collects the CP in Excel, and sends it by mail. The client asks to change two positions, the manager redoes the file and sends it again. Somewhere between the third and fourth letter, someone loses the thread, mixes up versions of the document, and the deal hangs in the air. Sound familiar? Very much for me. Because we went through this ourselves before we built a system that solves this problem entirely, from the first click to the signed CP.
I've been developing and marketing for industrial B2B companies for over a decade, and during that time I've come to one simple conclusion: WooCommerce is a great e-commerce platform, but it's completely unready for B2B out of the box. The “Buy” button and shopping cart are the retail paradigm. In the wholesale world, no one buys from a website using a card. Seventy percent of B2B transactions begin with a request for quotation - a Request for Quotation, or RFQ for short. The client wants to know the price for his specific volume, with his specific discount, with delivery to his specific warehouse. And he wants to receive a document - beautiful, with a seal, with details - which he can show to his management or accounting department. And this is where WooCommerce throws up its hands, because there is nothing like that in it.
You can, of course, install a separate plugin for RFQ. There are about twenty of them on the marketplace. But you know what? I tried it. Most of them are just a feedback form taped to the cart. The client sends a request, the manager receives an email, then everything is as before - manual work in Excel, ping-pong of letters, loss of versions. None of the plugins that I tested provided a full workflow: from a request through negotiations to an accepted commercial proposal. None generated a PDF with company details. None supported the dialogue system inside WooCommerce, so that all correspondence about the transaction was in one place. And this was one of the reasons why we decided to build our own B2B module, and not assemble a Frankenstein from ten different plugins.
Why the Buy button is killing B2B sales
Let me explain why the standard WooCommerce model doesn't work for wholesale, and it's important to understand not only technically, but also from a business process perspective. When a retail buyer comes to the site, he sees the price, adds the product to the cart, pays by card and waits for delivery. The whole process is linear, predictable, automated. The manager is not involved at all, except when problems arise.
In B2B, everything works fundamentally differently. The price of a product is not a fixed number on the price tag. This is the result of negotiations, which depends on a dozen factors: purchase volume, history of relations with the client, current stock balances, logistics, seasonality, competitive situation. The same product can cost 1,500 rubles for a new client and 1,200 for a regular wholesaler who buys in pallets. And this price is not set in stone - it can be discussed, you can ask for an additional discount for volume, or agree on a deferred payment. The “Buy for 1,500 rubles” button in this context looks like an offer to bargain with a machine - meaningless and a little insulting to a professional buyer.
I have seen this problem with our clients time after time. The company invests money in a beautiful WooCommerce website, fills the catalog, sets up filters and search - and receives zero orders through the site. Not because the site is bad. But because the wholesale client simply does not understand what to do with the “Buy” button. He needs a “Request Quote” button. He needs the opportunity to collect a list of positions, indicate the desired volumes and send it to the manager with the note “need CP by Thursday.” And the manager needs a tool to respond to this request quickly, without leaving the WooCommerce admin panel.
Here's the thing: WooCommerce actually contains all the basic building blocks for B2B. There is a product catalog, there is a shopping cart as a mechanism for generating a list of items, there is a system of users and roles, there is a REST API for automation. One layer is missing - the layer of negotiations. The same process when the client and manager exchange offers, discuss prices and conditions and come to an agreement. It is this layer that we built.
To be honest, when we started designing the Request for Quotes module, I thought it would be a relatively simple task. A request form, a table in the admin panel, PDF generation - it seemed like a couple of weeks of work. The reality turned out to be more complicated. Because RFQ is not an isolated function. This is the heart of the B2B process, and it is connected with everything: with pricing, with customer groups, with the notification system, with your personal account, with accounting documents. You can’t make a good RFQ module without thinking through the entire chain.
Full cycle: from cart to signed receipt
Let me walk you through the entire process as it looks with our module - through the eyes of the client and through the eyes of the manager. This is important because the beauty of a solution is not in the individual features, but in how they are connected to each other.
Imagine: a buyer goes to the website of a wholesale company that sells industrial oils. He is logged in to his B2B account, which means he sees prices that correspond to his group of clients. Let’s say he’s in the “Dealers” group, and he gets a 15% discount on the base price. He finds the right items - HVLP-46 hydraulic oil in 200 liter barrels, VDL-100 compressor oil in cans, TM-5 transmission oil in bulk. Adds each item to the cart, indicating the required quantities. So far it looks like a regular online store.
But then comes what distinguishes a B2B platform from retail. Instead of the “Place an order” button, he sees the “Request a quotation” button. Click and the request form opens. It is already pre-filled: items from the cart are automatically pulled up, company details are taken from the profile. The client can add a comment - for example, “we need delivery to Yekaterinburg, preferably before the end of the month, please consider a discount for volume.” Sends a request.
What's going on on the WooCommerce side? A new query is created in the database with the status “New”. All positions are stored in a separate table - with prices, quantities, links to products. The manager receives an email notification: “New request for CP from Ural Mechanisms LLC, 3 positions in the amount of 847,000 rubles.” At the same time, a notification appears in the WooCommerce admin panel - the dashboard shows the number of unprocessed requests.
The manager opens the request in the admin panel and sees the whole picture: who the client is, from which group, what purchase history he has, what he is requesting. And here the most interesting part begins - the dialogue system. The manager does not go to the email client and does not open Excel. There is a chat right in the request card - like Conversations, as in CRM systems. The manager writes: “Good afternoon, Alexey. For HVLP-46 we can give an additional 5% discount when ordering 10 barrels or more. For TM-5 in bulk, the minimum quantity is 1000 liters. We will prepare the command post within an hour.” The client receives a notification by email and can respond either via email (the response is pulled into the system) or through his personal account on the website.
I thought for a long time whether this dialogue system is needed at all, or whether standard email notifications are enough. Practice has shown that dialogue is what separates a professional instrument from a craft. Without them, everything slides into the same email ping-pong that we wanted to eliminate. When correspondence for each CP request is stored in WooCommerce, the manager sees the full history of communication with the client. If a manager gets sick, his colleague can pick up the deal without losing context. If a client calls with a question, the manager opens the request card and sees what was agreed upon yesterday. This seems obvious, but believe me, I've seen companies where managers negotiate CPs in their personal inboxes, and when someone quits, the whole story goes with them.
So, the manager has prepared a commercial proposal. He adjusts the prices in the request card - somewhere he gives a discount, somewhere he changes the quantity, and adds comments on the terms of delivery and payment. Click “Create CP” and the system automatically generates a PDF document. Not just a table with prices, but a full-fledged commercial offer with a company header, logo, details, seal and signature. Something that can be printed, shown to the director and attached to the contract. The request status automatically changes to “CP sent”, the client receives an email with a PDF attached.
Client opens PDF, looks at prices, discusses with management. He decides that everything is fine - he goes into his personal account on the website, opens a request and clicks “Accept CP”. Or if he’s not satisfied, he writes into the dialogue: “The price for the second position is high, competitors offer 8% cheaper.” The manager corrects the proposal, generates a new PDF version, and resends it. This cycle can be repeated as often as desired - the entire version history is saved in the system.
When a quote is accepted, the request is automatically converted into a WooCommerce order with fixed prices. Not with the current catalog prices, but with those that were agreed upon during the negotiations. This is a fundamental point - the price fixed in the CP should not change, even if the next day the prices in the catalog were raised by 10%.
Let me go into a few key elements of this process in more detail, because, as usual, the devil is in the details.
I'll start with PDF auto-generation, because this is where most solutions on the market fail. I've seen plugins that generate a "PDF" - essentially an HTML page saved as a PDF through a browser. No fonts, no markup, no details. It is a shame to show such a document to a client, and the accounting department simply will not accept it for work. Our PDF generator creates a document that looks like a real business proposal, prepared in Word or InDesign. In the header there is the company logo and full details (TIN, KPP, OGRN, legal address). In the body there is a table with positions, prices, quantities, amounts. Below are the totals, terms of payment and delivery, and the validity period of the offer. And most importantly, the stamp and facsimile of the signature of the authorized person. All this is configured in the admin panel: upload a logo, a seal, fill out the details, select a template - and each subsequent CP is generated automatically.
I remember one of our clients - a bearing sales company - showed me a gearbox they had sent before. It was an Excel file with a logo inserted as a picture in cell A1, with table borders that moved and formulas that flew off from time to time. The manager spent 30-40 minutes preparing each CP, because half the time was spent struggling with formatting. After switching to automatic PDF generation, this time was reduced to two minutes - click “Create CP” and check the result.
Now about request statuses - it would seem a trifle, but they are the ones who turn chaos into a controlled process. We have implemented five statuses: “New”, “In Processing”, “CP Sent”, “Accepted”, “Rejected”. Each transition is accompanied by an email notification to both parties - the client and the manager. The manager cannot forget about the request, because there is an unprocessed counter on the dashboard. The client always knows at what stage his request is at, because he sees the status in his personal account. It's a cliche process transparency, but it does wonders for customer trust.
What if the client doesn't just want to ask for a price, but wants to make a counteroffer? This is why the Offers system exists. The manager creates an offer (his own CP), the client can create a counteroffer (his own counter offer with other prices), the manager either accepts or makes a new offer. It turns out to be a full-fledged auction, only not public, but one on one. I saw how this mechanism works for our client, who sells special equipment - there the average transaction goes through three to four rounds of negotiations, and previously all this was done in correspondence. Now each round is a new offer in the system, with fixed prices and conditions. If six months later the client says “they promised me this price,” the manager opens the story and shows what exactly was agreed upon.
How B2B groups are changing the game
A request for quotation does not exist in a vacuum. Its value increases manifold when it is integrated with a B2B grouping and pricing system. Let me explain how this works in our module, because it is this connection that distinguishes a mature B2B solution from a simple feedback form.
Each B2B client belongs to a specific group: “Dealers”, “Wholesalers”, “VIP-partners”, “Retail”. Each group has its own pricing rules - percentage discount from the base price, fixed wholesale prices, tiered pricing (the more you take, the cheaper). When a client creates a request for CP, the prices in his cart are already calculated taking into account his group. The manager sees the base price, the client price, and the difference - and can make decisions about additional discounts consciously, understanding the margin.
I came across a situation where a manager gave a discount “from the base price”, not knowing that the client was already in the group with a 15% discount. As a result, the total discount was 30%, which ate up the entire margin. This is impossible with our system - the manager sees the full picture of pricing directly in the CP request card. He sees what price is set for the client’s group, what the minimum acceptable price is (floor price), and can make decisions within a given corridor.
There is one more thing that I think is critically important: rule inheritance. Our client groups are hierarchical - for example, the “Ural Region” group inherits the rules from “Dealers”, but with an additional 3% discount for logistics. When a customer from the Ural region requests a CP, the system automatically applies all pricing levels: base dealer discount plus regional bonus. The manager does not need to remember this or calculate it manually - everything is calculated automatically.
Now let's talk about something that many people overlook, but which radically changes the effectiveness of B2B sales - the B2B wallet. This is a prepaid balance mechanism that we have implemented for regular customers. It works simply: the client makes an advance payment (for example, transfers 500,000 rubles to the account), this amount is credited to his “wallet” in WooCommerce. When accepting the CP, payment is debited from the wallet balance automatically, without additional payment transactions.
Why is this needed? I'll explain with an example. One of our clients, an auto oil distributor, has about 200 regular customers who place orders every week. Previously, each order went through a full cycle: invoicing, waiting for payment, checking receipt, shipping. The cycle took 3-5 working days. With a wallet, a regular customer replenishes his balance once a month, and then simply requests a CP and accepts it - the money is debited instantly, and shipment begins on the same day. The time from request to shipment has been reduced from five days to several hours. For a business where turnover rate is a key factor in profitability, this is a huge difference.
The wallet is integrated with a notification system: the client receives an email when funds are credited, every time they are debited, and when the minimum balance is reached. The manager sees the balance of the client’s wallet directly in the CP request card and can immediately say: “You have 340,000 on your balance, CP for 287,000 - there are enough funds, we can ship today.” This removes a whole layer of communication and speeds up the process significantly.
What if you look at it from the other side - from the accounting department? Each wallet transaction is recorded with metadata: date, amount, type of operation (deposit, write-off, return), associated order or CP. An accountant can download transaction history for any period and compare it with a bank statement. We didn’t reinvent the wheel—we simply did what has been working in wholesale ERP systems for a long time, only inside WooCommerce, without the need to deploy a separate accounting system.
Email Notifications: The Unsung Hero of the B2B Process
I could write a separate article just about the notification system, because it's one of those things that is invisible when it works correctly, but disastrously noticeable when it doesn't work well. In B2B sales, a missed notification is a lost deal. The client sent a request, did not receive confirmation - he thought that the site was not working and went to a competitor. The manager did not see the new request - the client waits for two days, gets annoyed and calls with a complaint. Situations familiar? We had them too, until we built a notification system that covered every stage of the process.
For every significant event, an email is sent to both the client and the manager. New request - the client receives confirmation “Your request has been accepted, number RFQ-2024-0347, the manager will contact you within 2 hours”, the manager receives “New request from Mechanics LLC for 5 positions, amount 1.2 million rubles.” The manager responded in the dialogue - the client receives a notification with the text of the message. The CP is ready - the client receives a PDF as an attachment. The status has changed - both sides are aware.
But what's really important - and this is what most plugins don't have - is the integration of notifications with the module's overall email system. We don't just send emails via wp_mail(). We have a full-fledged SMTP module with delivery tracking, logging of each sent letter, and resending in case of errors. A manager can go to the letter log and see: “The letter from the CP was sent to the client at 14:32, opened at 14:47, PDF downloaded at 15:03.” It's not just a convenience - it's a sales management tool. If the client opened the CP, but did not respond within 24 hours, the manager knows that it is time to call and clarify if there are any questions. If the letter is not delivered, the manager will know about it immediately and can contact the client in another way.
Letter templates are configured in the admin panel. You can change the text, add variables (customer name, request number, list of items, amount), customize branding (logo, colors, signature). Each email looks professional—not like a system notification from WordPress, but like corporate communication from a business.
I'm particularly proud of one feature we added following customer feedback. This is a digest for the leader. Once a day or once a week, the head of the sales department receives a summary: how many requests have been received, how many have been processed, how many CPs have been accepted, what the conversion is, what the average bill is. Without this summary, the manager is forced to go into the WooCommerce admin area and figure out the numbers on his own - and we all know how often managers do this. That is, never. But an email with two key metrics is opened and read by everyone.
Personal account: self-service portal for wholesalers
You know what I love about good B2B platforms? They reduce the burden on managers by giving clients the opportunity to resolve issues on their own. Your personal account in WooCommerce out of the box is, to put it mildly, a modest sight. Delivery address, order history, password change. For retail - enough. For B2B - ridiculously little.
In our module, the personal account of a B2B client is a full-fledged self-service portal. The “My Requests” section shows the complete history of all CP requests with current statuses. The client sees which requests are in progress, which CPs are awaiting his decision, which transactions have been completed. Can open any request and re-read all correspondence with the manager - dialogues, offers, counteroffers. Can download any PDF version - current or previous ones.
But there's something else. The client can create a new CP request not only through the shopping cart, but also directly from his personal account. Moreover, he can use “Purchasing sheets” - saved sets of goods that he purchases regularly. Let’s say that every month a client orders the same 15 items of oils. He creates a purchase list, saves it, and next time he simply clicks “Request quotation for this list.” There is no need to go through the catalog again, search for products, and add to cart. Three clicks - and the request went to the manager.
I remember a conversation with a sales manager at one of our client companies. She said: “Previously, I spent half my working day taking orders over the phone - the client dictates the positions, I enter them into 1C, and check availability. Now clients create their own requests through the website, and I spend this time working with new clients.” This manager processed 25-30 requests a day instead of the previous 12-15, and there were fewer errors, because the client himself selects items from the catalog, and does not dictate over the phone “hydraulic oil... what is it... well, the same one we took last time.”
Subaccounts are another story that is critical for B2B. In large companies, more than one person is involved in purchasing. There is a buyer who generates requests. There is a head of the supply department who coordinates. There is an accountant who checks documents. Our subaccount module allows you to create additional users under one B2B company, with different access rights. The buyer can generate requests, but not accept CP. The manager can accept the CP, but not change the details. The accountant sees only financial documents and the wallet transaction history. This isn't a luxury - it's a real need for large B2B clients, and if your platform can't do it, you're losing large clients who need these capabilities.
I've been thinking for a long time about how deeply we need to integrate RFQ with other B2B functions. You can do the minimum: a request form, an email to the manager, a manual response. Many people do this, and formally it works. But “works” and “works well” are two different levels. When all the components - customer groups, pricing, wallet, subaccounts, dialogs, PDF - are connected into a single system, a synergy arises that cannot be obtained by gluing together five different plugins. The manager works in one interface, the client sees everything in one personal account, data is not lost when moving between modules, and reporting is based on complete and consistent data.
And here's another aspect that is rarely talked about, but which is critically important for companies with a history: versioning and auditing. Every action in the CP request system is logged - who created the request, who changed the price, who accepted the offer, who generated the PDF. A year later, when the client says “we were promised special conditions,” the manager can restore the full chronology of negotiations. For companies working with government customers or large corporations, where every penny in the CP can be subject to audit, this is not just a convenience - it is a necessity.
I would like to say separately about integration with 1C, because for Russian companies this is often a decisive factor. Our KP request module is integrated with the 1C: Trade Management synchronization module. What does this mean in practice? When a manager creates a CP, prices and balances are pulled up from 1C in real time. When the CP is accepted and a WooCommerce order is created, this order is automatically exported to 1C. Accounting works in the usual system, the manager works in WooCommerce, the client works in his personal account on the site. No one enters the same data twice.
I have come across companies where the sales manager first accepts an order in WooCommerce, then manually creates a copy of it in 1C, then issues an invoice in 1C, then sends it to the client from Outlook. Four systems, four manual actions, four potential points of error. With our connection, this is one action - accept the CP, the rest happens automatically.
Let's talk about numbers, because business only understands the language of money. The average B2B sales manager processes 15-20 sales requests per day. Each request takes 30-45 minutes: find products in the catalog or 1C, calculate prices taking into account discounts, create a proposal in Excel or Word, send to the client, wait for a response, adjust, resend. This is 7-10 hours a day for one routine operation. With automation through our module, the processing time for one request is reduced to 10-15 minutes, because prices are calculated automatically, PDF is generated in a second, and the dialogue is conducted in one place. A manager can process 40-50 requests a day or spend the freed-up time on attracting new clients. Calculate the savings: if a manager costs the company 80,000 rubles per month, and his efficiency doubles, this is equivalent to hiring a second manager without additional costs.
Another indicator that we track: the conversion of a CP request into an order. For our clients, before implementing the system, the conversion rate was 25-35% - out of every four CP requests, only one turned into a deal. After implementation - 45-55%. Why? Because the response speed has increased (the client does not have time to leave for a competitor), the quality of the proposal has improved (professional PDF instead of crooked Excel), and the reminder system does not allow you to forget about pending requests.
But I'll be honest: automating KP requests is not a magic wand. It will not help if your prices are uncompetitive, if the goods are out of stock, if managers are not trained to work with the system. Technology is a multiplier, not a replacement, for business processes. A good process multiplied by a good tool produces a great result. A bad process multiplied by the same tool produces automated chaos.
Why did we build this into a single plugin and not make it a separate product?
This is a question I get asked regularly, and it deserves an honest answer. There are separate RFQ plugins on the market: YITH Request a Quote, WooCommerce B2B, NexusPress Quote and a dozen others. Why not use them?
I will try to answer not in the abstract, but with a specific example. Let's say you put YITH Request a Quote (one of the most popular). It gives you a request form and email notification. Not bad. But it doesn't know anything about your B2B groups - because customer groups are managed by another plugin (let's say B2BKing). It doesn't generate PDF - it requires a third plugin (WooCommerce PDF Invoices). It does not support wallet - the fourth plugin (TeraWallet). Dialogue system? The fifth plugin or even a third-party CRM. Subaccounts? Sixth.
You end up with six plugins from six different developers that are updated at different times, may conflict with each other, and do not communicate. The manager works in six different interfaces. The price calculated in one plugin is not transferred to another. If one breaks, the whole chain will fall apart. And each plugin costs $50-100 per year. Total - $300-600 annually, plus time for integration and support.
We took a different route. RFQ is part of a single B2B module, which includes customer groups, pricing, wallet, subaccounts, PDF generation, dialogue system and email notifications. All components were developed by one team, use one database, one settings system, one administrative interface. When a client from the “Dealers” group generates a CP request, the system automatically applies dealer prices, the manager sees the wallet balance, the full history of the relationship is available in the dialogue, and a PDF is generated with the correct details. All this - one plugin, one license, one update.
To be honest, putting everything into one plugin is an engineering challenge. It's much easier to make a small, highly specialized module that does one thing. But the convenience of the user—both manager and client—requires integration. The B2B process is end-to-end in nature, it passes through all layers of the system. Cutting it into isolated pieces means creating the very cracks in which data and time are lost.
I like the car analogy. You can buy an engine from one manufacturer, a transmission from another, suspension from a third, and electronics from a fourth. Technically, they can work together - if you spend a lot of time adapting. But no sane person does that. Buy a car where all the components are designed to work together. The logic is the same with business software.
By the way, about the practical side of implementation - I want to dispel one myth that I hear all the time. “Our managers can’t figure it out.” You know, I thought so too. When we first showed the system to managers on one of the projects, I expected resistance. People are used to Excel, to mail, to their plates - and suddenly they are offered to work through the WooCommerce web interface. But something amazing happened: the managers got used to it in half a day. And not the youngest and most technically advanced, but ordinary sales managers who are over forty and who consider Excel to be the height of technological progress. Why? Because the interface was designed for their task. Not for the task of a developer, not for the task of a director, but specifically for the task of a manager who processes dozens of requests every day.
When you open the dashboard, you see a list of requests with colored status indicators. Red is new, untreated. Yellow - in work. Green - CP has been sent, we are waiting for the client’s decision. Gray - completed. The manager instantly understands where the fire is, what requires attention right now. Clicks on a request and sees all the information on one screen: client, positions, prices, dialogue, history. No need to switch between tabs, no need to search for correspondence in mail. Everything in one place. This sounds banal, but it is precisely this “banality” that saves the manager two to three hours every day.
And one more detail that seems like a small thing, but in practice turned out to be critical: quick answers in dialogues. We noticed that managers respond to clients with the same phrases 80% of the time. “Thank you for your request, the command post will be ready within the hour.” “The minimum quantity for this item is 5 units.” “Discount for volume is possible from 10 units.” We have added quick response templates that a manager can insert with one click and edit if necessary. Trifle? But when a manager has 30 requests a day and needs to write 2-3 messages for each, the savings are noticeable. Time is money, especially in sales, where response speed directly correlates with conversion.
A separate conversation is mobility. The manager does not always sit at the computer. He may be at a meeting with a client, on a business trip, or in a warehouse. People often told us, “It would be great to be able to see requests from your phone and respond to them on the go.” The WooCommerce admin panel is not particularly mobile-friendly, but we deliberately designed our CP request interface to work well on mobile screens. The manager can open a request on the phone, read the dialogue, send a quick response, change the status. Of course, it won’t be possible to fully assemble a CP from a phone, but it’s quite possible to quickly respond to a client’s request so that he doesn’t have to wait until tomorrow.
Another point worth mentioning is the analytics of KP requests. Data is oil, and when you have all requests flowing through a single system, you get analytics that you never had with a manual process. Is the average request processing time 47 minutes or 4 hours? Which manager processes the fastest, and which one systematically delays? What products are requested most often? What percentage of requests come from new clients and what percentage from regular ones? How does seasonality affect the number of requests? All this is visible in the reports, and this allows the head of the sales department to make decisions based on data, and not based on feelings. I know a company where, after implementing request analytics, the CP found that one manager processed requests in an average of 52 minutes, and another in 3 hours. The difference was not in competence, but in the fact that the second manager wasted time searching for prices in 1C because he did not know about the possibility of pulling up data. A five-minute training solved the problem, but without analytics no one would have noticed it.
I often hear the question: how does this scale? What if we don't have 20 requests a day, but 200? Or 2000? The answer is simple: we initially designed the system for high loads. CP requests, positions, offers, dialogues - all this is stored in custom database tables, and not in WordPress metafields, as many plugins do. The difference is fundamental. When you have 50,000 requests per year and each has 10 positions attached to it, that’s 500,000 records. In the wp_postmeta table, where WordPress dumps everything in a row, such a volume of data turns any request into a painfully long operation. In custom tables with the correct indexes, the same data is processed in milliseconds. We tested this on a live site with 16,844 products and thousands of requests - no performance problems.
And finally, about data security, because commercial offers contain confidential information: prices, discounts, conditions, details. All API endpoints of the RFQ module are protected by checking access rights - the client sees only his requests, the manager sees everything. PDF files are generated on the server and stored in a secure directory that is not directly accessible via a URL. Conversations are encrypted during transmission, and access to them is limited to participants in a specific request. This may seem like an obvious requirement, but I've seen plugins where PDFs of sales proposals were stored in wp-content/uploads/ with predictable file names, and anyone could download a competitor's proposal simply by substituting a different number in the URL. With our system this is impossible.
I want to end with a thought that may not seem obvious. Request for quotation is not a technical function. This is the point of contact with the client, the moment when a business relationship is formed or broken. Each CP request is a client who is already interested, has already found your product, and is already ready for dialogue. The only question is how conveniently, quickly and professionally you will answer him.
When a buyer receives a beautifully designed proposal an hour after the request - with exact prices for his group, taking into account its volume, with a seal and details - he understands that he is working with a serious company. When he has to wait two days for the manager to assemble the CP manually in Excel, he thinks that this company is a mess. The first impression is formed in the first minutes, and your tool for working with CP is the face of your business for your wholesale client.
WooCommerce can be a powerful B2B platform. Not instead of 1C, not instead of ERP - but in addition to them, as a showcase and self-service portal for clients. But to do that, it needs the right B2B layer, and the RFP is a key element of that layer. We spent hundreds of hours building it right - with dialogs, with PDFs, with wallets, with integrations. If you are building B2B on WooCommerce and want your customers not just to scroll through the catalog, but to actually buy through the site - see how it works. Install COS WP Woo e-commerce, set up the CP request module and show it to your sales department. Managers will thank you.