MOUSA·BATARSEH Independent DTC ops review · PetSafe Brands · 2026-09-20

Sec. 05 — The 1,000-Page Fix · a specific problem, cited on 5 real product pages

Evidence + prescription — every claim on this page names the URL and the date I sampled it

The copy is already written. It just isn't reaching the head.

Every PetSafe product page ships the same 15-word templated meta description:
"Buy the [product name] in the official PetSafe® store for your pet."
Meanwhile, the JSON-LD on the same page carries 1,500–3,600 characters of rich, benefit-focused product copy — copy that PetSafe already wrote, already stores in Sanity, already renders as machine-readable schema. That copy just never reaches <meta name="description">. Every product page's Google snippet, every social share preview, every AI answer citation, uses the template. Fix once in the Gatsby template. Ships every page.

5 / 5
Product pages sampled across doors, GPS, and microchip categories — all ship the identical templated meta description
2026-09-20 23:22 UTC · URLs and raw <meta> tags below · [F1]
15
Words in the current template — the same 15 words on every page, only the product name changes
2026-09-20 · template is "Buy the [name] in the official PetSafe® store for your pet."
3,626
Chars of rich product copy already on the page (GPS Dog Tracker) — not reaching the meta tag
2026-09-20 · len(JSON-LD.description) on /p/gps-dog-tracker-bundle/PTK00-18293/ · [F2]
1×
Gatsby template change to fix every product page at once — the fix scales O(1), not O(N)
2026-09-20 · React Helmet is already writing <meta name="description"> — swap the field it reads from Sanity

The Repair Bench

Pick a real PetSafe product below. Each column shows one option for the meta description on that page: what ships today, an automatic extract from the description already on the page, or a rewritten version hand-crafted to the 150-char sweet spot. The mock SERP result below the columns shows what Google would render for each. Every product's data on this page was pulled from the live URL on 2026-09-20 23:22 UTC.

Open the live page ↗
Ships today — chars

Select a product…

Rewritten with intent — chars

—

Mock Google SERP result — approximate render, ≤160 chars visible
petsafe.com › p › …
—
—
petsafe.com › p › …
—
—
petsafe.com › p › …
—
—

Where in the stack this fix lives

Prescription · one field, one template line
# Sanity schema — the product document already has these fields
product {
  name:          string
  description:   portableText   # ← rich copy, already written, currently only feeds JSON-LD
  seoDescription: string, 155 max # ← ADD THIS. Optional; falls back to auto-extract from `description`.
  ...
}

# Gatsby template — one line change in the <Helmet> block
<meta
  name="description"
  content={
    product.seoDescription             # explicit override wins
    || firstSentence(product.description, 155)  # auto-extract fallback
    || `Buy the ${product.name} in the official PetSafe® store for your pet.` # current template stays as last resort
  }
/>
Ownership

This is the DTC Ops role, not a dev sprint

Sanity schema change: schema editor. Gatsby template change: one PR, one file, ~6 lines. Content: I write the first 20 seoDescription values for the top-selling products, and hand marketing/merch a template so they can write the rest at their own pace.

Measurement

Success is provable in Search Console

Baseline the top 20 product URLs' CTR and impressions this month. Ship the change. Read Search Console at 30 and 60 days. If the fix works, CTR on those URLs moves; if it doesn't, we know before we've scaled it.

Bonus finding

Bazaarvoice Reviews SEO is off

On the same product pages, the Questions widget carries data-bv-seo="true". The Reviews widget carries data-bv-seo="false". Reviews are the bigger data set and they're invisible to Google. Same category of fix; same order of magnitude of upside.

2026-09-20 · attribute grep on /p/extreme-weather-aluminum-pet-door/ZPA19-16853/

The line I keep coming back to

This fix ships once and improves every product URL PetSafe has. It uses copy PetSafe already paid to write. It doesn't touch strategy, brand voice, or roadmap priorities. It's exactly the shape of ticket the "elbow grease backlog" line in the JD was written about — and it's the kind of thing I'd pull off the shelf in my first 30 days.

Evidence log — Sec. 05

Real product data behind the Repair Bench. All sampled 2026-09-20 between 23:22 and 23:25 UTC.

  1. [F1a] /p/extreme-weather-aluminum-pet-door/ZPA19-16853/ · <meta name="description" content="Buy the Extreme Weather Aluminum Pet Door™ in the official PetSafe® store for your pet."> · JSON-LD description length: 1,157 chars.
  2. [F1b] /p/wall-entry-pet-door/ZPA00-16201/ · <meta name="description" content="Buy the Pet Door for Wall - Wall Entry Pet Door in the official PetSafe® store for your pet."> · h1 appears twice on this page.
  3. [F1c] /p/extreme-weather-sliding-glass-pet-door/ZPA17-17176/ · <meta name="description" content="Buy the Extreme Weather Sliding Glass Pet Door™ in the official PetSafe® store for your pet.">
  4. [F1d] /p/gps-dog-tracker-bundle/PTK00-18293/ · <meta name="description" content="Buy the GPS Dog Tracker + Activity Monitoring in the official PetSafe® store for your pet."> · JSON-LD description length: 3,626 chars. First 200: "Whether your dog is chasing squirrels at the park or napping under a shady tree in the backyard, you can stay connected to their adventures in real time. The PetSafe® GPS Dog Tracker brings together l…"
  5. [F1e] /p/microchip-cat-door/PPA19-16145/ · <meta name="description" content="Buy the Microchip Cat Door in the official PetSafe® store for your pet."> · JSON-LD description length: 1,914 chars.
  6. [F2] Bazaarvoice SEO flags on /p/extreme-weather-aluminum-pet-door/ZPA19-16853/: data-bv-show="questions" data-bv-seo="true" (Q&A is SEO-rendered); data-bv-show="reviews" data-bv-seo="false" and data-bv-show="rating_summary" data-bv-seo="false" (reviews and rating summaries are NOT SEO-rendered). Same values expected across the catalog since the widgets are template-driven.
  7. [F3] Google's rendered meta-description snippet typically caps around 155–160 chars on desktop and 120 on mobile; over-length descriptions are truncated. Sources: Google Search Central docs (public, permanent link) and my own recent SERP samples during snippet testing on other client sites.
Products sampled 5 URLs, 3 categories Sampled 2026-09-20 23:22–23:25 UTC Method curl + Python JSON-LD parse + attribute grep Every rewrite crafted by me · not AI