B2B portal for wholesalers: private prices, orders, stock
Author:
Paweł Matusiak
·
The sales rep in Excel, stock in the warehouse, an order by email at 9 pm. A B2B portal lets trade customers order at their price, credit limit and live stock — no call to the office, no discount mistakes.
A wholesaler does not need a shop “for consumers”. It needs a regular customer to see their price, their limit, their case quantities and to order at 9 pm when the office has stopped answering. A B2B portal is a trade login, a cart at their price list, and a fulfilment status you do not have to extract from the warehouse. A public shop with hidden prices will not carry thousands of SKUs and eight discount groups.
What the lack of a B2B panel costs
Count office hours spent retyping email orders and discount mistakes. One wrong price on 40 lines is either a loss or a complaint and a credit note. One order mistyped from a spreadsheet is a pick that comes back from the warehouse. Illness of the person who “has the whole history in their inbox” freezes the day.
- A rep retypes an email order into the warehouse — SKU and qty errors.
- Every customer has a different discount, so the PDF price list is stale in a week.
- Nobody sees the credit limit until accounts shout after dispatch.
- The customer calls “is it in stock” because the public shop lies or does not exist.
- Order history lives in one person’s inbox — illness means paralysis.
- A branch orders on the same tax id at a different price than HQ — nobody watches who may see what.
Private price lists — the heart of the panel, not decoration
In B2B a price is not one number on a SKU. It is a function: account, discount group, quantity break, a dated promotion, currency, unit (each / case / pallet), sometimes the branch. A panel that shows everyone “list minus 10%” will lie on the first larger account. A real private price list can do: a net price on the account, inheritance from a group, a “from 24 units” break, an exception on one category, and a block when someone tries to see another account’s list.
- Account price list and group price list — with a clear winner when they clash.
- Quantity breaks and logistic units (you do not sell 1.5 cases if you do not want to).
- Net prices, VAT rate, optionally another currency for export — not mixed with B2C.
- Validity from–to and a change history, because the “March price” dispute comes back.
- Import from a spreadsheet / ERP at the start, then one source of truth.
- The rep sees margin, the customer does not — obvious, and often missing in a B2C shop plugin.
We do not publish other people’s lists and we do not guess a “typical trade discount”. Your list stays yours. The panel enforces it, instead of leaving the rep with a calculator on every email.
What else a B2B platform must have
- Customer login: tax id, branches, several people with different permissions (order, see invoices, cannot change the address).
- Near-live stock, reservations, substitutes, an inbound date.
- Logistic minimums, case packs, delivery to several addresses.
- Credit limit, overdue invoices, a block when the limit breaks — by the accounts rule, not by gut feel.
- Reorder last, favourites, CSV; EDI when volume and the partner justify it.
- Status: accepted, picked, shipped, tracking number.
- Invoice history and balances — no “please send the June invoice” call.
Stock, reservations and warehouse truth
A customer who twice ordered “what was in stock” and got a reject or a delay goes back to the phone. The panel should show what you can sell: stock minus reservations minus quality holds. If ERP is the source, the panel reads ERP. If Excel is the only system, the panel can be the source of truth at first, and we harden the warehouse in phase two. A lie in stock is dearer than having no shop.
How we connect ERP and the rest
If stock and invoices live in an existing ERP, the panel should talk to it, not replace it by force. A typical split: ERP stays the ledger and the warehouse, the panel is the customer shop window and the cart. Integration is a separate line in the quote, because every API hurts differently: one gives stock every 15 minutes, another only files on FTP at 2 am, a third has no API and we go through an export.
We do not promise “a ready connector to every ERP in Poland”. We promise we will first write down what is the source of truth for price, stock and limit, and only then pick the bridge. Sometimes the bridge is simple. Sometimes the SKU file has to be cleaned first.
KSeF: the invoice from the panel, not a PDF in spam
From 2026 an invoice between VAT payers is a KSeF document, not an attachment. The timetable on ksef.podatki.gov.pl: 1 February 2026 for firms with 2024 sales (including VAT) over PLN 200 million; 1 April 2026 for the rest. Receiving invoices in KSeF is a buyer topic from 1 February 2026 — regardless of when you yourself start issuing. If invoices already leave a KSeF-certified ERP, the panel shows status and number. If the panel issues — we build an FA(3) send. Path: KSeF in a company app.
The field rep and a mobile app
A phone browser panel is enough for the customer. A field rep sometimes needs “I am at the customer, I order on their account, I see their list and arrears”. That is phase two, same API. Offline like field service makes sense in halls with no signal — the cart stores locally and leaves when the network returns. We do not start with a native app if 90% of orders will still arrive from the customer’s office in the evening.
An MVP the office will use in week one
- Login, tax-id check, the first user on the account.
- One private list or groups — not eight exceptions on day one.
- Cart, logistic minimum, stock, order status.
- Then: credit limits, many users, a second list, CSV, EDI, an app.
Count office hours and discount mistakes. Describe customer count, SKUs and whether you have an ERP. We will propose an MVP: login, price list, cart, status — without waiting for a “full marketplace”. Budget: how much an app costs. SaaS vs custom: off-the-shelf or custom.
How to set the price list so the panel does not lie in week one
Before we write a cart line we write down the price rule. Who has a private list, who a group, who a quantity break, who a category promotion. What wins when rules clash. Whether the price is net per each or per case. Whether a branch in another city sees the same list. Without that card the panel will guess and the customer will phone. Guessing in B2B is dearer than having no shop: you sell too cheap once, you lose the account too dear once.
A spreadsheet import is fine at the start if the file has SKU, unit and net price. It is not fine when the “price list” is eight coloured tabs and a rep’s comment in the next cell. Then we clean the file first, then the panel. Otherwise you automate a mess.
Credit limit, a block and the exception that will exist anyway
A limit does not work if the rep can go around it in email and the panel never hears. Either it is hard (the cart will not submit) or soft (it submits with an “accounts must approve” flag). The exception “Mrs Ania at XYZ always can” must also live in the system — with a date and the person who granted it. Otherwise you are back on the phone after every larger pallet. Overdue invoices and the limit are one accounts decision, not two truths in two programmes.
Search at 20,000 SKUs
A trade customer does not browse like a consumer. They type an index, an EAN, a name fragment, a code from a shelf label. Search must take that in a fraction of a second, with a substitute hint and a case pack. Excel and WooCommerce fail here first. An index, facets (brand, category, availability) and “ordered last” do more than a pretty packshot. Photos come when the SKU file is clean — not instead of a clean SKU file.
Reorder last and a favourites list take 70% of the clicking off regulars. CSV at the start; EDI when the partner sends machine orders and the volume will carry it. Not the other way: EDI “because it looks serious” at 30 orders a week is a dearer hobby than a second rep.
A claim, a return and a price correction after dispatch
A panel that can only sell breaks on the first damaged case. A return and a credit must know which order and which price list the price came from. Otherwise accounts recalculates the discount “by feel”. The customer sees claim status (accepted, inspected, decided) so they do not call every day. The credit document — the same path as the invoice, including KSeF when you are the issuer. We do not design a full WMS here; we join the commercial decision to the document.
A substitute when stock is short is a proposal, not a silent swap. The customer confirms. A silent swap in B2B kills trust faster than a stock-out.
A promotion, a clearance and a price list with an end date
A promotion with no end date stays in the panel forever and eats margin. Every campaign has from–to, a SKU or category list and a rule whether it beats the private list. The customer sees old and new price on the line, not a surprise on the invoice. End-of-line clearance takes stock, not only price — otherwise you sell what you do not have. A post-campaign report: who bought, at what price, whether the credit limit made an exception. Without that, marketing and accounts argue over two spreadsheets.
A private price list as a function, not a spreadsheet column
In B2B a price is a function: account, discount group, quantity break, a dated promotion, unit (each / case / pallet), sometimes branch and currency. A panel that shows everyone “list minus 10%” will lie on the first larger account. The rule priority must be written down before the cart exists: what wins when a private list hits a category promotion. Price-change history stays for the “I had another rate in March” dispute. We do not publish other people’s discounts and we do not guess a “trade average”.
A spreadsheet import is fine if the file has SKU, unit and net price. It is not fine when the “price list” is eight coloured tabs and a rep’s comment in the next cell. Then the file first, then the panel. Otherwise you automate a mess. The rep sees margin; the customer does not. In a B2C shop with a wholesale plugin that line often does not exist.
Credit limit, arrears and an exception with a date
A limit does not work if it can be bypassed by email and the panel never hears. Either the cart will not submit, or it submits with an “accounts must approve” flag. The exception “this account always can” also lives in the system — with a date and a person. Overdue invoices and the limit are one accounts decision, not two truths in two programmes. After dispatch it is too late to shout.
- A guest may see a catalogue at most. Price — after the tax id is verified.
- Several people on the account: order / see invoices / cannot change the address.
- CSV and reorder last at the start; EDI when volume and the partner will carry it.
- Search by index, EAN and a name fragment at tens of thousands of SKUs.
KSeF: a structured invoice instead of a PDF in spam
From 2026 an invoice between VAT payers is a KSeF document, not an attachment. Timetable: ksef.podatki.gov.pl — 1 February 2026 when 2024 sales exceed PLN 200 million (including VAT); 1 April 2026 for the rest. Receiving invoices in KSeF is a buyer topic from 1 February 2026. If invoices leave a certified ERP, the panel shows number and status. If the panel is the issuer — an FA(3) send. Path: KSeF in a company app. A credit after a claim takes the same road, with the source price list, not a “discount by feel”.
Frequently asked questions
- Will the panel replace the sales rep?
- No. It takes repeat orders. The rep handles new accounts and exceptions, not typing 40 lines from an email.
- Will prices be public?
- No. A guest may see a catalogue at most. Price — after the account is verified.
- What about a mobile app?
- At the start a panel that works on a phone. Android for field reps — phase two, same API.
- How many SKUs can it take?
- Tens and hundreds of thousands — with decent search and an index. Excel cannot, a panel can.
- Will you replace the ERP?
- Not by force. Most often the panel talks to the ERP. We replace Excel, not a working ledger.
- EDI on day one?
- Only when the partner and the volume justify it. CSV and reorder last cover most of the start.
- Several warehouses?
- Yes — stock per warehouse, a rule for where we pick, optional collection from a chosen branch.
- KSeF from the panel or from ERP?
- Usually it stays where invoices already leave. The panel shows the document and status. Send from the app when the panel is the issuer. Dates: 1 February / 1 April 2026 per the Ministry.
Related service:
Custom B2B platforms and CRM
Describe your project