B2B Storefront For the customers who will order themselves

A B2B storefront where buyers log in to their own prices

Today they email an order and someone on your side types it in. Here they sign in to their own products, prices and terms — and orders land in your ERP with nobody retyping them.

Live product, your order flow, no slide deck.  ·  Trial: 14 days, no credit card needed.

A B2B storefront as a logged-in retail buyer sees it A branded wholesale ordering portal for a fictional outerwear brand, Fjellkant. A sidebar lists the buyer’s own categories and shows they are signed in as Jonas Sundal of Sundal Retail. The main area shows a seasonal banner and a grid of products, each with its SKU, an in-stock indicator, the recommended retail price struck through, and beneath it the price this particular buyer pays, quoted per piece. A second row of products is partly visible below. FJELLKANT All products Most purchased Favourites CATEGORIES Outerwear Knitwear Footwear Accessories Base layers JS Jonas Sundal Sundal Retail Search entire store 4 Autumn / Winter 26 Now open to order · ships from 18 August See the range Sort by Categories Groups Price NEW Fell Jacket — Moss SKU FJ-2214-MS In stock RRP €129.00 €51.60 per piece Add Ridge Knit — Oat SKU RK-1108-OT In stock RRP €89.00 €35.60 per piece Add Harbour Cap — Navy SKU HC-0431-NV In stock RRP €29.00 €11.60 per piece Add Trail Vest — Black SKU TV-5523-BK In stock RRP €96.00 €38.40 per piece Add

The buyer’s side

Re-ordering in less than 60 seconds

Signs in at your domain. Lands on their own catalogue, at their own prices. Opens “Order again” and repeats last month into the basket. Adds three more by typing part of a code. Then the three things below happen — and they are the three a consumer webshop has no concept of.

Three steps in a wholesale basket that a consumer webshop cannot do Three overlapping screens. In the first, a basket line for a jacket shows the quantity as two cases of twenty-four with a note that the product is sold in cases of 24. In the second, the same line at forty-eight units shows the unit price dropping from €51.60 to €48.60 because a volume break applied, with the previous price struck through. In the third, a checkout screen shows a purchase order number entered by the buyer, a delivery address chosen from three sites on their account, and payment terms of NET 30. Basket 3 lines · Sundal Retail Fell Jacket — Moss SKU FJ-2214-MS 2 cases 48 units Sold in cases of 24 — quantities follow the case €51.60 per piece Line total €2,476.80 1 Basket 3 lines · Sundal Retail Fell Jacket — Moss SKU FJ-2214-MS 2 cases 48 units Volume price applied at 48 — you saved €144.00 €51.60 €48.60 Line total €2,332.80 2 Checkout Sundal Retail YOUR PURCHASE ORDER NUMBER PO-4928 DELIVER TO Sundal Retail — Bergen Strandgaten 14 · one of 3 sites on your account Payment terms NET 30 Order total €3,211.50 Place order 3
Three things a consumer webshop has no concept of — case sizes, a volume break the buyer sees before committing, and their own purchase order number travelling with the order.

Your brand, not our template

It should look like you, not like us

Your buyers should not be able to tell which platform you run — they should see your shop. Layout, colours, type, navigation, banners, the order of the product grid and what appears on a product card are all yours to change, in the interface, without booking anyone.

