Case Study · E-commerce

Rebuilding a 26,000-product catalogue after a traffic collapse

Western Sport lost half its organic search traffic in a single month. We found the causes in the cache layer, the structured data and a semicolon — then tested whether AI assistants would name the store at all. All three did.

Disclosure

Western Sport is a property we own and operate. We are showing it rather than a third-party engagement because it is the one project where we can show everything — server, database, source code, cache layers, and the before-and-after measurements — without a confidentiality boundary. Every figure here is dated, and every claim about the live site can be verified by visiting the site and testing it yourself. That is the point of choosing it.

At a glance

What changed, and how we know

MeasureBeforeAfterHow it was measured
URLs earning search impressions1,055–1,1588,35128-day windows, Feb–Mar 2026 vs 13 Jul – 9 Aug 2026
Product URLs earning impressions810–8527,667same windows
Average search position21.813.51 Jul – 9 Aug, 2025 vs 2026
Click-through rate from search1.81%2.07%same windows
Time to first byte1.6–3.9s at origin0.20–0.55s at edgeverified live, 10 Aug 2026
Ad and Shopping click landing pagescache bypass, 2.38smostly edge hits, 0.19–0.26sverified live, 10 Aug 2026
Named by ChatGPT, Perplexity and Gemininot testedall threetested 10 Aug 2026

Search figures from Google Search Console. Performance and structured data verified against the live site.

The situation

Half the traffic, in one month, with nothing else changed

At the end of March 2026, Western Sport’s organic search traffic fell off a cliff. Monthly clicks went from 5,994 in March to 2,823 in April. Impressions went from 270,788 to 111,216 — a 59% month-over-month drop, with no change to the catalogue, the pricing or the business. The timing lines up with a Google core update, though we have not proven that causally and do not claim to have.

Traffic is the whole funnel for a store like this, and there was no budget for paid media to bridge the gap. Every recovery lever had to be organic or conversion-side.

The site was not neglected. It was the opposite problem: years of accumulated layers — a legacy storefront on a retired subdomain, two competing brand taxonomies, 523 redirect rules of unknown health, a nightly inventory sync, two AI content plugins, a CRM plugin, a caching plugin, a CDN and a page builder — all interacting in ways nobody had traced end to end.

Diagnosis

What we found

The engagement started with measurement, not recommendations. What turned up was not a content problem. It was a stack of defects that each individually looked small and collectively made the site slow, partially invisible to search engines, and wrong in its structured data.

The cache was working for almost nobody

The CDN had “cache by device type” enabled, splitting every one of 26,000 product pages into separate mobile, desktop and tablet copies — for a site that serves byte-identical HTML to all three. Product and category pages were missing cache entirely. Separately, every inbound link carrying a tracking parameter — every ad click, every Shopping listing click, every link from social or email — bypassed the cache completely and hit the origin at 2.38 seconds.

A plugin was purging the entire site on every content edit

We proved this with a stack backtrace rather than inference. Re-saving a blog post with no changes at all took the warmed-cache count from 753 URLs to 1, in a single request. The call path ran through the CRM plugin’s cache-clearing routine into a full-domain purge. On a 26,000-URL site, one blog post published in the morning meant customers hit a cold origin for the rest of the day.

Analytics telemetry was blocking page loads

The caching plugin’s opt-in telemetry made a blocking outbound call on every uncached page load, with a 30-second timeout, against an endpoint that was frequently timing out. Uncached origin response times were swinging between 18 and 77 seconds.

The product schema was lying to Google

The theme emitted structured data across roughly 25,000 product pages that published the store’s internal SKU as the manufacturer part number, and fell back to the site tagline when a brand was unmapped — telling Google the manufacturer of an AR-15 handguard was “Western Sport.” Brand names were HTML-escaped inside the JSON-LD, so Google was reading Sellier & Bellot. Every product page also emitted a duplicate author entity.

Inbound links were landing on 404s

42 URLs carrying genuine editorial backlinks — 38 of them from a single long-standing forum community — returned 404. A sample audit of the 523 pre-existing redirect rules found roughly 30% of them redirected into a 404. One rule’s destination field contained the literal note “may need a new products category.”

Redirects broke on tracked traffic

The redirect engine matched the raw request URI including the query string, so a redirected URL worked when typed but 404’d the moment it carried a tracking parameter. Paid, social and email traffic to any moved URL was landing on an error page.

The work

Three workstreams

1

Performance: find the cause, not the symptom

