NEXSUM_LABS
  1. Home
  2. Work
  3. An online retailer moved its category pages from 'poor' to 'good' without a redesign
Book a call

[ Case study ]

RetailCrUX / Search ConsoleRUM monitoringTag governanceImage pipeline

An online retailer moved its category pages from 'poor' to 'good' without a redesign

CrUX showed category pages failing all three Core Web Vitals on mobile — the pages that carried 60% of non-brand entrances. A previous agency had proposed a full redesign; the retailer wanted to know what was actually slow first.

CLIENT a mid-size online retailer — FOCUS Diagnose with field data, not Lighthouse alone

Technical SEOSEO & Search VisibilityTechnical SEORetailRepresentative example
Client
a mid-size online retailer
Industry
Retail
Engagement
6 weeks — growth pod — technical SEO specialist + frontend engineer
Service
SEO & Search Visibility / Technical SEO
Headline outcome
All three Core Web Vitals on category pages (p75), 28-day CrUX window after final fix: Poor → Good, read from CrUX field data

Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.

Where they started

The client is a mid-size online retailer whose category pages carry most of its non-brand search traffic — and every one of them was failing Core Web Vitals on mobile. The storefront runs on a theme shared with checkout-adjacent templates, so careless changes anywhere risk the till. Merchandising apps add features on request, injecting scripts nobody tracks, and the trading calendar means fixes only get honestly measured during seasonal peaks, when the field data finally has enough users to speak.

What it was costing

CrUX showed category pages failing all three Core Web Vitals on mobile — the pages that carried 60% of non-brand entrances. A previous agency had proposed a full redesign; the retailer wanted to know what was actually slow first.

What they could see

  • Field data marked every category page poor on all three Core Web Vitals for mobile users.
  • A countdown-timer app the merchandising team loved slowed those pages on its own, visibly in the field data.
  • Nobody could list which third-party tags ran on a category page, or who had asked for each.
  • Lighthouse runs looked fine in the office while CrUX kept failing — the two scoreboards contradicted each other weekly.

The constraints we worked inside

  • The theme was shared with checkout-adjacent templates — changes had to be surgical, per template.
  • Merchandising apps injected scripts nobody owned; the fix had to include governance, not just cleanup.
  • Seasonal traffic peaks made the field-data window the only honest scoreboard.

What had been tried before

The previous agency proposed a full storefront redesign with performance listed among the headline benefits.
It priced the problem without diagnosing it; the board would not fund a six-figure rebuild to fix what might be three templates and two scripts.
An in-house developer installed a one-click optimization app that minified and deferred everything sitewide.
The global deferral broke analytics on a checkout-adjacent template; it was reverted within a day, and speed work lost internal trust for a year.

What we proposed

We proposed diagnosing before touching anything: field data first, lab tools second. CrUX and real-user monitoring showed the largest category image and two third-party scripts as the actual causes of the failing vitals — layout shift, the lab's favorite complaint, was secondary. The fixes were surgical and per-template: responsive image variants with priority hints for the hero slot, and every third-party tag moved under a consent-gated loader with a named owner in a register. Each fix waited for the rolling 28-day CrUX window to confirm it against what real phones experienced.

Just as important is what we ruled out, and why:

  • The full redesign the previous agency proposedThe slowness traced to one image path and two scripts, not the design; a rebuild would re-buy the same failures with new templates nobody had tested.
  • Deferring every script and image aggressively sitewideDeferred heroes are why the largest category image painted late; pushing delay further down the page moves the failure rather than removing it.

How the work ran

01Diagnose with field data, not Lighthouse alone

CrUX and RUM showed the LCP image and two third-party scripts as the real causes — the lab's complaints about layout shift were secondary.

02Fix the asset path and the script governance

Category imagery moved to responsive variants with priority hints; third-party tags moved under a consent-gated loader with a documented owner.

03Verify against the 28-day window

Each fix waited for the CrUX window to roll, so the claim rests on what real users experienced, not a lab run.

Delivered by the growth pod — technical SEO specialist + frontend engineer over 6 weeks, with working increments reviewed with the client every week.

The stack, and the reasoning

CrUX / Search Console
Seasonal peaks make field data the only honest scoreboard; CrUX reports what real phones experienced on the shared theme, free, without lab-run optimism.
RUM monitoring
CrUX samples too coarsely to name culprits; RUM tied the slow experiences to the specific tags and image requests firing on category templates.
Tag governance
Cleanup without ownership re-accumulates; a consent-gated loader plus a register naming every tag's requester made future additions a decision instead of drift.
Image pipeline
The LCP failure was one oversized original served to every viewport; responsive variants with priority hints fixed it without template surgery on shared code.

What went wrong

Obstacle

The tag discovery widened: fourteen third-party scripts fired on category pages, four belonged to apps whose vendors had gone quiet, and none had a named owner.

Handled: We built the register, moved controllable tags behind the consent-gated loader, and disabled the four unowned ones on a monitored trial — no revenue complaint survived two weeks.

Obstacle

The shared theme leaked: an image fix staged for category pages also changed a checkout-adjacent template's hero rendering, caught in staging by the retailer's developer.

Handled: We split the change into per-template overrides with a staging diff reviewed before each deploy; the leak became the argument for keeping fixes surgical.

Obstacle

The six-week engagement outlived only two CrUX windows, so the final fixes could not be fully confirmed inside the project itself.

Handled: We staged the fixes so their windows overlapped, used RUM for interim reads, and left a monitoring sheet that confirmed the last window after handover.

How we worked together

Cadence
A Monday 30-minute call with the ecommerce manager and the theme's developer, plus a fortnightly CrUX readout against the previous window.
Client side
The ecommerce manager owned merchandising app contracts and tag decisions; one developer owned every template change; nobody else touched the storefront during the engagement.
Decisions
Anything touching checkout-adjacent templates needed the developer's sign-off in staging; removing a tag required the ecommerce manager to check it against the register.
They provided
Analytics and RUM access, a staging environment with the shared theme, the app vendor contact for the timer script, and two developer hours weekly.

What changed

The headline: all three core web vitals on category pages (p75), 28-day crux window after final fixPoor → Good, read from CrUX field data. A second check: category-page entrances from non-brand organic queries, same period at +9%.

Speed stopped being a mystery the team argued about. New app requests now pass a simple question — which tag, which owner, what does it cost the page — before anything is installed, and the register made the answer checkable in a minute. The merchandising team kept its countdown timer, correctly, and the developer stopped dreading deploys to the shared theme. Peak season arrived with pages that had already been measured by the users who mattered.

The result was read from CrUX field data against the pre-engagement baseline over the stated window, with a guardrail check on category-page entrances from non-brand organic queries, same period. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.

What they own now

  • The tag register with owners, purposes, and page scope for every script
  • The consent-gated loader configuration and rules for adding future tags
  • A CrUX monitoring sheet with thresholds and a monthly check routine
  • The RUM dashboard views separating category templates from the rest
  • Image pipeline documentation covering variants, hints, and naming conventions

What we would do differently

We would have asked for RUM access in week one — the tag-injection discovery came from client-side monitoring we could have had immediately.

SEO & Search VisibilityTechnical SEORetailCrUX / Search Console

Next case study

A directory business cut index bloat from 340,000 junk URLs to 12,000 useful ones