For Wavedigital s.r.o. we designed and built a complete e-commerce platform – B2B and B2C e-commerce for multiple markets that Wavedigital offers as its own product and rolls out to other shops. It isn't a single online store but a finished, battle-tested foundation: catalogue, pricing, orders, carriers, payments, stock and invoicing, comparison sites, tracking and fully editable content. Every new Wavedigital client gets the platform tailored to their brand, range, markets and processes – and launches in a fraction of the time and cost of building from scratch.
The platform is live and handles real orders. Every capability described below is shipped code, not a roadmap.
A product designed to be replicated
From day one we built it to run for many clients at once. That's why everything that differs between shops is configuration in the admin, not code changes: markets, currencies, VAT, carriers, payments, ERP, e-mail templates, tracking codes, feeds and website content. The storefront is designed for each client – no hard-coded template, design and copy stay in the client's hands.
- Launching a new client = a new storefront design, content in the CMS and configuration in the admin. The core, business logic and integrations stay the same and tested.
- A client without an ERP or carrier contracts starts with manual stock, manual invoicing and a manual carrier – exactly how the public demo runs. Integrations can be switched on later without rewriting anything.
- A new sales channel (mobile app, POS, marketplace) connects to the existing API – an integration, not a rebuild.
Architecture: API-first and headless
A single ASP.NET (.NET 10) API powers the storefront, the admin and anything else. Inside is a modular monolith with seventeen separate modules, each with its own data model (EF Core on PostgreSQL). New channels plug in instead of being written into the core.
- Next.js 16 and React 19 storefront – server-side rendering, fast loading, accessibility and SEO. Domains and languages per market.
- Strapi 5 as a headless CMS – pages, sections, blocks, blog and legal texts are edited by the client. Products and prices come from the API, not the CMS, so content and business logic never mix.
- A separate admin – around seventy screens grouped by task: daily operations, settings and monitoring.
- Over a thousand integration tests against a real database, plus end-to-end payment and return scenarios.
Multiple markets and full localisation
The platform works with CZ, SK and PL markets. Each market has its own currency, VAT rates and tax regime, carriers, payments, sender identity and tracking code. Customer-facing texts are handled by the API, not the frontend – one change applies to the website, e-mails and documents. The admin shows revenue per market (e.g. Czechia in CZK and Slovakia in EUR) broken down into VAT, shipping and payment fees, so the numbers can be compared directly with comparison sites.
B2B and B2C pricing in one price list
- Price groups – wholesale, partner, VIP, as many as the shop needs. A customer assigned to a group immediately sees their prices on the website and in their account.
- Individual customer prices as a percentage or fixed amount, from a single variant to a whole brand, for a chosen market and with a validity period.
- The system always picks the best price – no rule ever raises a price. Every price change and group assignment is recorded in the history.
- Omnibus – tracking the lowest price of the last 30 days; a discount is shown only for a real price drop.
Promotions, coupons and loyalty
- Percentage or fixed discounts, free shipping or “buy two, get the third free”. Coupons and automatic promotions without code or deployments.
- Targeting products, categories, brands, the whole cart or the cheapest item. Conditions such as minimum spend, quantity, first order or a specific price group.
- Controlled stacking – a promotion can be exclusive, “best one wins” or combinable. A safeguard against typos: the total cart discount never exceeds a set cap.
- Coupons generated in batches with usage limits overall and per customer, scheduling ahead, draft / active / paused states, targeting per market. What was applied stays on the order – evaluating a campaign is just a filter.
- Loyalty programme – points for delivered orders (separate rates for CZK and EUR so the exchange rate doesn't move the programme), Basic, Bronze, Silver and Gold tiers with up to 10 % off; points are deducted again on returns.
Catalogue and product data
- Catalogue import that transfers only what actually changed, and import from supplier XML feeds including photo download.
- Variants and variant merging, parameters by product type, brands, bundles, accessories and alternatives.
- Categories including automatic ones (“new”, “sale”), translations and visibility per market, custom filter order.
- Full-text search in PostgreSQL with custom relevance ranking and search-term statistics.
- Server-generated WebP thumbnails, documents and certificates on products, extended warranties and paid add-ons as upsells right in the cart.
Carriers: API and manual mode
- Zásilkovna / Packeta – pick-up points via widget, labels, tracking, cash on delivery (CZ and SK).
- PPL – courier and ParcelShop, labels, bulk tracking, live service catalogue in the admin.
- DPD – courier and pick-up points, labels via API, the Slovak branch with its own integration.
- Balíkovna (Czech Post) – pick-up points and home delivery, labels, reprints, tracking.
- SPS, and for the Polish market DPD PL, InPost and Poczta Polska through one integration.
- The label is created automatically when the shipment is ordered – staff just click and print. Shipment statuses are pulled automatically into the order and the customer's e-mail.
- Prices by weight, volume and longest side, carrier limits, oversize, free-shipping thresholds, delivery estimates per market and return addresses.
- A manual carrier for shops without a carrier contract – the order runs as usual, staff just add the tracking number.
Payments: with or without a gateway
- GoPay – card payments in production, refunds, configuration monitoring. Stripe, ČSOB and PayU are implemented and ready to switch on.
- Cash on delivery with a carrier-based fee and cash limit, pro forma bank transfer, invoice with payment terms for verified B2B customers and payment in store.
- QR payments in e-mails, on documents and on the thank-you page (Czech, Slovak and Polish formats), bank payment matching.
- Unpaid orders are reminded automatically and cancelled after the deadline.
Stock, invoicing and ERP
- Money S3 – stock, price lists, invoices and pro formas, delivery notes, transfers and receipts.
- POHODA via mServer – the system checks by itself what the licence supports.
- Fakturownia (PL) and BitFaktura (SK) – invoicing including PDFs and payment status.
- Manual stock and manual invoicing for shops without an ERP – the API issues documents with their own number series and PDFs.
- Stock and invoicing are assigned per market and can be combined freely. Stock reservations on order by payment method, pre-orders, lead times, low-stock alerts, multiple warehouses and a manual lock that synchronisation never overwrites.
Marketing, tracking and comparison sites
- Google Tag Manager and GA4 configured per market in the admin, not in code. A cookie banner with Consent Mode v2 and e-commerce events across the whole purchase funnel.
- Server-side conversion safeguard – if the browser fails to confirm a purchase, the server sends it (GA4 Measurement Protocol, Meta Conversions API, Data Manager API). Cancellations and returns are deducted so revenue in ads stays accurate.
- Seven shopping channels are filled automatically: Google Merchant, Heureka CZ and SK (including an availability feed refreshed within minutes and Heureka Marketplace), Zboží.cz, Ceneo, FAVI and Biano.
- Rules for excluding products from feeds and ads, custom labels (price and margin bands) for smarter campaigns, and a publishing safeguard: a sudden drop in the offer isn't published and the previous version is restored.
- Newsletters – Ecomail, Mailchimp, Brevo and Klaviyo with double opt-in; Heureka “Verified by customers” including consent at checkout.
- SEO – product structured data (reviews, availability, shipping, returns, FAQ), sitemaps and hreflang across all languages and domains, automatic 301 redirects on URL changes and IndexNow, which reports new prices or products to search engines instantly.
Customers and communication
- Online withdrawal from the contract under EU Directive 2011/83 – a button, not a downloadable PDF, even for guest orders. Statuses from request to refund, refunds via the gateway or to a bank account, and returned goods automatically back in stock.
- Abandoned carts – a reminder with the cart contents, only for customers who opted in, with configurable delay, minimum value and maximum age; unfinished payments are tracked separately.
- Over 30 e-mail templates editable in all languages, custom SMTP or Amazon SES with a different sender per market, a queue with retries and automatic blocking of undeliverable addresses.
- Customer accounts for businesses and consumers – address book, order history, own prices and loyalty points; GDPR account deletion while keeping accounting documents.
- Order tracking without logging in via a signed link, and moderated reviews with verified-purchase badges.
Admin and operations
Around seventy screens for daily operations (orders with a timeline and documents, shipments, returns, enquiries, customers), settings without a developer (shipping, payments, ERP, e-mails, tracking, feeds) and monitoring – queue and job health, publishing checks, acceptance tests against the live website with a PDF report, a checkout simulator and a QR payment test.
- Roles and permissions (administrator, editor, marketing, viewer) enforced by both the API and the interface; the permission matrix is itself a page in the admin.
- Audit and history – who changed what and when for products, prices, shipping, payments, SMTP and webhooks.
- Files on S3 with a CDN or on the server – a switch, not a rewrite; invoices, labels and logs only via time-limited links.
- Visible operations – logs in Loki, metrics in Prometheus, dashboards in Grafana and errors in Sentry. Deployment runs in Docker via CI/CD with separate staging and production.
How we worked on the project
We built the platform for Wavedigital in five months with a team of three – from architecture and data model design through the API, storefront and admin to carrier, payment and accounting integrations, tracking and operational monitoring. The result is a product Wavedigital can sell again and again: every new shop runs on the same tested core and differs only where it should.