Every fix was applied only after the cause was proven by measurement. The temptation on a slow site is to upsize the server; a controlled comparison — a static image from the origin returning in 0.2–0.6s while a page took 1.6–3.9s — ruled that out early and saved the cost.

  • Disabled the caching plugin’s blocking telemetry. Uncached origin response went from 18–77 seconds, erratic, to 1.9–2.7 seconds. Mobile PageSpeed on product pages moved 79 to 91.
  • Turned off device-type cache splitting. Product and category pages went from cache miss to hit at 0.25 seconds.
  • Built a CDN rule that clears the query string on requests carrying a tracking parameter and no functional one, so it fails safe and never touches cart, checkout, search, sort or filter URLs.
  • Shipped a guard removing the CRM plugin’s full-site purge on standard content saves, leaving its data path untouched. The vendor later confirmed in writing that there is no built-in way to disable the behaviour and that suppressing it should not affect their functionality.
  • Cut autoloaded database options from 13.77 MB to 0.79 MB and dropped 41 orphaned tables left by long-uninstalled plugins.
> Live verification, 10 August 2026
/ homepage0.52s, edge cache HIT
/shop/ catalogue root0.25s, edge cache HIT
/product-category/…/rifles/ category0.24s, edge cache HIT
/product/… product page0.20s, edge cache HIT
12 fresh tracking-parameter requests → 9 hit at 0.19–0.26s, 3 missed at 0.24–0.68s. Previously: uniformly 2.38s.
2

Structure: rebuild the catalogue the way customers shop

  • Created 15 real subcategories under Optics and reclassified the catalogue into them. Optics went from 3,428 products in five near-empty buckets to 4,145 across a browsable tree with zero unclassified items — including 44 products that had been invisible to the category archive entirely.
  • Built landing pages for all eight dead-end navigation items that pointed at nothing, each a topic page with clickable choices rather than a bare product grid.
  • Consolidated the redirect stack onto one engine configured to ignore query strings. Of 170 rules in the old engine, 119 migrated and 51 were dropped as already handled. All 170 original source URLs were re-tested clean and with tracking parameters. Zero failures.
  • Reclaimed the backlink 404s with 47 rules, all verified single-hop to a live page.
  • Fixed the product structured data across the catalogue: manufacturer part numbers backfilled onto 23,489 products, the brand key omitted when unknown rather than defaulting to the site name, HTML entities decoded, duplicate author entity suppressed.
> Product schema, verified live 10 August 2026
mpn23-088-19020-047 (was the internal SKU)
brandDaniel Defense (was the site tagline on unmapped products)
gtin12815604015134
Person entities1 (was 2)
HTML entities in JSON-LD0
3

Automation: stop the nightly pipeline undoing the work

The site runs an overnight sync that updates pricing and stock across the catalogue from a distributor feed. It was reverting SEO work every night, and a parsing bug had corrupted records silently.

The parser split the distributor’s semicolon-delimited feed on the semicolon — so any product whose name contained an HTML entity had its fields torn apart and shifted right. Because the department and quantity fields shifted too, those rows dropped out of category routing and stopped receiving price and stock updates entirely. Only five products were affected, and every one of the other 1,387 products with an ampersand in the title survived — but the failure mode was silent, and it took tracing the field shift to find it rather than guessing at the content pipeline that looked like the obvious culprit.

We patched the parser, repaired the records, added a duplicate-SKU guard, and made the description enhancer incremental — it had been paging through all 26,000 products nightly, 66 minutes of requests against the origin, to find the handful that were new.

The one that would have cost real money

A duplicate-merge pass had redirected a charging handle with ten units physically on the shelf into its out-of-stock twin. The page was reachable; the product could not be bought. We disabled that rule, audited every enabled redirect site-wide, and confirmed it was the only one pointing from in-stock to out-of-stock. Before merging any further duplicates we built a stock-override mechanism so shop inventory displays and sells even when the distributor feed reports out of stock.

Results

The size of the catalogue Google will actually rank

For nine months the site had roughly 1,000 URLs earning impressions against a catalogue of 26,000 products. Search Console page-level data, 28-day windows:

WindowURLs earning impressionsProduct URLs
Aug 20251,171931
Nov 20251,100865
Feb 20261,055810
Mar 20261,158852
Apr 2026 — trough990756
May 20261,4551,123
Jun 202610,6319,886
Jul 20268,5777,900
13 Jul – 9 Aug 20268,3517,667

The step change is June, which precedes most of the July and August work described above. It is real and dated; we have not established what caused it, and we are not going to claim it.

Year over year, same 40-day window

