Start a project
We'll respond as soon as possible with clear next steps — no obligations.
Case study · Beauty & wellness
Onyx Lashes supplies lash and brow professionals in Switzerland and Liechtenstein and sells to private customers as well. We rebuilt the established shop on WordPress and WooCommerce: one catalogue in German, French and Italian, with net prices for verified businesses and gross prices for everyone else.

The brief
Onyx Lashes is a Swiss beauty brand based in St. Gallen, focused on products and training for lash extensions. The shop carries three brands — BL Lashes, its own Onyx Lashes line and L’Avely — across lash extensions, lash and brow lifting, tools, accessories, skin care and marketing material.
The rebuild had to turn the established shop into one catalogue for two audiences: verified businesses buy at net prices, private customers at gross prices — in three languages, with the order history, customer accounts and old product addresses carried over.
The challenge
Businesses and private customers buy the same lashes, but not at the same price. Trade prices stay hidden until a business is verified, and the price mode reaches filters, sale category, page cache and orders.
The lash range adds depth: length, curl and thickness create up to 98 variations on a single product, and every page had to stay cacheable.
Every product and variation carries a net price for businesses. It unlocks only after a check against the Swiss federal UID register.
German, French and Italian for products, categories, attributes, forms and menus — with delivery to Switzerland and Liechtenstein and pickup in St. Gallen or Gamprin.
Order history and customer accounts going back to 2016 moved to the new shop, and 195 old addresses redirect to the matching new pages.
Behind the build
A shop with two price worlds touches every discipline. One in-house team carried it from the first commit in April to the go-live switch in July — planning, design, B2B code, content in three languages, SEO, security and support — with one project lead as the client’s contact.
What we built
Price switch
A toggle in the header switches the whole shop between gross consumer prices and net trade prices. The page cache respects the choice, and the price filter, the sale category and the order labels follow the active mode.
Product configurator
The lash range lives in variations — up to 98 on a single product. Customers pick length, curl and thickness as buttons, every variation has its own trade price, and search engines receive the whole set as a product group with variants.
Shop landing
Instead of a bare product list, the shop opens with category tiles and their icons, followed by bestsellers, a call to action, a sale section and shop questions — all assembled from the shop’s own Gutenberg blocks.
Solutions
Five solution pages speak to lash stylists, salons and studios, private customers, buyers looking for a Swiss supplier and customers in Liechtenstein. They are built from four dedicated solution blocks and published in all three languages.
Three languages
Products, categories, attributes, forms and menus run in de-CH, fr-CH and it-CH. A custom hreflang module links the language versions, including paged archives, and a small guard keeps the currency position right in the translated shop.
Inside the project
Most agencies show you the finished site. We show you how it got there. Open any discipline to see what the team did and what it handed over.
01 / Project management
Every task got its own branch and pull request — 98 merged across the theme and the block plugin. A merge to main builds the code with GitHub Actions and deploys it by FTP; the go-live itself was a switch of that deploy target.
98
merged pull requests in two repositories
15
weeks from first commit to go-live
What we did
Handed over Approved scope and requirements → Design
02 / UI/UX design
The brand’s gold-and-black look became a shared system: the accent gold and dark tones from the theme settings mirrored into the block palette, seven custom widgets such as the language switcher and the shop banner, SVG icons for the product categories and a branded PDF template for invoices and packing slips.
7
custom widgets, from language switcher to shop banner
What we did
Artifacts
Handed over Figma designs and a block system → Development
03 / Development
A Blocksy child theme with three post types and 16 WooCommerce modules, a plugin with 24 blocks, and our own B2B plugin: price modes, a trade role, a checkout gate and UID verification. Payments run through Payrexx, documents through a custom PDF template.
24
custom Gutenberg blocks in five categories
16
WooCommerce modules in the theme
4
own plugins, including the B2B Switcher
What we did
Artifacts
Handed over Tested build on staging → Content & SEO
04 / Content
The catalogue runs in three languages: 144 products and 37 categories per language, eight product attributes and three brands. Around it sit five solution pages, two brand profiles, lash-care articles and the legal pages, each in German, French and Italian.
144
products per language
37
product categories per language
39
pages, 13 per language
What we did
Artifacts
Handed over Structured content in the CMS → SEO & GEO
05 / SEO & GEO
Search engines see one shop in three languages, not three loose copies: a custom hreflang module, store schema with shipping and returns, product groups with variants, FAQ markup and 195 permanent redirects from the old shop addresses.
195
301 redirects from old shop URLs
25
schema types on the home page
9
XML sitemaps
What we did
Artifacts
Handed over Indexed, crawlable site → Launch
06 / Cybersecurity
Trade prices are treated as access rights. Only a passed UID check grants the trade role, a failed one removes it, and the checkout enforces it — for guests too. SVG icons can be uploaded by administrators only and are cleaned of scripts.
What we did
Handed over Security checks for launch → Support
07 / Technical support
The work continued after the go-live: a stock manager for the warehouse, a rebuilt product schema, invoice and packing-slip templates, and fixes for B2B order labels and the currency display — 13 theme commits after launch so far.
13
theme commits after the go-live switch
What we did
Handed over Ongoing — we stay with the client
The project in numbers
Every figure is counted from the live shop, its code and its database.
3
languages: de-CH, fr-CH, it-CH
144
products per language
37
product categories per language
24
custom Gutenberg blocks
4
own plugins, including the B2B Switcher
195
301 redirects from the old shop
25
schema types on the home page
98
merged pull requests
Below the surface
Visitors see a toggle and a price. Behind them sit the checks, rules and redirects that keep two price worlds apart and the old shop’s addresses alive.
195 permanent redirects lead old product, category and brand addresses to the matching pages of the new shop.
Organization and store schema with shipping options, a 14-day return policy and 33 knowsAbout topics in four languages.
Our own hreflang groups with x-default replace the translation plugin’s output, so paged archives stay linked in all three languages too.
Business numbers are verified live against the UID register of the Swiss Federal Statistical Office, through its official web service.
The page cache varies on the B2B view cookie, and variation data for up to 120 options is embedded so product pages stay cacheable.
A stock manager shows product and variation stock together, with inline edits and a CSV export for suppliers.
98 merged pull requests, and every merge to main builds and deploys theme and blocks through GitHub Actions.
Category icons are SVG files, so uploads are limited to administrators and pass a filter that strips scripts and event handlers.
What you can expect
We build for the things that last — a platform that is clearer to navigate, more credible to every visitor and genuinely easier for your team to run and grow.
Clear categories, filters and prices let visitors find the right offer themselves instead of writing to ask where to begin.
A site that looks and reads like the quality behind it — for first-time visitors and long-standing customers alike.
Your team updates products, content and news itself — no developer ticket, no waiting in a queue.
New products, categories and languages slot in as the business expands — without a rebuild.
We agree the goals that matter up front and build toward them together — then stay on as a partner after launch to keep the platform sharp as the business grows.
In their words
A project is only finished when the people who use it every day would choose it again.
Salons and private customers now shop in the same place, each at their own price and in their own language. Trade accounts are checked automatically, and we manage our stock on one screen.
Working with
Start a project
We will respond as soon as possible with clear next steps — no obligations.