A skincare house, launched end-to-end. I designed the brand and the design system, built the storefront front end, wrote the pipeline that moved the catalogue, and shaped the commercial model behind it — one designer, four hats, one launch date.
Role
Product experience design → front-end → data → commercial
Context
Solo founder-operator, DTC e-commerce (Italy)
Stack
Shopify Horizon · Liquid · CSS · Node · Klaviyo
Shipped
Live storefront + physical soft launch, on schedule
Tirvela Boutique is the curated Italian distributor of Mokann, a Polish natural-skincare house. The name evokes the drawn veil — a curator pulling back what conceals, and revealing. The customer reads ingredient lists, buys from Aesop and Buly, and finds quiet luxury more credible than loud novelty.
The mandate was unusually wide: build a storefront that never feels like a catalogue redirecting out to a supplier — everything happens inside Tirvela's design system, in Tirvela's voice — and stand it up in time for a fixed launch, with a single operator wearing every role. No brand book, no theme, no product data in Italian, no team to hand any of it to.
The interesting constraint wasn't any single discipline — it was that design, engineering, and commercial reality had one owner, so the decisions had to hold together across all three. Not four separate projects. One system of decisions that had to survive contact with the front end, the database, and the accountant.
A product experience designer first; a founding designer who ships, second. Concurrent, each constraining the others.
The lead
brand, design system, and every screen — from the diagnostic-quiz flow to the product page. Design system, user flows, wireframes, UX copy (IT), art direction.
Designer who ships
rebuilt the Shopify theme by hand in Liquid and CSS — custom sections, tokens, motion, WCAG-graded accessibility. No handoff to lose.
Under the hood
Node tooling to scrape, match, and reconcile the catalogue from source into Shopify — products, metafields, SEO — behind a custom Shopify dev app.
The why
two-step business model, supplier negotiation, cross-border logistics, two-channel launch, GDPR + payment + tax foundations.
Built the design system as the single source everything else references: a six-colour, all-neutral palette; a locked type pairing; a 4px spatial scale; motion durations; and premium-signal rules (one hero and one CTA per section, editorial sentences over bullets, no urgency timers, no discount badges).
Because the person who defined the tokens also wrote the CSS, the system was executable, not aspirational — the palette hexes ship in the theme.
Palette — six colours, all neutral
Ivory
#FDFAF7
Soft Cream
#F5EFE7
Stone
#E8DFD6
Clay (accent)
#C8B8A8
Warm Taupe
#8B7F75
Deep Charcoal
#2B2520
Flows, not just screens. The experience is organised around a diagnostic quiz — Cosa cerca la tua pelle? — that turns a wide catalogue into one considered recommendation, and quietly becomes the demand-data engine the commercial model depends on. Product pages are ingredient-led without going clinical; the collection uses a mixed-size editorial grid.
One signature interaction anchors the system: the drawn veil — a single slow reveal, used once per page at most, where the most important moment enters as if fabric were being lifted. The brand's name expressed as motion.
The storefront runs on Shopify's Horizon theme. I forked the live theme and rebuilt the visual layer as custom tirvela-* sections — each editor-friendly, each independently roll-back-able, each preserving the reviews, email-capture, loyalty, and translation apps already wired in.
Design tokens became real CSS custom properties (glass surfaces, blur, reveal motion) applied through a trv- BEM convention, so the light and dark editorial schemes stay consistent without duplicating styles.
Accessibility was a spec item, not a wish. Every colour pairing verified against WCAG 2.2 before shipping. Scroll reveals run through one idempotent IntersectionObserver that respects prefers-reduced-motion; focus rings visible; touch targets ≥44px; a Salta al contenuto skip-link in the head.
The products existed in Polish, on the source house's site. Getting 32 of them into Shopify — correctly matched, translated, enriched with metafields, SEO-clean — was a data problem. Built a Node pipeline for it behind a custom Shopify dev app instead of copy-pasting by hand.
Pipeline — source site → Shopify
Shared library for source access, translation, and XLSX/DOCX export, so the same reconciliation produced a human-readable audit as well as writing to the store. A dedicated diff (fix-mokosh-mapping.mjs) surfaced source-vs-live mismatches instead of letting them rot in production.
Owning both design and data meant product copy, metafields, and SEO slugs were decided together — one voice, source to search result.
Tirvela sells DTC first, then uses a year of demand data to walk into Italian wholesale (saloni, parafarmacie, profumerie, hotel SPA) with proof instead of a pitch. That strategy is why the diagnostic quiz exists, why data hygiene is strict, and why the storefront is modular enough to add brands later.
The wholesale conversation isn't "please stock us." It's a dashboard: here are the postcodes, the porosity distributions, the basket sizes, the repeat rate. Hard to dismiss.
The supply chain, owned end-to-end. Negotiated the international distribution terms directly — a waived freight cost on the pilot order and a tiered minimum-order structure (€500 scaling to €800+) that protected cash flow while demand was still unproven. When the first cross-border shipment landed with damaged units and missing SKUs, ran the recovery personally: a structured, spreadsheet-based tracking system reconciling every line against the order, closing the gaps without moving the launch date.
Compliant by design. Data model mapped to GDPR lawful bases (contract, consent, legitimate interest); payment stack kept at PCI scope SAQ-A (no card field ever renders on our domain); Italian essentials specified: IVA 22% in displayed prices, fattura elettronica to the SDI, 14-day right of return under the Codice del Consumo. Wrote the full legal suite (Privacy, Cookie, T&C, Spedizioni, Resi e Recesso, Informazioni Legali).
Signature moment
Where design, engineering, and law met in one decision.
The store had to launch on its fixed date, but the business legally could not take a single euro until its Partita IVA registered ~12 days later. A live store that can't sell, with no self-built payment code allowed. The obvious tools were all wrong: a pre-order app collects money (illegal in the gap); a custom waitlist is infrastructure I refused to own for security reasons.
01
All 32 products stay published, priced, browsable — but every variant tracks inventory at quantity zero with "continue selling when out of stock" off. Checkout physically cannot complete. No money path exists, no theme code touches payment. Safe by construction.
02
Bare "Esaurito" relabelled to Disponibile a breve, beside a Klaviyo back-in-stock block (Avvisami quando disponibile). Consent checkbox, privacy link, GDPR-clean. Marketing, not selling — permitted before the P.IVA.
03
P.IVA registers → legal placeholders filled → real stock set above zero. Klaviyo auto-emails every waitlister; they return and buy normally. Checkout was never modified, so nothing to "switch on" beyond the stock number.
Zero lines of custom payment code. A hard legal wall turned into a demand-capture window — solved with product configuration and one already-installed app, not new infrastructure. The whole thesis of the case study in a single decision.
The launch wasn't only digital. Ran a physical soft launch — an interactive workshop and aperitivo — as the brand's first real-world touchpoint, to validate the product, fund the inventory, and generate the proof the online store would run on.
Service design, off the screen. Translated the same principles that shape a good checkout into a physical room: a tactile, high-trust testing environment where trying the product removed buyer friction on its own and triggered immediate sales. The evening liquidated nearly half the initial inventory (≈ €300) in a single sitting.
Cash-flow-positive before the stock landed. High-volume pre-orders covered the cost of the incoming inventory before it physically arrived — product-market fit validated in cash, not surveys. Managed the wait deliberately: supply-chain updates framed the delay as an exclusive allocation, so the pause built desire instead of doubt.
None of it leaned on paid advertising. The event generated the social proof and content that carried brand visibility straight into the online launch.
~½
launch stock sold in one evening (≈ €300)
€0
freight on the pilot order (negotiated waiver)
0
paid ads
0
lines of custom payment code
The sequence — one operator, six moves
01
Negotiation
terms, freight waived
02
Pilot order
tiered MOV €500 → €800+
03
Pre-orders
inventory funded before landing
04
Soft launch
workshop + aperitivo, ~½ stock sold
05 · 29 May
Storefront live
on schedule
06 · ~10 Jun
P.IVA flip
money on, waitlist notified
Also shipped, on schedule: design system · 6 custom theme sections · 32 products migrated & localised · WCAG 2.2 AAA core pairings · full Italian legal suite · Node migration pipeline · GDPR data model · the launch-gap commerce mechanic — all by one operator.
When the person who sets the token also writes the CSS, the design ships as designed. Intent doesn't evaporate between Figma and production.
I test ideas in Liquid, in data, in the actual checkout — not only in mockups. Constraints surface early, where they're cheap to solve.
I connect a field on a form to a lawful basis to a wholesale dashboard 12 months out. Design decisions carry their commercial weight.