B2B is not D2C with a login
The sentence sounds like an agency formula, but it has very concrete consequences. In technical trade the price is not a property of the article but a property of the business relationship: customer-specific terms, tiered prices, framework agreements, net prices, ordering on account. A shop that shows a list price while sales have agreed a different price produces exactly the result that makes it redundant: the buyer calls, clarifies the price and then orders by email again. That is why pricing logic in these projects is not a configuration step at the end but one of the first questions in the concept.
The second difference concerns roles. The person who orders is often not the person who decides. There are head offices and branches under one customer account, several buyers per site, budget limits and approval processes in which an order only goes out after internal sign-off. Anyone who does not model this chain forces the customer into a detour — and detours in procurement end in the old process. One thing belongs before the quotation rather than in the middle of the project: customer groups, customer-specific prices and tiered prices come with Shopware 6 in the open core, while customer hierarchies with head office and branches, order approvals and budgets are delivered by Shopware as B2B Components in the paid plans, or we build them as our own plugin. Which route is cheaper, we calculate beforehand.
And third, the entry point is different. The buyer is not looking for inspiration, they are looking for a repeat purchase. They ordered the part three months ago and want to reorder it without searching. Order history, reordering from a past order, saved lists for recurring items: in B2B these are not convenience features but the actual value. At M&S Armaturen exactly this shift was the goal of the project — recurring procurement runs through the shop, while enquiries that need engineering support still go to the sales team.
The attributes people actually search by
A filter that cannot handle material, nominal diameter and pressure rating is not a filter in technical trade. The attributes have to sit in the data model as separate fields, with defined values and units, not as a sentence in the description text. This sounds obvious and is not: data taken over from legacy systems regularly delivers these values as a block of text, because they were never needed in any other form there. Modelling these attributes is a separate work step in projects of this kind, and often the one that decides the quality of the result — not the frontend design.
Then there is the search. It has to match part numbers with special characters, know short designations and cope with incomplete input. In the Magento shop of Manotura the product search therefore runs through Elasticsearch and not through a database query. At M&S Armaturen the search likewise uses an index that includes part numbers and short designations. The difference is measurable in operation by one simple figure: how often a search ends without a result although the article is in the catalogue.
The documents are part of the data model as well. Data sheets, dimensional drawings, material specifications, standards and approvals belong to the article, not in a folder next to the catalogue. Anyone looking for an approval is looking for it in relation to a component. And they rarely arrive through the home page: industrial procurement enters directly on the product or material page from a search engine. At FRANKSA the site is designed for exactly that — individually addressable product and material pages with a flat click structure, instead of a range hidden behind a layer of generic terms. How closely document and article need to be linked depends on the case: in a shop catalogue the data sheet belongs to the article record; on a website such as the one for Manotura, download areas at product group level are the more pragmatic form, because there the editorial team maintains the content and not the interface.
The ERP leads, the shop follows
Inventory, prices and customer terms sit in the ERP. The shop is a display and ordering channel, not the owner of the data. This division of roles sounds trivial but is frequently broken — usually because in the early phase a price list is quicker to maintain in the shop than in the ERP. After that there are two versions of the truth, and the difference between them creates rework for the sales team. At M&S Armaturen and at Manotura it therefore runs in both directions in a defined way: product master data, prices and availability come from the leading system into the shop, and orders go back the other way in a structured form instead of landing as an email in an inbox.
The quality of such an integration is not decided by the data format but by the behaviour when something fails. A synchronisation will break at some point — because of a network outage, a locked record, a field that is suddenly empty in the ERP. We therefore build the transfers as repeatable jobs with a log for each run and with retry logic, so that an interrupted synchronisation restarts without damaging data and a single failure does not block the whole synchronisation. How that looks in detail is described on our page about interface and API development.
The reverse also applies: not everything belongs in the ERP. Marketing texts, images in several resolutions, translations, accessory and alternative references are usually out of place there. Either a PIM or the shop itself is responsible for those. Drawing this line early is cheaper than correcting it later — otherwise the ERP becomes an editorial system and every text change needs an ERP account. Where the line runs depends on the company, and it is a question we clarify before the quotation, not after.
When the customer's procurement department dictates the ordering system
OCI stands for Open Catalog Interface, a standard for electronic procurement established by SAP. Systems such as Ariba or Coupa work with cXML PunchOut instead — technically different, in principle the same. In both cases the sequence is: jump out of the procurement system into your shop, assemble the basket at the customer's terms, transfer it back in a structured format. The advantage over a static catalogue file is that prices and range are maintained in one place: in your shop. No catalogue export, no version that goes out of date at the customer's end.
The Shopware shop of Lijnco for forms and print solutions in the banking sector shows what this looks like in practice. The buyer starts in their procurement system, is logged in to the shop by punch-out with the credentials passed across, and sees the range released for them at the prices that apply to them. The completed basket does not trigger an order but goes back in the OCI field format to the hook URL of the procurement system — with part number, description, quantity, price and unit. The punch-out standard OCI 4.0 is supported there. Every integration is tested against the specific customer system, because field usage, character sets and return methods differ in practice.
So the actual work lies in the transfer back and in the coordination. Every procurement system expects the basket in a particular structure — material numbers, product groups, units of measure, sometimes classifications such as eCl@ss. The integration is only finished when your customer's e-procurement team has signed it off. For practice this means two things: an existing shop is made punch-out capable, and no second shop is needed for procurement. And one shop can serve many major customers — with a clean implementation the second customer is configuration, not a new project. Details on this on our service page about OCI and punch-out.
Shop, website and enquiry flow are three different tasks
Many companies in this sector run their shop and their corporate website separately, and that is usually a correct decision, not accumulated disorder. M&S Armaturen runs a B2B shop on Shopware 6 and the corporate website on TYPO3. Manotura operates the Magento shop and the trade website on TYPO3 as two systems. The reasons are practical: different audiences, different maintenance rhythms, different release cycles. A Shopware update should not touch the careers page, and an editorial team that maintains sustainability and careers content should not have to work in a shop backend to do so. Editorially the two sites refer to each other; technically they stay decoupled.
Where no basket makes sense at all, the project shifts to opening up the range and to the enquiry. At Wehry Regale — WordPress with a custom theme instead of a page builder — the selection depends on load capacity, height, stored goods and floor space; people who search usually know what they want to store, but not what the suitable design is called. The task of the site is then to sort the variants understandably and to keep the path to the enquiry short. At Littwin Systemtechnik, also WordPress with a lean theme instead of a stack of plugins, the point is to explain the range of services and the reference projects with technical depth, because enquiries only start when a prospect sees that someone knows their sector.
Between catalogue and enquiry sit the made-to-measure products. At Max Glas the price only comes into being once dimensions, glass type, thickness, edge finishing and fittings are defined — before that there is at best a range. The configurator there is a custom development and takes on the task that a sales conversation would have in a shop: guiding the user, limiting the permitted combinations, catching impossible input. The rule and price calculation runs on the server so that it cannot be manipulated in the browser, and the shipping logic distinguishes parcel from freight, because a large-format pane is not a parcel. With cut glass, errors that only show up in production cannot be corrected.
What applies to all three cases: which one fits you, we say before the quotation. If a shop does not justify the effort in your case — because the range needs too much consultation, or because the data in the ERP is not yet good enough — we say so and propose the smaller step.