Skip to content
Our workHearthline
Hearthline

A replatform that paid for itself in five months

A bedding and homeware brand was losing money to a slow, app-bloated legacy store. A 19-week Shopify replatform cut 2.1 seconds off mobile LCP and lifted revenue per visitor 27%.
Bedding and homeware, LeedsHome & living19-week replatform, plus 6 months of post-launch testing2025
ShopifyPerformance
Hearthline homeware storefront on a wide desktop screen, warm off-white background with a full-bleed photograph of rumpled linen bedding, an olive-green shop-the-collection button and a four-product grid of duvet sets below
Revenue per visitor
+27%
from £1.48 to £1.88
Faster mobile LCP
2.1s
from 4.3s to 2.2s
Payback on the build
5 months
£148k build, £29.6k added revenue a month
Added revenue, 12 months
£355k
annualised from post-launch run rate
Built withShopify PlusCustom Liquid themeMatrixifySpeedCurveGA4

The brief

What they came to us with

Hearthline sells linen bedding, throws and table textiles — long-lived things people research for a fortnight and then buy once. The catalogue is deceptively large: 12,400 products, 47,000 variants, because every duvet set exists in six sizes and eleven washed colours. The merchandising is the product.

The store ran on Magento 2.3 with an unsupported PHP version underneath it and one contractor left in the world who understood the theme. Six years of tactical fixes had accreted into 31 third-party apps and scripts, a 1.9MB JavaScript bundle, and a mobile collection page that took 4.3 seconds to paint its largest element. Mobile was 71% of sessions and 44% of revenue.

The brief we were given was "make it faster". The brief we accepted was different: replatform onto Shopify Plus, prove the speed work in revenue rather than in Lighthouse scores, and do not lose a single ranking URL on the way across. Nobody signs off a six-figure rebuild for a green performance badge.

Constraints

  1. Magento 2.3 on end-of-life PHP, with one part-time contractor as the only person who knew the theme. No knowledge transfer was possible.
  2. 12,400 products and 47,000 variants, plus 9 years of order history, 18,000 customer accounts and 26,000 product reviews that all had to come across intact.
  3. A hard peak-trading freeze: no deploys between 1 November and 6 January. The build had to land before it or wait a quarter.
  4. URL structure was changing. 9,140 URLs held rankings and organic search drove 34% of revenue — a botched redirect map would have cost more than the build.
Side-by-side before and after of the Hearthline linen bedding collection page, the left version cluttered with pop-up widgets and a slow-loading grid, the right on a warm off-white background with olive-green filter chips for size, colour and weave and clean product cards

The approach

How we worked the problem

A replatform is mostly an exercise in deciding what not to bring with you. We spent the first four weeks deleting on paper before anyone wrote a line of Liquid.

  1. 01

    Cost every script already on the page

    We inventoried all 31 apps and tag-manager scripts and put a number against each one: what it cost in kilobytes and main-thread time, and what it earned. Nine were load-bearing. Eleven duplicated something Shopify does natively. Six had been installed for a campaign that ended in 2022 and never uninstalled. Five were quietly doing the same job as each other.

    The review widget alone was 340KB and blocked first paint. That one finding paid for the audit.

    • 31 apps and scripts inventoried, cost and revenue attributed to each
    • Field CrUX data pulled for 90 days, not lab scores
    • Performance budget agreed in writing: 180KB JS, LCP under 2.5s on 4G
    Performance audit view on a laptop screen showing a network waterfall and an app inventory table with size and blocking-time columns, beside a preview of the Hearthline linen bedding collection page in olive green on warm off-white
  2. 02

    Build the theme around merchandising, not around a demo

    Off-the-shelf themes assume a hundred products. With 47,000 variants the collection page is the shop, so we built it first: server-rendered filtering on size, colour, weave and GSM, a swatch grid that loads one image per colourway instead of eleven, and section groups the merchandising team can reorder without a developer.

    Everything above the fold ships in the initial HTML response. No client-side hydration, no skeleton states, no layout shift while a widget decides where the price goes.

    • Server-rendered filters across 4 facets, no client-side re-fetch
    • Responsive AVIF with explicit dimensions on every product image
    • 12 reorderable sections handed to merchandising, zero developer tickets since
  3. 03

    Migrate the things that are hard to get back

    Products and orders are the easy part. Rankings, reviews and customer trust are not. We mapped all 9,140 ranking URLs to their new destinations by hand where the pattern broke, tested the redirect chain in staging against a crawl of the live site, and ran a 30-day watch on organic landing-page revenue with a pre-agreed rollback trigger.

    26,000 reviews came across with their original dates and photographs. A review that loses its date loses most of its value, and re-collecting nine years of them is not an option.

    • 9,140 redirects, each verified as a single hop, no chains
    • 26,000 reviews migrated with dates, photos and verified-buyer flags
    • Organic revenue monitored daily for 30 days against a forecast band
    Migration console on screen showing a redirect map table of old and new bedding collection paths with status checks, alongside the rebuilt Hearthline product page for a linen duvet set with olive-green colour swatches on warm off-white
  4. 04

    Launch on a traffic split, then keep testing

    The new store went live to 5% of traffic for eleven days before anyone celebrated. We compared revenue per visitor, not bounce rate, and held the split until the difference cleared significance in the direction we had promised.

    A replatform is a starting line. Since launch the same team has run merchandising and buy-box tests on the new theme, which is the only reason we can tell you which parts of the rebuild actually earned their money.

    • 11-day shadow launch at 5% of traffic before full cutover
    • Rollback plan rehearsed twice, DNS TTL dropped 48 hours ahead
    • 9 post-launch experiments, all called at 95% confidence or better