Two Turis storefronts that look nothing alike Two wholesale storefronts side by side. The first, for a fictional outerwear brand called Fjellkant, has a left-hand sidebar, a moss-green accent, English labels and two large product cards per row. The second, for a fictional Danish ceramics brand called Halden Keramik, has a dark teal navigation bar across the top, Danish labels including recommended price and price per piece, a note that products are sold six to a case, and three tighter product cards per row. Both are the same platform. FJELLKANT All products Outerwear Knitwear Footwear Accessories Search entire store Autumn / Winter 26 Now open to order Fell Jacket — Moss RRP €129.00 €51.60 per piece Add Ridge Knit — Oat RRP €89.00 €35.60 per piece Add Trail Vest — Black RRP €96.00 €38.40 per piece Add Harbour Cap — Navy RRP €29.00 €11.60 per piece Add HALDEN KERAMIK Alle produkter Stel Vaser Tilbud Sorter efter Kategorier Pris Havn Skål — Sand Vejl. pris DKK 249,00 DKK 99,60 pr stk · 6 stk pr kasse Vælg størrelse Fjord Krus — Grå Vejl. pris DKK 129,00 DKK 51,60 pr stk · 6 stk pr kasse Vælg størrelse Lyng Tallerken — Blå Vejl. pris DKK 189,00 DKK 75,60 pr stk · 6 stk pr kasse Vælg størrelse Sten Vase — Ler Vejl. pris DKK 349,00 DKK 139,60 pr stk · 6 stk pr kasse Vælg størrelse Eng Kande — Hvid Vejl. pris DKK 279,00 DKK 111,60 pr stk · 6 stk pr kasse Vælg størrelse Klit Fad — Okker Vejl. pris DKK 219,00 DKK 87,60 pr stk · 6 stk pr kasse Vælg størrelse
Two Turis storefronts. Different navigation, different colours, different language, different density — and neither brand wrote a line of code or booked a developer to get there.
The Turis page builder, editing a product page A drag-and-drop page builder. On the left, a palette of blocks a shop owner can drag onto the page: spacer, divider, back button, gallery, title, SKU, recommended retail price, variants, stock level and purchase. In the middle, a product page mid-edit showing a gallery, stock badges, size variants and a per-piece price, with an empty column marked “drop blocks here”. On the right, page settings with a background colour, a maximum content width of 1200 pixels and 24 pixels of side padding. In front, a smaller card offers to build a whole page from a written description instead. Product page All products Up to date Previewing Fell Jacket — Moss Active Deactivate Save draft Preview Publish Add section Drag a block into a column, or click to drop it in the selection. STRUCTURE Spacer Divider NAVIGATION Back button CONTENT Gallery Title SKU RRP Variants Stock level Purchase Section · 1 column ‹ Back to all products Section · 2 columns Drop blocks here Out of stock! Back in stock 26 Aug New! Fell Jacket — Moss SKU FJ-2214-MS Size 36 / Moss 37 / Moss 38 / Moss 39 / Moss 40 / Moss 41 / Moss €51.60 per piece Layout Page settings Page background #FFFFFF #ffffff Max content width 1200px Side padding 24px Click a section or block in the canvas to edit it. Or describe the page you want A wholesale terms page with our trade conditions and a contact block Generate New arrivals Seasonal campaign
The blocks are named after the things a wholesale product page needs — SKU, RRP, variants, stock level. And if you would rather not build it at all, describe the page and it gets built for you.

What you change yourself

  • Page layout, section by section, from blocks named after the things a wholesale page needs — SKU, RRP, variants, stock level
  • Or skip the building: describe the page you want in a sentence and it gets built for you
  • Colours, logo, type and the navigation your buyers see
  • What sits on a product card, and the order products appear in
  • Every word on the buyer side, in any of the languages you run

What still needs us

  • A custom domain, and the certificate behind it
  • Connecting your ERP the first time
  • Anything that needs code we would have to write and maintain — and we will tell you on the call whether yours is that, rather than after you have signed

Can it handle our complexity

What wholesale actually requires

A retail webshop has one price, sells in ones, and takes cards at checkout. Wholesale has none of those luxuries. Here is what that means in practice — starting with the three that decide deals.

Prices and visibility

One list decides what they pay — and what they see

Every customer can have their own price on every product: per customer, per group, per product group, overridden at any level. The same list controls the catalogue — a product with no price for that account is invisible to that account, so private-label lines stay private with no second permissions system to drift.

  • Volume breaks the buyer sees in the basket, before committing
  • Automatic discounts on conditions you set, stacking in an order you control
  • Show a retailer their own margin on the product page
  • Leave the price blank and the product does not exist for them