1 Jul – 9 AugClicksImpressionsAvg. positionCTR
20256,273346,24721.81.81%
20265,051243,83213.52.07%

Clicks are still below last year — the spring collapse took impressions with it and they have not fully returned. But average position improved by more than eight places and click-through rate rose 14%, which is what a technically healthy site looks like on its way back. Weekly clicks bottomed at 383 in the week of 6 April and have run between 844 and 921 for the last five weeks.

Results

The pages we rebuilt: too early to call, and we are not going to pretend otherwise

Two long-standing product guides were factually corrected and structurally expanded on 1–3 August: stale pricing replaced, wrong specifications fixed, contradictory figures reconciled against manufacturer sources, and new sections added targeting the questions the search results were actually asking.

PageBefore — 23–31 JulAfter — 1–9 Aug
MK18 guide4,405 impressions, position 8.64,626 impressions, position 8.2
M4A1 guide604 impressions, position 10.8719 impressions, position 10.1

Impressions and average position both improved slightly on both pages. Clicks did not — they fell on both. Query-level positions moved in both directions.

Why this is in here

Nine days is noise, not a result. We are including it because a case study that reports a clean win nine days after a content change is telling you something it cannot know. The honest read is that the pages are now factually correct and structurally complete, which is a precondition for ranking rather than evidence of it. The measurement window that matters opens in October.

AI search visibility

We asked the three engines the question a buyer actually asks

Tested 10 August 2026 with live web search enabled, on ChatGPT (GPT-5.4), Perplexity (Sonar Pro) and Google Gemini (3.5 Flash).

> “I live in the Dallas-Fort Worth area and want to buy a suppressor. Which gun shops near Fort Worth or Roanoke, Texas are Class III / SOT dealers that can handle the NFA transfer? Name specific stores.”
ChatGPT web search enabled → named Western Sport second of three, citing the About page
Perplexity live sources → named Western Sport first of five, citing a page published eleven days earlier
Gemini web search enabled → named Western Sport first, under its own “In and Near Roanoke, TX” heading, with the full street address

The phrases the models attributed to the store map onto its navigation labels and page titles — the machine-readable layer, not the marketing copy. That is the useful lesson. AI systems surface what they can parse and corroborate. Getting the structured, titled, crawlable layer right is what puts you in the answer.

Honesty

What is still open

When this page went live on 10 August 2026 it published a list of defects that were still broken. Most of that list was closed the following day. Rather than quietly replace it with a clean one, here is what was fixed, what was not, and the one claim on the original list that turned out to be wrong.

Closed — 11 August 2026

  • The brand taxonomy collision — and the symptom was not the problem. The visible defect was three brand URLs redirecting to suffixed variants and a fourth returning 404. The real cost sat elsewhere: the legacy attribute taxonomy was still flagged public, so the platform rendered a second brand link on roughly 25,000 product pages, pointing at a URL the live taxonomy did not own. Google had found two of those 404s by crawling real product pages, not the sitemap. Suppressing that legacy output fixed the broken links, the 404s and 446 duplicate sitemap URLs in one change — with no database write and no cache purge.
  • Two defects the original list did not contain, both surfaced by diagnosing the first one: a fifth major brand URL returning 404, and a brand page returning a healthy 200 while serving an almost empty archive, its 55 products stranded on the suffixed URL next door. Neither had ever been reported by any tool.
  • The four Optics 404s. The redirect map recorded as complete was not wrong, it was incomplete. It covered the nested category paths. The platform also resolved those categories by their final path segment, which made a flat variant of each one a live, indexable URL — and those four were never mapped. A record saying “done” is not the same as a live check saying so.
  • The duplicate H1 on the thread pitch database. The theme already de-duplicates page titles, but this page’s title arrives from a shortcode, which expands after that de-duplication has run. The existing fix could never have caught it.
  • The thread pitch database now has a sitewide navigation link. It previously had four contextual links and nothing else.
  • Three of the most-guessed URLs on the site were hard 404s — the about, contact and blog paths in their most common form. They were not on any list, in any report, or in any tool’s output. They were found by typing them.

Corrected — the original list got one thing wrong

It said the thread pitch database “has not been submitted for indexing”. That was false. Search Console reports the page submitted, indexed, and last crawled on 6 August, sitting in the sitemap and reachable from the site map. It still earns one impression in eighty-nine days. So indexing was never the constraint, and every hour spent on it would have been wasted. Indexed and findable are different measurements. Treating the first as evidence of the second is how a team spends a quarter fixing the wrong layer.

