← Back 03 · Product Experience Case Study

Tirvela Boutique

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

Live

tirvelaboutique.com

01 · The brief

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.

PositioningNot a marketplace · not clean-beauty content · not feminine-coded · not a discount channel · not in a hurry
Five truthsWaterless concentration · glass not microplastic · porosity-tailored hair care · a named formulator with a real lab · small dose, full effect
Voice, lockedRituale not routine · gesto not hack · concentrato not potent · no boost/miracolo/must-have · no emojis, no exclamation marks

02 · What I owned — four hats, worn at once (not in sequence)

A product experience designer first; a founding designer who ships, second. Concurrent, each constraining the others.

The lead

Product & experience design

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

Front-end engineering

rebuilt the Shopify theme by hand in Liquid and CSS — custom sections, tokens, motion, WCAG-graded accessibility. No handoff to lose.

Under the hood

Back-end & data pipeline

Node tooling to scrape, match, and reconcile the catalogue from source into Shopify — products, metafields, SEO — behind a custom Shopify dev app.

The why

Founder, commercial & go-to-market

two-step business model, supplier negotiation, cross-border logistics, two-channel launch, GDPR + payment + tax foundations.

03 · Product & experience design

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

TypePP Editorial New / Cormorant (display) · Söhne / Inter (body); italic on the softer word only
Scale & space1.25 type ratio, 16px base · 4px spatial base · 64–96px between sections · hard corners, pills for chips only
Reference registerAesop (whitespace, restraint) · Buly (editorial pacing) · Le Labo (ingredient-led PDP)
MotionFast 120ms · medium 240ms · slow 400ms · veil 800ms · ease cubic-bezier(.65,0,.35,1) · no bounce, no autoplay

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.

04 · Front-end engineering — I didn't hand the design off, I shipped it

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.

Contrast ratios, WCAG 2.2 — thresholds at AA 4.5:1 and AAA 7:1
AA 4.5:1 AAA 7:1 18:1 Ivory on near-black 16.1:1 · AAA Charcoal on ivory 14.2:1 · AAA Clay on near-black 8.3:1 · AAA Clay on ivory 1.7:1 · decorative only
  • Custom sections shipped: tirvela-footer · tirvela-trust-island · tirvela-ingredients-grid · tirvela-featured-product · tirvela-founder-story · tirvela-collection-header
  • Lighthouse targets (mobile): Perf ≥80 · A11y ≥95 · Best Practices ≥90 · SEO ≥95
  • Ship discipline: 5-day rebuild sprint · per-section rollback · all 4 app categories preserved · grep references before any strip · no push to live without go-ahead

05 · Back-end & data — moving a catalogue across a border, in code

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

crawl-source-collections.mjs→ scrape-product.mjs→ match-handles.mjs→ cross-reference-with-catalog.mjs→ build-collection-md.mjs→ seo-product-regen.mjs
Shared lib lib/source.mjs lib/translation.mjs lib/catalog.mjs lib/xlsx.mjs lib/docx.mjs Diff fix-mokosh-mapping.mjs

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.

  • Surface area: custom Shopify dev app · Admin API product + metafield sync · metaobject-driven ingredients · 32 products reconciled

06 · Commercial & operations — every screen had to earn its place in a two-step plan

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).

Revenue modelDTC (full margin) · wholesale (phase 2) · curated gift rituals (high AOV)
Supply chainFreight waived on pilot · tiered MOV €500 → €800+ · cross-border logistics · damaged-unit recovery on schedule
ComplianceGDPR lawful bases mapped · PCI SAQ-A · IVA 22% in prices · fattura elettronica (SDI) · 14-day return
Signature moment

The P.IVA launch-gap waitlist

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.

The launch gap — day 0 to day ~12
LAUNCH · FIXED DATE PARTITA IVA REGISTERS Storefront Live · browse, quiz, product pages Checkout Disabled via settings · €0 collected Enabled · soft launch Intent Notify-me · one existing app, no custom code Day 0 ~12 days · 0 lines of payment code Day ~12 Day 20 →

01

The constraint — store live, money off

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

The mechanic — demand captured on-brand

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

The flip — one inventory change

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.

07 · Go to market & outcomes — two channels, one evening

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

  1. 01

    Negotiation

    terms, freight waived

  2. 02

    Pilot order

    tiered MOV €500 → €800+

  3. 03

    Pre-orders

    inventory funded before landing

  4. 04

    Soft launch

    workshop + aperitivo, ~½ stock sold

  5. 05 · 29 May

    Storefront live

    on schedule

  6. 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.

08 · What I bring to a team — a designer who can hold the whole line

No handoff loss.

When the person who sets the token also writes the CSS, the design ships as designed. Intent doesn't evaporate between Figma and production.

Prototype in the real medium.

I test ideas in Liquid, in data, in the actual checkout — not only in mockups. Constraints surface early, where they're cheap to solve.

Own outcomes, not screens.

I connect a field on a form to a lawful basis to a wholesale dashboard 12 months out. Design decisions carry their commercial weight.

← All work Next: AI Design-to-Development Handoff →