A customer’s price list in the Turis back office A price list for the customer Sundal Retail. Three products: a jacket priced at €51.60 with a volume break to €48.60 at 48 units, a knit priced at €35.60, and a cap with no price entered — marked as hidden from this customer, because a product with no price on the list is invisible to that account. A margin column shows what the retailer makes at their price. Price list — Sundal Retail 42 products priced PRODUCT RRP THEIR PRICE MARGIN Fell Jacket — Moss FJ-2214-MS €129.00 €51.60 60% 48+ units → €48.60 · volume break Ridge Knit — Oat RK-1108-OT €89.00 €35.60 60% Harbour Cap — Navy HC-0431-NV €29.00 No price on this list — hidden from Sundal Retail Set per customer, per group, or per product group — overridden at any level.
One screen decides both what Sundal Retail pays and what Sundal Retail can see — a product with no price on their list does not exist for them.

Preorder and stock

Sell the season before it exists

A buyer commits to autumn in March, split across an August and an October drop, each window with its own minimum, at prices held from the day they signed. That is the difference between a preorder engine and a spreadsheet called AW26_commitments_FINAL_v3.xlsx.

  • Backorder, with the expected date on the line as they add it
  • Stock held while an order is approved — the last twelve units cannot sell twice
  • Quotes that convert to orders with no re-keying
  • Subscriptions the customer pauses, adjusts and skips themselves
A seasonal preorder split across two delivery windows A preorder screen for the AW26 range, committed on 12 March. A timeline shows two delivery windows: August, with 120 units committed against a minimum of 96, and October, with 144 units against a minimum of 96. A note says the buyer commits once and the two drops invoice separately, at the prices agreed in March. Preorder — AW26 range Sundal Retail · committed 12 March Fell Jacket — Moss FJ-2214-MS · not yet in production €48.60 preorder price, held March you commit August drop October drop WINDOW 1 · AUGUST 120 units minimum this window: 96 ✓ WINDOW 2 · OCTOBER 144 units minimum: 96 ✓ One commitment, two deliveries, invoiced per drop — at the prices agreed in March.
A buyer commits to autumn in March — split across an August and an October drop, each with its own minimum, priced when they signed.

Express Ordering

The buyer who prefers Excel keeps Excel

Some buyers will never browse a catalogue, and they do not have to. They paste their spreadsheet — or upload the CSV — and the basket fills itself at their prices. You get a clean order; they never change how they work.

  • A half-typed product code still finds the right product
  • Barcode scan-to-add — restock from the stockroom shelf with a phone
  • Saved baskets, and lists shared across the buyers on an account
  • Search that copes with typos and partial part numbers
A pasted spreadsheet becoming a priced basket Two panels. Left: four raw spreadsheet rows with product codes and quantities, one code incomplete. Right: the same rows as basket lines with names, case-rounded quantities and that customer’s prices — the incomplete code matched to the right product. An arrow labelled “pasted” connects them. order_aug_FINAL2.xlsx FJ-2214-MS 48 RK-1108 24 CB-3310-RT 36 TV-0902-BK 12 pasted Basket · 4 lines Fell Jacket — Moss 48 units · their price applied €2,332.80 Ridge Knit — Oat 24 units · their price applied €854.40 “RK-1108” matched to Ridge Knit — Oat Crag Beanie — Rust 36 units · their price applied €417.60 Trail Vest — Black 12 units · their price applied €508.80 Order total €4,113.60
The buyer who prefers Excel keeps Excel — the paste fills the basket, at their prices, and a half-typed code still finds its product.

The rest of the list

And then there’s everything else

None of it needs a full section. All of it is the difference between a webshop and a wholesale operation — so it is all here, one line each, documentation one click away.

Minimum order quantities

Per product, overridden per customer where you agreed otherwise.

Pack and case sizes

Cases of 24 means the basket only allows 24s — and says so on the line.

Minimum order value

A floor per customer, with the basket showing how far off they are.

Credit terms per customer

NET 30, NET 60 or up front — set per account, shown at checkout.

Credit limit blocking

Orders stop before the goods ship, not after the invoice bounces.

Purchase order capture

The buyer’s PO number travels into your ERP, so your invoice gets paid on time.

