# B2B ecommerce that behaves like B2B, not retail with an invoice

> A B2B ecommerce platform has to handle what retail checkouts do not: company accounts with several people and roles, order approval before anything ships, credit limits and payment terms, negotiated pricing per group, and price lists that vary by country and channel. Valenys builds all of it on Laravel, in the same system that runs the rest of the business.

Source: https://valenys.com/platform/commerce/
Updated: 2026-09-10

---
_Company accounts with several people and roles, order approval before anything ships, credit limits and payment terms, negotiated pricing per group._

Platforms designed for retail tend to add B2B afterwards. You can tell, because the seams show at the same three places every time: the buyer cannot delegate, the order cannot wait for an approval, and the price cannot depend on who is asking.

## What a real B2B store needs

### Buying as a company

A company account holds its own people, with four roles: administrator, buyer, approver and accounts. A buyer places an order and it exists, with a number — but it does not move forward until it is approved. Credit limits and payment terms are enforced, with the limit consumed at placement rather than at invoicing.

### Several markets from one catalogue

A fully translated catalogue, several currencies with rates updated daily from the national bank feed, intra-community reverse charge, OSS reporting for distance sales, and VIES verification of the buyer’s VAT identifier before the rate is applied. The cart keeps the currency it started in.

### A warehouse, not a stock number

Several warehouses with stock per variant and location. Reservations at placement, released on cancellation, deducted at dispatch. Batches and serial numbers with expiry dates, and dispatch in FEFO order. Stock take sessions that freeze the expected quantity at start. Shelf and aisle locations.

## Revenue, orders and the funnel on one screen

B2B and B2C side by side, the checkout funnel under them, and the products that carry the month. On three separate systems, the question "why did the margin drop" costs three exports and an afternoon.

## Commerce, in the last few weeks

Taken from the changelog, not written for this page.

## What it connects to

Which of these apply depends on your markets — the Central and Eastern European set is the deepest, and adapters for other regions are part of scoping.

### Payments

Adapters for Stripe, PayU, Netopia, Twispay and EuPlătesc, instalments through TBI Bank, plus cash on delivery and bank transfer. Server-to-server notifications are signature-verified; refunds go back through the processor where the adapter allows it.

### Carriers

Sameday, Cargus, FAN Courier, DPD and GLS, with pickup points and parcel lockers validated against the carrier network, automatic AWB tracking, and delivery estimates in working days with a per-product cut-off.

### Invoicing

SmartBill and FGO, issued automatically at a status you choose, with credit notes. e-Factura status is written back from the national SPV system. In the CRM, Oblio is synchronised read-only — deliberately, because an accounting account is not a place to write from a shop.

### Marketplaces and feeds

eMAG Marketplace offers and orders. Product feeds for Google Merchant Center, Meta, Compari and Price.ro, plus a review feed for Google Product Ratings.

## Replatforming without losing your rankings

Migration imports from **WooCommerce**, **PrestaShop** and **Shopify**, from an exported file or through the WooCommerce REST API directly. Old addresses are mapped to 301 redirects, matched on SKU, and the mapping covers every URL shape the previous platform served — not just the canonical one. Content migrates from **WordPress** through a streaming WXR import that resumes without creating duplicates.

Uploaded files pass through a mapping screen before anything is written, because the first real migration always finds columns with names nobody predicted. Automatic recognition sits *below* the platform translation, not instead of it.

## Found by Google and by AI models

This is where a catalogue earns its place in an answer rather than just in a list.

### Structured product facts

What it is for, who it suits, what it works with, what it cannot do, what is in the box. Five kinds, one fact per row, emitted in Schema.org structured data as discrete PropertyValue pairs rather than melted into a paragraph. Offers carry OfferShippingDetails and MerchantReturnPolicy.

### A compatibility graph

“Works with”, “replaces”, “is used with”, either as direct links or as rules on brand and attribute. A rule written once covers products added six months later. “Works with” reads in both directions; “replaces” deliberately does not, because read backwards it would recommend the discontinued part.

### A machine-readable catalogue

Clean product JSON, versioned in the address, rate limited, with an actions block describing what can be done and where.

### Crawler control, per robot

Googlebot, Bingbot, Applebot, GPTBot, ClaudeBot, CCBot, OAI-SearchBot, PerplexityBot and Google-Extended are managed individually, with three decisions taken separately: search, citation in generated answers, and training. The rule is enforced on every request, and the log records refusals too.

## Compliance inside the product

**Omnibus** reference pricing calculated from the lowest price in the thirty days before a discount, shown on the page and in feeds, with the review verification policy stated next to the reviews. **GPSR** manufacturer details, EU responsible person, warnings and pictograms. The statutory fourteen-day return period.

The digital right-of-withdrawal function is a separate module and has its own page: [right of withdrawal](/solutions/right-of-withdrawal/).

## Tell us what you sell, to whom, and in which markets

Migration scope and integration scope are the two things that move a quote, and both are settled in scoping.

## Frequently asked questions

**Can we sell to businesses and consumers from the same store?**

Yes. Company accounts, approval flows and negotiated pricing apply to the business side; consumer protections — Omnibus reference pricing, the fourteen-day return period, the withdrawal function — apply to the consumer side. Both run from one catalogue.

**Will migrating from Shopify or WooCommerce cost us our search positions?**

Migration maps old addresses to 301 redirects, matched on SKU, covering the URL shapes the previous platform served. That is what protects the equity you have. No supplier can honestly promise zero impact — what we do is remove the avoidable causes.

**Which payment providers and carriers are supported?**

Card payments through Stripe, PayU, Netopia, Twispay and EuPlătesc; instalments through TBI Bank; cash on delivery and bank transfer. Carriers: Sameday, Cargus, FAN Courier, DPD and GLS, with pickup points and lockers. Which apply depends on your markets, and adapters for other regions are part of scoping.

**Can it handle several stores?**

Yes. One Laravel installation runs several shops, isolated from one another, with the same product carrying its own price and visibility per store from a single record.

**Do you support marketplace selling?**

eMAG Marketplace offers and orders are supported, alongside product feeds for Google Merchant Center, Meta, Compari and Price.ro. Scope for other marketplaces depends on your markets.

**What happens to our data if we leave?**

You take it. Products, customers, orders, stock and redirects export as CSV, XLSX, XML or JSON, and the Laravel source code is yours. Nothing sits in a format only we can read.