Still open

  • The two brand taxonomies still coexist, and the clean URLs are still not the canonical ones. A request for the Glock brand page now reaches the right page, but by redirect — the page itself still lives on a suffixed slug. Renaming those terms means writes across 25,000 product relationships, a rewrite flush, and a full cache purge on a store where a full purge measurably degrades the customer experience for hours. It is worth roughly 450 impressions a quarter. That trade does not justify itself as a bolt-on to another change, so it is scheduled deliberately rather than bundled in here.
  • One legacy redirect still passes through an insecure hop. The cause is now known: it is a web-server rule with a hard-coded http destination, not an application redirect, which is why the application-level fix that covers the other eight never fired for it. A one-line change at the server, outside this change window.
  • Mobile performance is the remaining lever. Desktop sits at 90–100. Mobile ranges 75–92 depending on cache state, with render delay — not image weight — accounting for 60% of the largest contentful paint.
  • AI visibility on the thread pitch question is unchanged, and should be expected to stay that way for months. A navigation link is not a citation. Research into the category found that every competing resource has a near-empty link profile of its own, so this is not a category that earns links passively. The remaining work is outreach, not engineering, and the honest measurement window is quarters rather than weeks.
The most instructive finding in the whole engagement

Publishing the best resource in a category does not get you cited, and the reason is almost never the one you would guess. That page shipped with correct schema, server-rendered rows and internal links, and it was indexed within a day. It is still invisible to the models because nothing points at it with any weight. Knowing whether your problem is technical, editorial or citation-based — and being willing to discover you were wrong about which — is the difference between six months of wasted work and six weeks of the right work.

Method

Every root cause was proven before it was fixed

The cache purge was found with a stack backtrace, not deduced from correlation. The server was ruled out with a controlled comparison. The product schema was verified by reading the live HTML, not by trusting plugin settings.

Several plausible theories were tested and discarded along the way. A payment plugin blamed for slow loads turned out to be irrelevant. A reported “1,313 broken backlinks” turned out to be the CDN returning 403 to one crawler’s user agent. A supposedly orphaned database option turned out to belong to an active plugin whose folder name did not match its slug.

That discipline is the method. On a site with 26,000 products and a dozen interacting systems, a wrong diagnosis is not neutral — it costs a change window, a cache rebuild, and sometimes a day of degraded customer experience. Measure, prove, fix one thing, verify, move on. More on how we work ›

Does this apply to you?

The specifics are e-commerce. The pattern is not.

  • Your traffic dropped and nobody can tell you exactly why
  • You have a large catalogue or document library and only a fraction of it appears in search
  • Your site is slow and the answers you have been given are “upgrade the server” or “add a caching plugin”
  • Your structured data was set up once and has never been read back
  • Buyers are asking ChatGPT, Perplexity and Gemini about your category and you do not know whether you are named
Why is your first case study a business you own?

Because it is the only engagement where we can show the server, the database, the source code and the measurements either side without a confidentiality boundary. We say so plainly at the top of the page. It proves capability rather than client satisfaction, and we would rather name that limitation than have you find it.

Did the work recover the lost traffic?

Not yet, and the case study says so. Clicks are still below the prior year. What has changed is that roughly eight times as many URLs now earn search impressions, average position improved from 21.8 to 13.5 year over year, and click-through rate rose 14%. Those are the conditions for recovery rather than the recovery itself.

How do you test whether AI names a company?

We write the questions a real buyer would ask in that category, run them through ChatGPT, Perplexity and Google Gemini with live web search enabled, and record whether the company is named, which competitors are named instead, and which sources each engine cited. We also capture the sub-queries the models issued, which shows companies they searched for and then dropped.

Can you do this for a manufacturer rather than an online store?

Yes, and that is the main practice. The e-commerce specifics differ, but the underlying work is the same: prove why machine-readable systems cannot read or corroborate you, fix that, and measure it. Specification-driven B2B usually has more raw material to work with, because the technical data already exists.

All figures dated. Search data from Google Search Console. Site performance and structured data verified live 10 August 2026. AI visibility tested 10 August 2026 across ChatGPT GPT-5.4, Perplexity Sonar Pro and Google Gemini 3.5 Flash, with live web search enabled. The fixes listed under “What is still open” were applied and re-verified against the live site on 11 August 2026, at the origin rather than the CDN edge.

Find out what AI says about you

We run the buyer questions in your category through ChatGPT, Perplexity and Google Gemini, and send you a short report showing whether you appear, who appears instead, and why. No cost, no obligation, no sales call required to receive it.

Request your free check

Usually back within two business days.