Illustrative case study

A fictional business. The figures are a modelled scenario, not a client result.

Official catalogueMelbourne Storefront Championship6-month show · Technical SEO

Exhibit No. 001 · Wattlebark Pet Co.

Pet food subscription · Melbourne

How a pet-food startup made its JavaScript storefront visible to Google

+233%indexed product pages, in 6 months
BEST IN SHOW+233%INDEXED PRODUCT

Ring commentary: Now entering the ring: exhibit 001, a headless storefront from Melbourne. The judge lifts the hood: an empty <div id="root">, and nothing else. Ring two: server rendering takes the lead. A clean gait at last: CLS under the line. Groomed to standard: Product and Offer markup. Best in Show: +233% indexed product pages.

Class IThe entry

Beautiful in the ads. Invisible in the ring.

A headless storefront rendered client-side only; Googlebot saw empty shells for 80% of product pages and organic traffic flatlined despite strong ads.

Wattlebark sells kangaroo, salmon and grain-free recipes on a weekly or fortnightly box. Paid social filled the funnel, but every product page was assembled in the browser. When Googlebot arrived it saw a title-less shell and a script tag; most of the 1,380 product URLs never made it into the index, and the ones that did were often folded into the homepage.

Ring commentary · The judge lifts the hood and finds a single empty div. Not a strong start for exhibit 001.

Catalogue entry · 001

Exhibitor
Wattlebark Pet Co.
Breed
Headless React storefront
Class
Retail & E-commerce · Technical SEO
Benched at
Melbourne, Australia
Catalogue
1,380 product URLs
Handler
Get Ranked On Top · Signal

What Googlebot was served

<html>
  <head><link rel="canonical" href="/"></head>
  <body>
    <div id="root"></div>
    <script src="/app.4f1c.js"></script>  <!-- 1.4 MB -->
  </body>
</html>

Class IIJudges’ examination

Six faults on the scorecard. Two of them disqualifying.

  1. J-01Rendering

    Disqualifying

    Product pages shipped an empty shell

    The raw HTML of every product page was a single <div id="root"> and a 1.4 MB bundle. URL Inspection showed blank bodies on 81% of 1,380 product URLs.

  2. J-02Rendering

    Disqualifying

    Canonical and title injected by JavaScript

    The server default pointed every canonical at the homepage; the client corrected it only after hydration, so Google consolidated hundreds of products into one URL.

  3. J-03Log files

    Major fault

    Crawl budget spent in the wrong ring

    90 days of logs: 62% of Googlebot hits landed on ?flavour=&size= facets and /api/ endpoints. The median product page was recrawled every 23 days.

  4. J-04Core Web Vitals

    Major fault

    Layout shift on the subscribe toggle

    A late-loading price widget and unsized pack shots pushed the add-to-box button down the page: p75 mobile CLS of 0.31, triple the 'good' limit.

  5. J-05Structured data

    Major fault

    No Product or Offer markup

    Price, stock and subscription terms existed only in client state, so product pages were not eligible for merchant listings or price rich results.

  6. J-06Rendering

    Minor fault

    Sold-out flavours returned 200 shells

    Discontinued SKUs served an empty page with status 200: 140 soft 404s diluting the catalogue's quality signals.

Ring commentary · The rendering faults alone would have the exhibit excused from the ring. Everything else is fixable on the day.

Class IIIThe classes

4 classes, 4 ribbons, one handler.

Built on our Signal plan for technical seo. Each tactic was entered as its own class, judged against field data, and only awarded its ribbon once the fix held in production. Pick a rosette to read the judging notes.

Best Render

JavaScript rendering

Moved product, category and guide templates from client-only rendering to server rendering with streamed hydration, so the first HTML response carries the whole page.

  1. 01Server-rendered product templates with price, ingredients and feeding guide in the initial HTML
  2. 02Canonical, title, meta and hreflang emitted on the server, never patched after hydration
  3. 03Sold-out SKUs answer 410 or redirect to their successor flavour; no more 200 shells
  4. 04Rendered-HTML diff in CI fails any build where a template ships under 300 words

Judged on: Pages rendered for Googlebot: 19% → 99%

Class IVOrder of judging

6 rings, one month each.

  1. Month 1 · Ring 1

    Benching & examination

    Log-file pull, rendered-vs-raw HTML crawl of all 1,380 URLs, CrUX baseline, structured-data audit.

    Six faults recorded. Two disqualifying.

  2. Month 2 · Ring 2

    Server rendering, first class

    Product templates server-rendered behind a flag; canonicals and titles moved to the server; 140 soft 404s retired.

    Rendered coverage jumps from 24% to 61%.

  3. Month 3 · Ring 3

    Gait & movement

    Reserved layout space, deferred subscription widget, route-level code splitting.

    CLS drops under the 0.1 'good' line.

  4. Month 4 · Ring 4

    Grooming

    Product, Offer and Breadcrumb JSON-LD shipped; Merchant Center feed reconciled.

    Merchant-listing eligibility goes live.

  5. Month 5 · Ring 5

    Tracking the scent

    Facets consolidated, API paths disallowed, species sitemaps with real lastmod.

    Googlebot spends two-thirds of its visits on products.

  6. Month 6 · Ring 6

    Best in Show

    Category and guide templates migrated; CI render check guarding every release.

    1,039 product pages indexed.

Class VThe judges’ board

Every ribbon, pinned.

Modelled scenario for a fictional business — not a client result. Rankings and traffic are never guaranteed; see our Terms.

  • 19% → 99%

    Pages rendered for Googlebot

    Best Render

  • +233%

    Indexed product pages

    Best in Show

  • +147%

    Organic subscriptions

    Champion of Champions

  • 0.31 → 0.04

    CLS

    Fastest in Breed

Pages Googlebot renders

19% before
99% after

Organic subscriptions per month

86Base88R1104R2138R3171R4196R5212R6

Layout shift (CLS, p75 mobile)

00.10.250.4GOODPOORBEFORE 0.31AFTER 0.04

Measured in field data. Google’s “good” threshold is 0.1.

03006009001200CATALOGUE · 1,380 URLSBASER1R2R3R4R5R61039
Rendered for Googlebot
99%
Indexed product pages
1,039
Organic subscriptions / mo
212
Mobile CLS (p75)
0.04

Placings in Google (AU)

Keyword positions before and after the 6-month engagement
Search termMonthly volumeBeforeAfterPlacing
puppy food subscription590not indexed11st
cat food delivery melbourne880not indexed22nd
raw dog food delivery melbourne4802922nd
kangaroo dog food1,9004133rd
senior cat food wet720645Highly commended
grain free dog food australia2,400586Highly commended
dog food subscription4,400not indexed7Highly commended
hypoallergenic dog food3,600739Highly commended

Entries now open

Get a plan like this

If your storefront renders in the browser, Google may be judging an empty ring. Signal starts with the same examination.

← Back to all case studies