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

Sec. 02 — Stack & Data Loop · GA4 · Shopify · Tableau

Half evidence · half prescription — each block below is labeled

What's already firing on petsafe.com

A DTC Ops & Insights Specialist inherits, not builds from scratch. Before proposing dashboards, it's worth counting what's already emitting events. Numbers below are grep counts against the raw HTML of petsafe.com/ sampled 2026-09-20 23:20 UTC — reproducible one-liners in the evidence log at the bottom.

Frontend
Gatsby 5.16.1
Netlify-hosted static frontend. generator meta tag public. React Helmet drives per-page meta. 2026-09-20 · <meta name="generator" content="Gatsby 5.16.1">; response server: Netlify
CMS
Sanity
149 references in home HTML. Content model likely feeds every brand under one repo. 2026-09-20 · grep -oiE 'sanity' home.html | wc -l → 149
Commerce
Headless Shopify
Cart and checkout run on Shopify behind the Gatsby shell. 2026-09-20 · grep -oiE 'cdn\.shopify\.com' home.html | wc -l → 12; also confirmed by /cart.json disallow in robots.txt
Email & SMS
Klaviyo
4 refs in HTML. /klaviyo-form/ disallowed in robots — form endpoints are template routes. 2026-09-20 · grep -oiE 'klaviyo' home.html | wc -l → 4
Search
Algolia
3 refs. Powers on-site search. Ties directly to conversion funnel measurement. 2026-09-20 · grep -oiE 'algolia' home.html | wc -l → 3
Attribution
Triple Whale
5 refs. Cross-channel attribution and pixel — checks the box on the JD's preferred list. 2026-09-20 · grep -oiE 'triplewhale' home.html | wc -l → 5
Reviews
Bazaarvoice
5 refs. Product ratings + Q&A widgets. Robots blocks ?bvstate= parameters (good). Reviews widget has data-bv-seo="false" — reviews aren't SEO-rendered. Fix on Sec. 05. 2026-09-20 · attr grep on a real product page
Tag Manager
GTM
gtm.js loads. This is the injection point for a clean, documented event layer. 2026-09-20 · grep -oiE 'gtm\.js' home.html | wc -l → 2

The data loop I'd trust

Prescription · what I would build once hired

The JD asks for "trusted Tableau dashboards and consistent definitions for core DTC performance." Trust is built at the seams, not in the dashboard. Here's the loop I'd defend:

# The four seams that most often desync
Shopify order  ─▶  GA4 purchase       # dedupe on order_id, not transaction_id
GA4 session    ─▶  Triple Whale       # UTM taxonomy is the join key
Klaviyo event  ─▶  GA4 event          # email_opened ≠ engagement — define once
Algolia click  ─▶  GA4 view_item      # tie internal-search results to conversion

# Then Tableau reads from one place — a modeled layer, not raw connectors
Modeled layer  ─▶  Tableau           # definitions live in a shared metric dictionary
Definition first

Metric dictionary before any new dashboard

"Conversion rate," "AOV," "new vs. returning" — each defined with the exact filter, window, and source of truth. One page, versioned, linked from every dashboard.

Reconciliation, weekly

Shopify ↔ GA4 ↔ Triple Whale

A one-tab Tableau view that flags any day where the three sources disagree on order count by >3%. Silent 99% of the time; loud when something's actually broken.

AI in the loop, not on the throne

Claude for exploration, humans for calls

The JD is explicit — approved AI tools "explore data exports, identify patterns or anomalies" but outputs are validated. I already use Claude this way for weekly SKU-health and search-console rollups.

The three gaps at the front door

Evidence · sampled 2026-09-20

Front-door signal quality

  • Homepage schema. Zero application/ld+json blocks on petsafe.com/. Recommend Organization + WebSite + BreadcrumbList as the baseline; brand-page schema per sub-brand. 2026-09-20 · [E1] on Overview SEO · owner
  • Sitemap endpoint. /sitemap.xml currently returns 200 with an HTML body. Bing and AI crawlers will silently drop this. Repoint or generate an XML index at build time. 2026-09-20 · [E2] on Overview Ops · this sprint
  • llms.txt. 404. A 40-line file naming the brand, product families, and canonical URLs materially improves how ChatGPT and Claude cite the site. Cheap, high-ROI. 2026-09-20 · [E3] on Overview Ops · this sprint
  • Robots hygiene. Already clean — ?sort=, ?page=, ?limit=, ?bvstate=, /klaviyo-form/, /cart.json, and /search are all correctly disallowed. Someone has been careful here. 2026-09-20 · [E7] on Overview Confirmed good

Boundary check — from the JD

None of this is a strategy call. Site architecture, brand narrative, roadmap priorities stay with the channel owners. What I'd own is technical execution, QA, ticket-writing, dashboard maintenance, and honest reporting on whether we shipped what we said we'd ship.

Sampled 2026-09-20 23:20 UTC Scope homepage HTML + robots + sitemap + llms.txt Method curl + grep + JSON parse Not read checkout, account, admin, private analytics