The log

The build and test log

Six of the decisions that moved money — three migration milestones validated on live traffic, three post-launch experiments. Uplift is the relative change in revenue per visitor for the affected audience.

  1. 01

    New theme, shadow-launched at 5%

    Because the legacy store ships 1.9MB of JavaScript and paints its LCP element in 4.3s on mobile, a server-rendered theme inside a 180KB budget will raise revenue per visitor on mobile.

  2. 02

    App cull, 31 down to 9

    Because 22 apps duplicate native functionality or serve dead campaigns, removing them will cut blocking time by more than 1s and raise conversion without losing any measured revenue.

  3. 03

    Redirect map, 9,140 legacy URLs

    Because 34% of revenue arrives on organic landing pages, a single-hop redirect for every ranking URL will hold organic revenue flat through the cutover.

  4. 04

    Weave and weight filters on collection pages

    Because 12,400 products across 47,000 variants make browsing the bottleneck, adding weave and GSM as filter facets will raise collection → product click-through and revenue per visitor.

  5. 05

    Sticky mobile buy bar with swatch picker

    Because mobile shoppers scroll past the buy box to read fabric detail, a sticky bar with an inline colour picker will raise mobile add-to-cart.

  6. 06

    "Complete the set" bundle builder

    Because duvet covers and pillowcases are bought together offline but separately here, a bundle builder on the product page will raise average order value and revenue per visitor.

  • New theme, shadow-launched at 5%+11.2%99%shipped
  • App cull, 31 down to 9+4.8%97%shipped
  • Redirect map, 9,140 legacy URLs-0.6%flatshipped
  • Weave and weight filters on collection pages+6.3%96%shipped
  • Sticky mobile buy bar with swatch picker-2.9%95%not shipped
  • "Complete the set" bundle builder+5.4%98%shipped
Relative change on the tested metric, 4 up and 2 down. Confidence and ship decision on each row.
Relative change on the tested metric, 4 up and 2 down. Confidence and ship decision on each row.
ExperimentRelative changeConfidenceShipped
New theme, shadow-launched at 5%+11.2%99%Yes
App cull, 31 down to 9+4.8%97%Yes
Redirect map, 9,140 legacy URLs-0.6%flatYes
Weave and weight filters on collection pages+6.3%96%Yes
Sticky mobile buy bar with swatch picker-2.9%95%No
"Complete the set" bundle builder+5.4%98%Yes

The results

What it moved

Mobile LCP went from 4.3s to 2.2s and has stayed there for six months, because the performance budget is enforced in CI rather than remembered fondly. Revenue per visitor moved from £1.48 to £1.88, a 27% lift, with average order value drifting up from £140 to £146 as the bundle builder did its work.

The commercial case is arithmetic, not atmosphere. At 74,000 sessions a month, an extra £0.40 per visitor is £29,600 of incremental revenue a month against a £148,000 fixed-price build — five months to payback. We will be honest about the shape of it: the first two months after launch ran below that rate while merchandising learned the new sections, so the true cumulative crossover landed in month seven. The run rate has held since.

The part the team notices daily is not in any chart. Twelve reorderable sections mean a seasonal collection page now takes an afternoon instead of a fortnight and a developer, and there have been no theme tickets raised against us since the freeze lifted.

BeforeAfter
  • Revenue per visitor+27%
    £1.48
    £1.88
  • Mobile LCP-49%lower is better
    4.3s
    2.2s
  • Conversion rate+22%
    1.06%
    1.29%
  • Mobile bounce-24%lower is better
    58%
    44%
Baseline is the 8 weeks before cutover on the legacy platform; result is the 8 weeks after the final post-launch winner shipped.
Baseline is the 8 weeks before cutover on the legacy platform; result is the 8 weeks after the final post-launch winner shipped.
MetricBeforeAfter
Revenue per visitor£1.48£1.88
Mobile LCP4.3s2.2s
Conversion rate1.06%1.29%
Mobile bounce58%44%
Revenue per visitor£1.48£1.88
M1M10
Revenue per visitor by month, £. M1–M3 are the last three months on the legacy platform; cutover lands mid-M4. The dip at M7 is a seasonal traffic mix, not a regression.
Revenue per visitor by month, £. M1–M3 are the last three months on the legacy platform; cutover lands mid-M4. The dip at M7 is a seasonal traffic mix, not a regression.
PeriodRevenue per visitor
M1£1.48
M2£1.47
M3£1.49
M4£1.55
M5£1.66
M6£1.71
M7£1.69
M8£1.78
M9£1.83
M10£1.88
Close-up of the Hearthline product page colour and weave selector, showing eleven washed linen swatches, a GSM and care note and a "complete the set" bundle row in an olive-green accented card on warm off-white
Optyv replatformed us and then spent a year proving every change with traffic. Revenue per visitor is up 27% and the site loads two seconds faster — I've never worked with an agency that grades its own homework like this.
PPauline MercierE-commerce Director, Hearthline

Do you like what you see?

Optimize your store 4.9 from 47 client reviews