A replatform that paid for itself in five months

- 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
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
- 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.
- 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.
- A hard peak-trading freeze: no deploys between 1 November and 6 January. The build had to land before it or wait a quarter.
- 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.

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

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

- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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
| Experiment | Relative change | Confidence | Shipped |
|---|---|---|---|
| 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% | flat | Yes |
| 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.
- Revenue per visitor+27%£1.48£1.88
- Mobile LCP-49%lower is better4.3s2.2s
- Conversion rate+22%1.06%1.29%
- Mobile bounce-24%lower is better58%44%
| Metric | Before | After |
|---|---|---|
| Revenue per visitor | £1.48 | £1.88 |
| Mobile LCP | 4.3s | 2.2s |
| Conversion rate | 1.06% | 1.29% |
| Mobile bounce | 58% | 44% |
| Period | Revenue 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 |

“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.”

