Skip to content
Mateusz Cieplak

Shopify · Fashion

Love and Hate

Store moved to a new theme, rebuilt product pages, faster on phones

Love and Hate sells lingerie sewn in Poland. I moved the store from an old Prestige 4 theme to Prestige 11 on Online Store 2.0, rebuilt the product pages, added what the EU withdrawal rules require and then measured and removed what slowed phones down.

Role
Lead developer: 38 of 39 merged pull requests
Period
Apr - Sep 2026
Stack
  • Shopify
  • Liquid
  • Prestige 11 (OS 2.0)
  • Metaobjects
  • Customer Privacy API
  • Judge.me
  • Python
Love and Hate: homepage on a desktop screen
Love and Hate on a phone
PageSpeed mobile, average
57 → 71
style recalculation time
−85%
collection page size
700 → 502 KB
texts in the EN translation memory
3,800+

Context

The live store ran Prestige 4.14, an older theme without app blocks. A redesign on the new version had stalled since June, and the store had nothing that the EU directive on online withdrawal requires: returns went through a printable PDF and an email.

The new version went live on 25 September 2026, in Polish and English.

What I did

  • Migration to Prestige 11.1 on Online Store 2.0, with the redesign finished on top of it
  • Colour variants as separate products grouped by a metaobject, with a +N counter on product cards
  • Sticky add-to-cart bar on phones, with size selects inside the bar
  • Bras with band and cup as two side-by-side selects instead of one long list
  • Online withdrawal under EU Directive 2023/2673: a footer link and a button on a dedicated page open the withdrawal form
  • One region switcher that sets country, currency and language together
  • English version through a CSV pipeline with Python scripts and a translation memory of 3,800+ texts
  • Own cookie banner on Shopify's Customer Privacy API; Yandex and Clarity load only after consent
  • Traced a Baselinker-Fakturownia integration that had blocked month-end accounting to an expired token and backfilled the missing invoices

Hard parts and how I solved them

  1. Problem

    Judge.me keeps review counts in Shopify fields, but not the review texts, so product pages showed stars with nothing under them.

    Solution

    Counts render on the server from the Shopify fields, and the texts load lazily from Judge.me's widget endpoint when the section scrolls into view.

  2. Problem

    Three :has() rules in the theme made the browser recalculate styles for over a second on collection and product pages.

    Solution

    Scoped the selectors to body:has(...). Style recalculation dropped from 1,369 to 205 ms on collections and from 1,238 to 177 ms on product pages.

  3. Problem

    The old theme had no app blocks and Shopify's native returns need a customer account, so neither could cover online withdrawal.

    Solution

    A withdrawal app wired into the theme: a link in the footer and a button on the withdrawal page, with no account required.

Results

  • PageSpeed mobile, average of key pages: 57.0 → 71.2
  • Page size before compression: collection 700 → 502 KB, search 1,287 → 490 KB
  • Product pages on phones, field data from Shopify (75th percentile, first day after launch): 1.83 s → 1.14 s
  • Withdrawal online, as required by EU Directive 2023/2673

Screens

Swipe or use the buttons to browse the screens.

  • Homepage
    Desktop · Homepage
  • Homepage on a phone
    Phone · Homepage on a phone
  • Product page with colour variants
    Desktop · Product page with colour variants
  • Sticky add-to-cart bar on phones
    Phone · Sticky add-to-cart bar on phones
  • Band and cup as two selects
    Phone · Band and cup as two selects
  • Collection page
    Desktop · Collection page
  • Online withdrawal under EU Directive 2023/2673
    Desktop · Online withdrawal under EU Directive 2023/2673

Contact

Let's talk.

Looking for a frontend developer who can take a project all the way to production? Use the form or write to me directly.

kontakt@mateuszcieplak.com

Your details are used only to reply to you. The form is delivered by Web3Forms.

Get in touch