Exhibit No. 001 · Wattlebark Pet Co.
Pet food subscription · Melbourne
How a pet-food startup made its JavaScript storefront visible to Google
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.
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.
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.
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.
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.
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.
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.
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.
- 01Server-rendered product templates with price, ingredients and feeding guide in the initial HTML
- 02Canonical, title, meta and hreflang emitted on the server, never patched after hydration
- 03Sold-out SKUs answer 410 or redirect to their successor flavour; no more 200 shells
- 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.
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.
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%.
Month 3 · Ring 3
Gait & movement
Reserved layout space, deferred subscription widget, route-level code splitting.
CLS drops under the 0.1 'good' line.
Month 4 · Ring 4
Grooming
Product, Offer and Breadcrumb JSON-LD shipped; Merchant Center feed reconciled.
Merchant-listing eligibility goes live.
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.
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
Organic subscriptions per month
Layout shift (CLS, p75 mobile)
Measured in field data. Google’s “good” threshold is 0.1.
- Rendered for Googlebot
- 99%
- Indexed product pages
- 1,039
- Organic subscriptions / mo
- 212
- Mobile CLS (p75)
- 0.04
Placings in Google (AU)
| Search term | Monthly volume | Before | After | Placing |
|---|---|---|---|---|
| puppy food subscription | 590 | not indexed | 1 | 1st |
| cat food delivery melbourne | 880 | not indexed | 2 | 2nd |
| raw dog food delivery melbourne | 480 | 29 | 2 | 2nd |
| kangaroo dog food | 1,900 | 41 | 3 | 3rd |
| senior cat food wet | 720 | 64 | 5 | Highly commended |
| grain free dog food australia | 2,400 | 58 | 6 | Highly commended |
| dog food subscription | 4,400 | not indexed | 7 | Highly commended |
| hypoallergenic dog food | 3,600 | 73 | 9 | Highly 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.