Tax by where the buyer is

VAT by country and status, including reverse charge inside the EU.

Shipping rules to the postal code

Zones, rates and carriers — the island surcharge enforces itself.

Multi-region storefronts

One back end; per-region language, currency, price list and tax.

180+ languages on the buyer side

The Portuguese pharmacy chain orders in Portuguese. You translate nothing.

Dropshipping with its own prices

Ship direct to their end customers — dropship terms never leak into trade terms.

Multi-site accounts

Nine shops, one parent account. Each orders for itself; you see all nine.

Sign-off before an order is placed

Held until the named approver approves — an unapproved basket is never an order.

Stock per warehouse, per buyer

Each customer sees the availability that is actually theirs.

Exports with the paperwork’s fields

HS codes included — the freight forwarder’s spreadsheet comes out of Turis.

After they press order

It lands in your ERP with nothing to re-key

An order placed in the storefront arrives in your ERP — the system holding your stock, prices and invoices — with the customer, the products, the agreed prices, the tax treatment, the delivery address and the PO number already attached. Nobody re-keys it, which means nobody mistypes it.

Native connections to Microsoft Dynamics 365 Business Central, SAP, Infor M3, Visma Net, Rackbeat, Uniconta and Xero. Anything else connects through our API or a flat-file import, and we will tell you on the first call whether yours is straightforward, a project, or a bad fit. See all integrations →

And when you need the data out rather than in: product and order exports carry the fields the paperwork actually needs — including HS codes for customs — so the freight forwarder’s spreadsheet comes out of Turis instead of being assembled by hand.

Technical detail — what happens when the ERP is down, and how it is secured
If your ERP is unavailable
Orders are accepted in the storefront and queued, then written when the connection returns. A buyer’s order is never lost because your back office is down.
Security and compliance
SOC 2, ISO 27001, and a 99.99% uptime SLA.
Getting connected
The first ERP connection is ours to make, as part of implementation and support through to go-live. It is not a fee and it is not an upsell.

Anything below this level of detail — sync intervals, field mapping, single sign-on, where your data is hosted — is a question for the call, and you will get a straight answer rather than a brochure.

Before you ask us

The questions that come up first

In roughly the order they get asked. The big one — will our customers actually use it — has a section of its own further up, because a line in a list was never going to be enough.

Do our customers have to log in to see prices?

They log in, and then they see their own prices — which is the point. What they never see is a “contact us for trade rates” wall, because their agreed price is loaded before they arrive rather than quoted on request.

What about the customers who will never use a portal?

They keep emailing, and Vision reads what they send — PDF, spreadsheet or plain text — and turns it into an order in the same list as the portal orders. You do not need every buyer to log in; you need every order to arrive the same way.

Can it handle our pricing? It is complicated.

Per customer, per customer group, per product group, with volume breaks, and with automatic discounts on conditions you set, stacking in an order you control. A blank price on a customer’s list also hides the product from them, which is how private-label lines stay private.

Do we need a developer?

Not for the shop. Layout, colours, navigation, the product card and every word on the buyer side are yours to change in the interface — or you can describe the page you want and have it built for you. A custom domain and the first ERP connection are ours.

How many users do we get?

No per-user charge and no seat count to manage. Turis is priced by order channel, so putting your whole team in it costs the same as putting one person in it.

How long until we are live?

It depends on how clean your product and customer data is, and we would rather look at yours than quote you an average. Implementation and support all the way to go-live.

What does it cost?

From €299/mo, priced on the value of orders that go through the storefront. No setup fee, no commission and no per-user charge. The full ladder →

What if we outgrow you?

Your data is yours, and it comes out two ways: a full CSV export of products, customers, prices and order history, and the API, which is the same one the platform runs on. 12 months, and there is no exit clause to negotiate because there is nothing to exit.

See it with one of your own orders

Send us a real purchase order — a messy one, ideally — and we’ll show you what Turis does with it on the call.

Live product, your order flow, no slide deck.  ·  14 days, no credit card needed.  ·  No commission on your sales, ever.