[object Object]

← back to Consulting Designerwallcoverings Com

preserve prior loop: GSC traffic-collector wired into snapshot (collector-side)

bf9f344f4599ea1f685b21ce2aed104755b0b6cc · 2026-07-26 09:00:22 -0700 · Steve Abrams

Files touched

Diff

commit bf9f344f4599ea1f685b21ce2aed104755b0b6cc
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Sun Jul 26 09:00:22 2026 -0700

    preserve prior loop: GSC traffic-collector wired into snapshot (collector-side)
---
 data/dw-analysis.json  | 423 ++++++++++++++++++++++++++++++++++++++++---------
 public/portal.html     |  56 +++----
 scripts/collect-dw.mjs |  95 ++++++++++-
 3 files changed, 469 insertions(+), 105 deletions(-)

diff --git a/data/dw-analysis.json b/data/dw-analysis.json
index 9852dcd..c5c887c 100644
--- a/data/dw-analysis.json
+++ b/data/dw-analysis.json
@@ -1,17 +1,18 @@
 {
-  "collected_at": "2026-07-26T15:22:46.241Z",
+  "collected_at": "2026-07-26T15:55:16.907Z",
   "sources": {
     "mirror": "dw_unified local mirror (host=/tmp) — READ ONLY",
     "mcc": "marketing.designerwallcoverings.com/api/channels/status",
     "fleet": "all.designerwallcoverings.com/api/microsites",
-    "storefront": "live products.json OK"
+    "storefront": "live products.json OK",
+    "traffic": "cached-dw-seo-report (GSC sc-domain:designerwallcoverings.com)"
   },
   "catalog": {
     "statuses": {
-      "ACTIVE": 80522,
+      "ACTIVE": 80542,
       "ARCHIVED": 80473,
       "DELETED_FROM_SHOPIFY": 16205,
-      "DRAFT": 16055,
+      "DRAFT": 16035,
       "UNLISTED": 1
     },
     "vendors_active": 174,
@@ -42,7 +43,7 @@
       },
       {
         "vendor": "Jeffrey Stevens",
-        "active": 2884
+        "active": 2899
       },
       {
         "vendor": "Brunschwig & Fils",
@@ -76,11 +77,11 @@
     "types": [
       {
         "type": "Wallcovering",
-        "active": 58283
+        "active": 58298
       },
       {
         "type": "Fabric",
-        "active": 16195
+        "active": 16200
       },
       {
         "type": "Commercial Fabric",
@@ -117,11 +118,11 @@
     ],
     "five_field": {
       "missing_sample": 2298,
-      "missing_sellable": 26737,
+      "missing_sellable": 26742,
       "missing_description": 172,
       "missing_image": 333,
       "zero_price": 1444,
-      "active_total": 80522
+      "active_total": 80542
     },
     "activation_cadence": [
       {
@@ -154,11 +155,11 @@
       },
       {
         "week": "07-06",
-        "added": 4255
+        "added": 4260
       },
       {
         "week": "07-13",
-        "added": 1471
+        "added": 1486
       },
       {
         "week": "07-20",
@@ -188,11 +189,11 @@
       }
     ],
     "price_bands_basis": "products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side",
-    "drafts_total": 16055,
-    "drafts_stageable": 2793,
+    "drafts_total": 16035,
+    "drafts_stageable": 2778,
     "sample_only": {
-      "quote_only_by_design": 3785,
-      "total": 26737,
+      "quote_only_by_design": 3790,
+      "total": 26742,
       "backlog": 22952
     },
     "sample_only_vendors": [
@@ -256,13 +257,13 @@
       },
       {
         "month": "Jul",
-        "added": 10329
+        "added": 10349
       }
     ],
     "needs_tags": [
       {
         "tag": "Needs-Price",
-        "count": 19226
+        "count": 19246
       },
       {
         "tag": "Needs-Image",
@@ -292,11 +293,11 @@
       },
       {
         "style": "Geometric",
-        "count": 11747
+        "count": 11748
       },
       {
         "style": "Floral",
-        "count": 10284
+        "count": 10286
       },
       {
         "style": "Grasscloth",
@@ -316,7 +317,7 @@
       },
       {
         "style": "Damask",
-        "count": 1925
+        "count": 1926
       }
     ],
     "color_mix": [
@@ -338,7 +339,7 @@
       {
         "color": "Blue",
         "hex": "#5a7fa8",
-        "count": 8550
+        "count": 8551
       },
       {
         "color": "Green",
@@ -353,7 +354,7 @@
       {
         "color": "Black",
         "hex": "#2b2b2b",
-        "count": 4882
+        "count": 4883
       },
       {
         "color": "Gold",
@@ -431,7 +432,7 @@
     }
   ],
   "fleet": {
-    "count": 234,
+    "count": 281,
     "sites": [
       {
         "host": "all.designerwallcoverings.com",
@@ -453,11 +454,21 @@
         "products": null,
         "ok": null
       },
+      {
+        "host": "coastline-reserve.designerwallcoverings.com",
+        "products": null,
+        "ok": null
+      },
       {
         "host": "cowtan-tout.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
+      {
+        "host": "phillipe-romano-textiles.designerwallcoverings.com",
+        "products": null,
+        "ok": null
+      },
       {
         "host": "astek.designerwallcoverings.com",
         "products": null,
@@ -488,6 +499,11 @@
         "products": null,
         "ok": null
       },
+      {
+        "host": "sangetsu.designerwallcoverings.com",
+        "products": null,
+        "ok": null
+      },
       {
         "host": "milton-king.designerwallcoverings.com",
         "products": null,
@@ -508,6 +524,11 @@
         "products": null,
         "ok": null
       },
+      {
+        "host": "china.designerwallcoverings.com",
+        "products": null,
+        "ok": null
+      },
       {
         "host": "quadrille.designerwallcoverings.com",
         "products": null,
@@ -543,6 +564,11 @@
         "products": null,
         "ok": null
       },
+      {
+        "host": "coordonn.designerwallcoverings.com",
+        "products": null,
+        "ok": null
+      },
       {
         "host": "coordonne.designerwallcoverings.com",
         "products": null,
@@ -569,167 +595,142 @@
         "ok": null
       },
       {
-        "host": "koroseal.designerwallcoverings.com",
-        "products": null,
-        "ok": null
-      },
-      {
-        "host": "philipjeffries.designerwallcoverings.com",
-        "products": null,
-        "ok": null
-      },
-      {
-        "host": "holly-hunt.designerwallcoverings.com",
-        "products": null,
-        "ok": null
-      },
-      {
-        "host": "arte.designerwallcoverings.com",
-        "products": null,
-        "ok": null
-      },
-      {
-        "host": "thibaut.designerwallcoverings.com",
-        "products": null,
-        "ok": null
-      },
-      {
-        "host": "maharam.designerwallcoverings.com",
+        "host": "goodrich.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "trestintas.designerwallcoverings.com",
+        "host": "eijffinger.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "colouranddesign.designerwallcoverings.com",
+        "host": "koroseal.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "fabricut.designerwallcoverings.com",
+        "host": "murals.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "designersguild.designerwallcoverings.com",
+        "host": "philipjeffries.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "newmor.designerwallcoverings.com",
+        "host": "phillipe-romano-vinyls.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "coleandson.designerwallcoverings.com",
+        "host": "holly-hunt.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "relativity-textiles.designerwallcoverings.com",
+        "host": "arte.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "denovowall.designerwallcoverings.com",
+        "host": "thibaut.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "elitis.designerwallcoverings.com",
+        "host": "j-josephson.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "pierre-frey.designerwallcoverings.com",
+        "host": "omexco.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "andrewmartin.designerwallcoverings.com",
+        "host": "koroseal-sg.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "sandberg.designerwallcoverings.com",
+        "host": "maharam.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "rwltd.designerwallcoverings.com",
+        "host": "trestintas.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "mindthegap.designerwallcoverings.com",
+        "host": "colour-design.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "markalexander.designerwallcoverings.com",
+        "host": "colouranddesign.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "reidwitlin.designerwallcoverings.com",
+        "host": "cole-son-sg.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "cole-son.designerwallcoverings.com",
+        "host": "fabricut.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "tecnografica.designerwallcoverings.com",
+        "host": "designersguild.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "harlequin.designerwallcoverings.com",
+        "host": "newmor.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "maya.designerwallcoverings.com",
+        "host": "coleandson.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "brunschwig.designerwallcoverings.com",
+        "host": "ardsley-textiles.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "surfacestick.designerwallcoverings.com",
+        "host": "relativity-textiles.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "fromental.designerwallcoverings.com",
+        "host": "denovo-wall.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "fromental-internal.designerwallcoverings.com",
+        "host": "elitis.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "carlisle.designerwallcoverings.com",
+        "host": "pierre-frey.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "catchii.designerwallcoverings.com",
+        "host": "andrewmartin.designerwallcoverings.com",
         "products": null,
         "ok": null
       },
       {
-        "host": "annafrench.designerwallcoverings.com",
+        "host": "sandberg.designerwallcoverings.com",
         "products": null,
         "ok": null
       }
@@ -939,5 +940,275 @@
       "image": "https://cdn.shopify.com/s/files/1/0015/4117/7456/files/vert-1904_1_134404.jpg?v=1782672048"
     }
   ],
+  "traffic": {
+    "available": true,
+    "source": "cached-dw-seo-report",
+    "property": "sc-domain:designerwallcoverings.com",
+    "pulled_at": "2026-07-20T20:49:00.041Z",
+    "stale": false,
+    "age_days": 6,
+    "window": "last 28 days",
+    "last_data_date": "2026-07-17",
+    "totals_28d": {
+      "clicks": 957,
+      "impressions": 49214,
+      "ctr": 0.019445686186857398,
+      "avg_position": 8.983683504693786
+    },
+    "branded_split": {
+      "branded_clicks": 76,
+      "nonbranded_clicks": 881,
+      "branded_pct": 0.0794148380355277
+    },
+    "top_queries": [
+      {
+        "query": "designer wallcoverings",
+        "clicks": 60,
+        "impressions": 227,
+        "ctr": 0.2643171806167401,
+        "position": 4.20704845814978
+      },
+      {
+        "query": "ralph lauren wallpaper",
+        "clicks": 49,
+        "impressions": 2290,
+        "ctr": 0.021397379912663755,
+        "position": 5.960698689956332
+      },
+      {
+        "query": "versace wallpaper",
+        "clicks": 27,
+        "impressions": 1913,
+        "ctr": 0.014113957135389441,
+        "position": 8.004704652378464
+      },
+      {
+        "query": "velvet wallpaper",
+        "clicks": 22,
+        "impressions": 1121,
+        "ctr": 0.019625334522747548,
+        "position": 7.057091882247993
+      },
+      {
+        "query": "lee jofa",
+        "clicks": 20,
+        "impressions": 1479,
+        "ctr": 0.013522650439486139,
+        "position": 5.807978363759297
+      },
+      {
+        "query": "lee jofa wallpaper",
+        "clicks": 16,
+        "impressions": 538,
+        "ctr": 0.02973977695167286,
+        "position": 5.717472118959108
+      },
+      {
+        "query": "missoni fabric",
+        "clicks": 16,
+        "impressions": 1255,
+        "ctr": 0.012749003984063745,
+        "position": 4.644621513944223
+      },
+      {
+        "query": "american silk mills",
+        "clicks": 14,
+        "impressions": 55,
+        "ctr": 0.2545454545454545,
+        "position": 2.1636363636363636
+      },
+      {
+        "query": "roberto cavalli wallpaper",
+        "clicks": 14,
+        "impressions": 333,
+        "ctr": 0.042042042042042045,
+        "position": 4.75975975975976
+      },
+      {
+        "query": "edelman leather",
+        "clicks": 12,
+        "impressions": 533,
+        "ctr": 0.0225140712945591,
+        "position": 5.637898686679175
+      },
+      {
+        "query": "equestrian wallpaper",
+        "clicks": 11,
+        "impressions": 424,
+        "ctr": 0.025943396226415096,
+        "position": 4.867924528301886
+      },
+      {
+        "query": "ralph lauren fabric",
+        "clicks": 9,
+        "impressions": 786,
+        "ctr": 0.011450381679389313,
+        "position": 11.360050890585242
+      }
+    ],
+    "striking_distance": [
+      {
+        "query": "versace wallpaper",
+        "impressions": 1913,
+        "clicks": 27,
+        "position": 8.004704652378464
+      },
+      {
+        "query": "wall coverings",
+        "impressions": 1213,
+        "clicks": 1,
+        "position": 15.076669414674361
+      },
+      {
+        "query": "osborne and little",
+        "impressions": 1102,
+        "clicks": 2,
+        "position": 8.674228675136117
+      },
+      {
+        "query": "designer wallpaper",
+        "impressions": 896,
+        "clicks": 4,
+        "position": 19.832589285714285
+      },
+      {
+        "query": "zuber wallpaper",
+        "impressions": 789,
+        "clicks": 6,
+        "position": 9.935361216730039
+      },
+      {
+        "query": "ralph lauren fabric",
+        "impressions": 786,
+        "clicks": 9,
+        "position": 11.360050890585242
+      },
+      {
+        "query": "maya romanoff wallpaper",
+        "impressions": 759,
+        "clicks": 2,
+        "position": 10.40711462450593
+      },
+      {
+        "query": "zuber",
+        "impressions": 683,
+        "clicks": 1,
+        "position": 8.619326500732065
+      },
+      {
+        "query": "cork wallpaper",
+        "impressions": 621,
+        "clicks": 7,
+        "position": 9.576489533011273
+      },
+      {
+        "query": "maya romanoff",
+        "impressions": 561,
+        "clicks": 2,
+        "position": 8.42602495543672
+      }
+    ],
+    "top_pages": [
+      {
+        "path": "/",
+        "clicks": 93,
+        "impressions": 1547
+      },
+      {
+        "path": "/collections/ralph-lauren-home",
+        "clicks": 73,
+        "impressions": 2987
+      },
+      {
+        "path": "/collections/missoni-home",
+        "clicks": 43,
+        "impressions": 1825
+      },
+      {
+        "path": "/collections/lee-jofa",
+        "clicks": 40,
+        "impressions": 2339
+      },
+      {
+        "path": "/collections/champs-elysees-chenille",
+        "clicks": 32,
+        "impressions": 1987
+      },
+      {
+        "path": "/collections/flocked-velvet-wallpaper-collection",
+        "clicks": 31,
+        "impressions": 2203
+      },
+      {
+        "path": "/collections/versace-wallpaper",
+        "clicks": 23,
+        "impressions": 1749
+      },
+      {
+        "path": "/pages/bn-wallcoverings",
+        "clicks": 22,
+        "impressions": 307
+      },
+      {
+        "path": "/collections/roberto-cavalli",
+        "clicks": 19,
+        "impressions": 469
+      },
+      {
+        "path": "/collections/equestrian-collection",
+        "clicks": 16,
+        "impressions": 463
+      }
+    ],
+    "monthly_trend": [
+      {
+        "ym": "2026-01",
+        "month": "Jan",
+        "clicks": 4790,
+        "impressions": 336667
+      },
+      {
+        "ym": "2026-02",
+        "month": "Feb",
+        "clicks": 8903,
+        "impressions": 988064
+      },
+      {
+        "ym": "2026-03",
+        "month": "Mar",
+        "clicks": 7318,
+        "impressions": 555381
+      },
+      {
+        "ym": "2026-04",
+        "month": "Apr",
+        "clicks": 5477,
+        "impressions": 461008
+      },
+      {
+        "ym": "2026-05",
+        "month": "May",
+        "clicks": 4908,
+        "impressions": 399661
+      },
+      {
+        "ym": "2026-06",
+        "month": "Jun",
+        "clicks": 4249,
+        "impressions": 334683
+      },
+      {
+        "ym": "2026-07",
+        "month": "Jul",
+        "clicks": 2335,
+        "impressions": 170842
+      }
+    ],
+    "ga4": {
+      "available": false,
+      "note": "No GA4 property provisioned for the main store (analytics rollout still awaiting ID)."
+    },
+    "note": "Real first-party GSC — cached from the OpenSEO pull the dw-seo-report project holds for this property (OpenSEO not reachable live at collection time)."
+  },
   "storefront_live": true
 }
\ No newline at end of file
diff --git a/public/portal.html b/public/portal.html
index f303208..6c3f0f9 100644
--- a/public/portal.html
+++ b/public/portal.html
@@ -116,7 +116,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 @media(max-width:640px){.metrics{gap:26px}}
 </style></head><body>
 <header class="bar">
-  <div class="stamp"><span>Data collected Jul 26, 2026, 8:22 AM</span><button id="refbtn" title="Re-run the read-only collector">↻ Refresh data</button></div>
+  <div class="stamp"><span>Data collected Jul 26, 2026, 8:55 AM</span><button id="refbtn" title="Re-run the read-only collector">↻ Refresh data</button></div>
   <button class="burger" onclick="document.body.classList.toggle('nav')" aria-label="Menu" aria-expanded="false" aria-controls="portalmenu"><span></span><span></span><span></span></button>
 </header>
 <div class="scrim" onclick="document.body.classList.remove('nav')"></div>
@@ -131,12 +131,12 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="in">
     <div class="kick">Los Angeles · nationwide e-commerce + trade · Confidential strategy brief · prepared for Steve Abrams</div>
     <h1 class="disp">Designer <span>Wallcoverings</span></h1>
-    <p>Thirty years of trade authority, <b>80,522 live SKUs</b> across <b>174 vendor lines</b>, a <b>234-site</b> discovery fleet, and <b>7 connected social channels</b> — the deepest designer-wallcovering operation online. The opportunity isn't building an audience; it's converting the catalog's dormant depth (a 22,952-product sellable-variant backlog, 16,055 staged drafts) into measured revenue. This brief maps exactly that, from the live data.</p>
+    <p>Thirty years of trade authority, <b>80,542 live SKUs</b> across <b>174 vendor lines</b>, a <b>281-site</b> discovery fleet, and <b>7 connected social channels</b> — the deepest designer-wallcovering operation online. The opportunity isn't building an audience; it's converting the catalog's dormant depth (a 22,952-product sellable-variant backlog, 16,035 staged drafts) into measured revenue. This brief maps exactly that, from the live data.</p>
     <div class="metrics">
-      <div class="m"><div class="v" data-c="80522">0</div><div class="l">Live SKUs (active)</div></div>
+      <div class="m"><div class="v" data-c="80542">0</div><div class="l">Live SKUs (active)</div></div>
       <div class="m"><div class="v" data-c="174">0</div><div class="l">Vendor lines</div></div>
-      <div class="m"><div class="v" data-c="234">0</div><div class="l">Microsite fleet</div></div>
-      <div class="m"><div class="v" data-c="16055">0</div><div class="l">Staged drafts (fuel)</div></div>
+      <div class="m"><div class="v" data-c="281">0</div><div class="l">Microsite fleet</div></div>
+      <div class="m"><div class="v" data-c="16035">0</div><div class="l">Staged drafts (fuel)</div></div>
     </div>
   </div>
 </div>
@@ -144,18 +144,18 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 <div class="accbar"><button id="xall">Expand all</button><button id="call">Collapse all</button></div>
 
 <section id="swot"><div class="eyebrow">Strategic Snapshot · SWOT</div><h2 class="disp">The whole board on one screen.</h2><div class="accbody">
-  <p class="lead2">Four lenses over the live snapshot — internal <b>Strengths</b> and <b>Weaknesses</b>, external <b>Opportunities</b> and <b>Threats</b> — so the strategy that follows starts from one honest picture. Every number here is from the Jul 26, 2026, 8:22 AM collection.</p>
-  <div class="swotgrid"><div class="swotq pos"><h3>Strengths</h3><ul><li>80,522 live SKUs across 174 vendor lines — one of the deepest designer-wallcovering catalogs online</li><li>A 234-site microsite fleet feeding discovery back to the flagship</li><li>7/7 social channels connected through one marketing command center</li><li>Private-label lines with owned margin (Phillipe Romano, Hollywood Wallcoverings, Malibu Wallpaper)</li><li>30+ years of trade relationships; memo-sample program ($4.25) as a proven funnel entry</li><li>Automated activation drip already shipping ~500 products/day, textures-first</li></ul></div><div class="swotq neg"><h3>Weaknesses</h3><ul><li>22,952 active products are sample-only WITHOUT a quote-only designation — browseable but not buyable</li><li>1,444 actives carry zero/null pricing; 333 lack a featured image</li><li>Social reach is broad (80 FB pages, 34 IG accounts) but thin — distribution without engagement depth</li><li>No social→revenue attribution discipline (UTM/coupon per channel) yet</li><li>Flagship UX carries catalog weight — 80k SKUs need stronger guided curation for retail buyers</li></ul></div><div class="swotq pos"><h3>Opportunities</h3><ul><li>Convert the 22,952 sample-only backlog into sellable variants — the single largest dormant-revenue pool in the business</li><li>16,055 staged drafts (2,793 fully stageable today) = months of "New Arrivals" marketing fuel</li><li>AEO/AI-answer citations for wallcovering queries — the flagship already ships an AEO block; extend it fleet-wide</li><li>Sample-order → full-roll conversion funnel instrumentation (order sync to the back office already exists)</li><li>Licensing original design IP (settlement-gated) into marketplaces as a zero-inventory revenue line</li></ul></div><div class="swotq neg"><h3>Threats</h3><ul><li>DTC-native entrants own the "approachable wallpaper" narrative with modern brand voices</li><li>Marketplace aggregators (Amazon, Wayfair, Etsy) commoditize mid-tier patterns</li><li>AI answer engines could disintermediate catalog-depth advantages if citations go to competitors</li><li>Vendor MAP / brand-control tightening limits pricing latitude on marquee lines</li></ul></div></div>
+  <p class="lead2">Four lenses over the live snapshot — internal <b>Strengths</b> and <b>Weaknesses</b>, external <b>Opportunities</b> and <b>Threats</b> — so the strategy that follows starts from one honest picture. Every number here is from the Jul 26, 2026, 8:55 AM collection.</p>
+  <div class="swotgrid"><div class="swotq pos"><h3>Strengths</h3><ul><li>80,542 live SKUs across 174 vendor lines — one of the deepest designer-wallcovering catalogs online</li><li>A 281-site microsite fleet feeding discovery back to the flagship</li><li>7/7 social channels connected through one marketing command center</li><li>Private-label lines with owned margin (Phillipe Romano, Hollywood Wallcoverings, Malibu Wallpaper)</li><li>30+ years of trade relationships; memo-sample program ($4.25) as a proven funnel entry</li><li>Automated activation drip already shipping ~500 products/day, textures-first</li></ul></div><div class="swotq neg"><h3>Weaknesses</h3><ul><li>22,952 active products are sample-only WITHOUT a quote-only designation — browseable but not buyable</li><li>1,444 actives carry zero/null pricing; 333 lack a featured image</li><li>Social reach is broad (80 FB pages, 34 IG accounts) but thin — distribution without engagement depth</li><li>No social→revenue attribution discipline (UTM/coupon per channel) yet</li><li>Flagship UX carries catalog weight — 80k SKUs need stronger guided curation for retail buyers</li></ul></div><div class="swotq pos"><h3>Opportunities</h3><ul><li>Convert the 22,952 sample-only backlog into sellable variants — the single largest dormant-revenue pool in the business</li><li>16,035 staged drafts (2,778 fully stageable today) = months of "New Arrivals" marketing fuel</li><li>AEO/AI-answer citations for wallcovering queries — the flagship already ships an AEO block; extend it fleet-wide</li><li>Sample-order → full-roll conversion funnel instrumentation (order sync to the back office already exists)</li><li>Licensing original design IP (settlement-gated) into marketplaces as a zero-inventory revenue line</li></ul></div><div class="swotq neg"><h3>Threats</h3><ul><li>DTC-native entrants own the "approachable wallpaper" narrative with modern brand voices</li><li>Marketplace aggregators (Amazon, Wayfair, Etsy) commoditize mid-tier patterns</li><li>AI answer engines could disintermediate catalog-depth advantages if citations go to competitors</li><li>Vendor MAP / brand-control tightening limits pricing latitude on marquee lines</li></ul></div></div>
   <div class="flagbox" style="margin-top:34px"><div class="i">⚡</div><div><h3 class="disp">The one-sentence thesis</h3><p>DW's moat is <b>catalog depth + trade authority</b>; its constraint is <b>conversion infrastructure</b>. The fastest wins activate what already exists — the sample-only backlog, the staged-draft drip, the connected-but-quiet channels — before building anything new.</p></div></div>
 </div></section>
 
 <section id="empire"><div class="eyebrow">01 · The Catalog Empire</div><h2 class="disp">Not a store. A catalog empire.</h2><div class="accbody">
-  <p class="lead2">The live mirror shows <b>80,522</b> active products, <b>16,055</b> staged drafts, and <b>80,473</b> archived — a merchandising engine with more inventory in reserve than most competitors have in total. Distribution runs through the flagship plus a <b>234-site</b> microsite fleet.</p>
+  <p class="lead2">The live mirror shows <b>80,542</b> active products, <b>16,035</b> staged drafts, and <b>80,473</b> archived — a merchandising engine with more inventory in reserve than most competitors have in total. Distribution runs through the flagship plus a <b>281-site</b> microsite fleet.</p>
   <div class="chartwrap tall"><div class="ct">Top vendor lines by live products</div><canvas id="vendorChart"></canvas></div>
   <div class="chartwrap"><div class="ct">Live catalog by product type</div><canvas id="typeChart"></canvas></div>
-  <table><thead><tr><th>#</th><th>Vendor line</th><th>Active products</th></tr></thead><tbody><tr><td class="mo">01</td><td><b>Phillipe Romano</b></td><td>11,270</td></tr><tr><td class="mo">02</td><td><b>Rebel Walls</b></td><td>3,770</td></tr><tr><td class="mo">03</td><td><b>Clarke And Clarke</b></td><td>3,570</td></tr><tr><td class="mo">04</td><td><b>Hollywood Wallcoverings</b></td><td>3,515</td></tr><tr><td class="mo">05</td><td><b>Malibu Wallpaper</b></td><td>3,232</td></tr><tr><td class="mo">06</td><td><b>Thibaut</b></td><td>2,987</td></tr><tr><td class="mo">07</td><td><b>Jeffrey Stevens</b></td><td>2,884</td></tr><tr><td class="mo">08</td><td><b>Brunschwig & Fils</b></td><td>2,761</td></tr><tr><td class="mo">09</td><td><b>Kravet</b></td><td>2,616</td></tr><tr><td class="mo">10</td><td><b>Phillip Jeffries</b></td><td>2,469</td></tr><tr><td class="mo">11</td><td><b>Koroseal</b></td><td>2,455</td></tr><tr><td class="mo">12</td><td><b>Gaston Y Daniela</b></td><td>2,148</td></tr><tr><td class="mo">13</td><td><b>Lee Jofa</b></td><td>2,040</td></tr><tr><td class="mo">14</td><td><b>Los Angeles Fabrics</b></td><td>1,833</td></tr></tbody></table>
+  <table><thead><tr><th>#</th><th>Vendor line</th><th>Active products</th></tr></thead><tbody><tr><td class="mo">01</td><td><b>Phillipe Romano</b></td><td>11,270</td></tr><tr><td class="mo">02</td><td><b>Rebel Walls</b></td><td>3,770</td></tr><tr><td class="mo">03</td><td><b>Clarke And Clarke</b></td><td>3,570</td></tr><tr><td class="mo">04</td><td><b>Hollywood Wallcoverings</b></td><td>3,515</td></tr><tr><td class="mo">05</td><td><b>Malibu Wallpaper</b></td><td>3,232</td></tr><tr><td class="mo">06</td><td><b>Thibaut</b></td><td>2,987</td></tr><tr><td class="mo">07</td><td><b>Jeffrey Stevens</b></td><td>2,899</td></tr><tr><td class="mo">08</td><td><b>Brunschwig & Fils</b></td><td>2,761</td></tr><tr><td class="mo">09</td><td><b>Kravet</b></td><td>2,616</td></tr><tr><td class="mo">10</td><td><b>Phillip Jeffries</b></td><td>2,469</td></tr><tr><td class="mo">11</td><td><b>Koroseal</b></td><td>2,455</td></tr><tr><td class="mo">12</td><td><b>Gaston Y Daniela</b></td><td>2,148</td></tr><tr><td class="mo">13</td><td><b>Lee Jofa</b></td><td>2,040</td></tr><tr><td class="mo">14</td><td><b>Los Angeles Fabrics</b></td><td>1,833</td></tr></tbody></table>
   <div class="eyebrow" style="margin-top:52px">Catalog DNA — what the shelves actually hold</div>
-  <p class="lead2">Tag analysis across all 80,522 actives. The palette runs <b>neutrals-first</b> — Beige + White alone account for ~44,140 products — a texture-led, trade-calibrated assortment. The merchandising read: DW owns the "quiet luxury" wall; bolder saturated stories (the DTC entrants' lane) are the underweighted shelf.</p>
+  <p class="lead2">Tag analysis across all 80,542 actives. The palette runs <b>neutrals-first</b> — Beige + White alone account for ~44,140 products — a texture-led, trade-calibrated assortment. The merchandising read: DW owns the "quiet luxury" wall; bolder saturated stories (the DTC entrants' lane) are the underweighted shelf.</p>
   <div class="duo">
     <div class="chartwrap"><div class="ct">Style mix — tag-matched across actives</div><canvas id="styleChart"></canvas></div>
     <div class="chartwrap"><div class="ct">Color mix — rendered in the actual hues</div><canvas id="colorChart"></canvas></div>
@@ -163,18 +163,18 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="mosaic"><a class="mtile" title="Willow Pearl - Cream Wallcovering | 1838 Wallcoverings — 1838 Wallcoverings"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2008-148-04-Willow-Pearl-scaled_27cc3134-1291-4605-85ca-d870cd905b85.jpg?v=1773305872&width=360" loading="lazy" alt="Willow Pearl - Cream Wallcovering | 1838 Wallcoverings"><span>1838 Wallcoverings</span></a><a class="mtile" title="Designdrop - Colourful Wallcovering | A.s. Création — A.S. Création"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/66e3a5f29fd1fd50090f5d5fce9b4ddc.jpg?v=1773629119&width=360" loading="lazy" alt="Designdrop - Colourful Wallcovering | A.s. Création"><span>A.S. Création</span></a><a class="mtile" title="Brown on Tint | Alan Campbell — Alan Campbell"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Criss-Cross-Brown-on-Tint-AC403-16_015244-sm-thumb.jpg?v=1783597230&width=360" loading="lazy" alt="Brown on Tint | Alan Campbell"><span>Alan Campbell</span></a><a class="mtile" title="Riviera Wallcovering | Ananbo — Ananbo"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/riviera.webp?v=1761541180&width=360" loading="lazy" alt="Riviera Wallcovering | Ananbo"><span>Ananbo</span></a><a class="mtile" title="Ark - Parchment - beige Wallcovering | Andrew Martin — Andrew Martin"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AMW10001_1611_11959302-5997-4bcd-9a99-c54a9b0919e8.jpg?v=1775761440&width=360" loading="lazy" alt="Ark - Parchment - beige Wallcovering | Andrew Martin"><span>Andrew Martin</span></a><a class="mtile" title="Gibson, Navy Wallcoverings | Anna French — Anna French"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/AT78793_4d4910ee-a9f9-4534-ae47-bed6b7d9942d.jpg?v=1782985244&width=360" loading="lazy" alt="Gibson, Navy Wallcoverings | Anna French"><span>Anna French</span></a><a class="mtile" title="Anthology - Stria Stone/Amber/Plum Wallcovering | Anthology — Anthology"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/ESHE131796.jpg?v=1784735551&width=360" loading="lazy" alt="Anthology - Stria Stone/Amber/Plum Wallcovering | Anthology"><span>Anthology</span></a><a class="mtile" title="Caswell Sage Green Wallcovering | Jeffrey Stevens — Apartment Wallpaper"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/PSW1213RL.jpg?v=1740775136&width=360" loading="lazy" alt="Caswell Sage Green Wallcovering | Jeffrey Stevens"><span>Apartment Wallpaper</span></a><a class="mtile" title="Atlantic Cay - Verdant | Architectural Fabrics — Architectural Fabrics"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Skintex-SF_Aspect_Teal.jpg?v=1773218078&width=360" loading="lazy" alt="Atlantic Cay - Verdant | Architectural Fabrics"><span>Architectural Fabrics</span></a><a class="mtile" title="Agra Okra Wallcovering | Arte International — Arte International"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg?v=1775694511&width=360" loading="lazy" alt="Agra Okra Wallcovering | Arte International"><span>Arte International</span></a><a class="mtile" title="Tabula Wax Yellow Wallcovering | Artmura — Artmura"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/TABW-002.jpg?v=1781283018&width=360" loading="lazy" alt="Tabula Wax Yellow Wallcovering | Artmura"><span>Artmura</span></a><a class="mtile" title="History of Art 2 - Green Wallcovering | AS Creation — AS Creation"><img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/792889b95340fba909e80a1654dba520_26de4b84-bada-44c9-8ff0-d634e951ba3c.jpg?v=1776187521&width=360" loading="lazy" alt="History of Art 2 - Green Wallcovering | AS Creation"><span>AS Creation</span></a></div>
   <p class="lead2" style="font-size:14px;opacity:.6;margin-top:10px">Live catalog, not stock photography — one current product from each of twelve vendor lines, straight off the store's own CDN.</p>
   <div class="eyebrow" style="margin-top:52px">The discovery fleet</div>
-  <p class="lead2">234 microsites — material-, era-, and city-specific storefront satellites that catch long-tail search and funnel to the flagship. A sample:</p>
-  <div class="fchips"><span class="fchip">all</span><span class="fchip">japan</span><span class="fchip">kravet</span><span class="fchip">cowtan</span><span class="fchip">cowtan-tout</span><span class="fchip">astek</span><span class="fchip">ascreation</span><span class="fchip">wolfgordon</span><span class="fchip">pf-fabric-10110</span><span class="fchip">pierrefreyfabrics</span><span class="fchip">scalamandre</span><span class="fchip">milton-king</span><span class="fchip">phillipjeffries</span><span class="fchip">rebelwalls</span><span class="fchip">jeffreystevens</span><span class="fchip">quadrille</span><span class="fchip">malibu</span><span class="fchip">marburg</span><span class="fchip">hollywood</span><span class="fchip">sancar</span><span class="fchip">philliperomano</span><span class="fchip">graham-brown</span><span class="fchip">coordonne</span><span class="fchip">designtex</span><span class="fchip">chinaseas</span><span class="fchip">romo</span><span class="fchip">jf-fabrics</span><span class="fchip">koroseal</span><span class="fchip">philipjeffries</span><span class="fchip">holly-hunt</span><span class="fchip">arte</span><span class="fchip">thibaut</span><span class="fchip">maharam</span><span class="fchip">trestintas</span><span class="fchip">colouranddesign</span><span class="fchip">fabricut</span><span class="fchip">designersguild</span><span class="fchip">newmor</span><span class="fchip">coleandson</span><span class="fchip">relativity-textiles</span><span class="fchip">denovowall</span><span class="fchip">elitis</span><span class="fchip">pierre-frey</span><span class="fchip">andrewmartin</span><span class="fchip">sandberg</span><span class="fchip">rwltd</span><span class="fchip">mindthegap</span><span class="fchip">markalexander</span></div>
+  <p class="lead2">281 microsites — material-, era-, and city-specific storefront satellites that catch long-tail search and funnel to the flagship. A sample:</p>
+  <div class="fchips"><span class="fchip">all</span><span class="fchip">japan</span><span class="fchip">kravet</span><span class="fchip">cowtan</span><span class="fchip">coastline-reserve</span><span class="fchip">cowtan-tout</span><span class="fchip">phillipe-romano-textiles</span><span class="fchip">astek</span><span class="fchip">ascreation</span><span class="fchip">wolfgordon</span><span class="fchip">pf-fabric-10110</span><span class="fchip">pierrefreyfabrics</span><span class="fchip">scalamandre</span><span class="fchip">sangetsu</span><span class="fchip">milton-king</span><span class="fchip">phillipjeffries</span><span class="fchip">rebelwalls</span><span class="fchip">jeffreystevens</span><span class="fchip">china</span><span class="fchip">quadrille</span><span class="fchip">malibu</span><span class="fchip">marburg</span><span class="fchip">hollywood</span><span class="fchip">sancar</span><span class="fchip">philliperomano</span><span class="fchip">graham-brown</span><span class="fchip">coordonn</span><span class="fchip">coordonne</span><span class="fchip">designtex</span><span class="fchip">chinaseas</span><span class="fchip">romo</span><span class="fchip">jf-fabrics</span><span class="fchip">goodrich</span><span class="fchip">eijffinger</span><span class="fchip">koroseal</span><span class="fchip">murals</span><span class="fchip">philipjeffries</span><span class="fchip">phillipe-romano-vinyls</span><span class="fchip">holly-hunt</span><span class="fchip">arte</span><span class="fchip">thibaut</span><span class="fchip">j-josephson</span><span class="fchip">omexco</span><span class="fchip">koroseal-sg</span><span class="fchip">maharam</span><span class="fchip">trestintas</span><span class="fchip">colour-design</span><span class="fchip">colouranddesign</span></div>
 </div></section>
 
 <section id="integrity"><div class="eyebrow">02 · Catalog Integrity — the 5-Field Read</div><h2 class="disp">Where the catalog leaks revenue.</h2><div class="accbody">
-  <p class="lead2">The house rule: every active product needs a sample variant, a sellable variant, complete pricing, a description, and tags — plus a featured image. Against 80,522 actives, the live counts:</p>
+  <p class="lead2">The house rule: every active product needs a sample variant, a sellable variant, complete pricing, a description, and tags — plus a featured image. Against 80,542 actives, the live counts:</p>
   <div class="chartwrap"><div class="ct">Actives failing each field (live mirror counts)</div><canvas id="ffChart"></canvas></div>
-  <div class="flagbox"><div class="i">◆</div><div><h3 class="disp">The 22,952-product finding</h3><p><b>26,737</b> actives are sample-only. <b>3,785</b> of those are quote-only lines by design. The remaining <b>22,952</b> — a third of the live catalog — can be browsed and sampled but not bought. Every one is paid-for merchandising with the register removed. This is the single largest dormant-revenue pool in the business.</p></div></div>
+  <div class="flagbox"><div class="i">◆</div><div><h3 class="disp">The 22,952-product finding</h3><p><b>26,742</b> actives are sample-only. <b>3,790</b> of those are quote-only lines by design. The remaining <b>22,952</b> — a third of the live catalog — can be browsed and sampled but not bought. Every one is paid-for merchandising with the register removed. This is the single largest dormant-revenue pool in the business.</p></div></div>
   <div class="chartwrap"><div class="ct">Sample-only actives — where they sit (top lines)</div><canvas id="soChart"></canvas></div>
   <table><thead><tr><th>Vendor line</th><th>Sample-only actives</th></tr></thead><tbody><tr><td><b>Phillipe Romano</b></td><td>5,924</td></tr><tr><td><b>Phillip Jeffries</b></td><td>2,461</td></tr><tr><td><b>Koroseal</b></td><td>2,454</td></tr><tr><td><b>China Seas</b></td><td>1,776</td></tr><tr><td><b>Coordonné</b></td><td>1,300</td></tr><tr><td><b>Hollywood Wallcoverings</b></td><td>1,089</td></tr><tr><td><b>Designers Guild</b></td><td>840</td></tr><tr><td><b>Osborne & Little</b></td><td>820</td></tr></tbody></table>
   <div class="eyebrow" style="margin-top:52px">The catalog's own to-do list</div>
-  <p class="lead2">The workflow tags tell the story without an audit: <b>19,656</b> actives are tagged Needs-Width, <b>19,226</b> Needs-Price, <b>16,531</b> Needs-Image. These self-reported queues ARE the integrity sprint's work orders — pre-triaged, machine-readable, waiting.</p>
+  <p class="lead2">The workflow tags tell the story without an audit: <b>19,656</b> actives are tagged Needs-Width, <b>19,246</b> Needs-Price, <b>16,531</b> Needs-Image. These self-reported queues ARE the integrity sprint's work orders — pre-triaged, machine-readable, waiting.</p>
   <div class="chartwrap"><div class="ct">Workflow-tag backlog on active products (live tag counts)</div><canvas id="needsChart"></canvas></div>
 </div></section>
 
@@ -200,14 +200,14 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="timing"><div class="eyebrow">05 · Timing &amp; Cadence</div><h2 class="disp">The drip is live. Point it at revenue.</h2><div class="accbody">
-  <p class="lead2">The growth curve, measured: monthly activations ramped from <b>223</b> in Jan to <b>10,329</b> in Jul — a 46× ramp as the activation engine came online. The merchandising calendar below aligns campaigns to the category's natural intent cycle.</p>
+  <p class="lead2">The growth curve, measured: monthly activations ramped from <b>223</b> in Jan to <b>10,349</b> in Jul — a 46× ramp as the activation engine came online. The merchandising calendar below aligns campaigns to the category's natural intent cycle.</p>
   <div class="chartwrap"><div class="ct">The ramp — new actives per month, last 7 months (live)</div><canvas id="rampChart"></canvas></div>
   <div class="chartwrap"><div class="ct">New active products per week — last 12 weeks (live)</div><canvas id="cadenceChart"></canvas></div>
   <table><thead><tr><th>Month</th><th>What the market is doing</th><th>The DW play</th></tr></thead><tbody><tr><td class="mo">Jan</td><td>New-year refresh intent peaks</td><td class="act">Push "one statement wall" entry offers; retarget Q4 samplers</td></tr><tr><td class="mo">Feb</td><td>Design-award season</td><td class="act">Editorial: trend reports off the catalog's own tag data</td></tr><tr><td class="mo">Mar</td><td>Spring project starts</td><td class="act">Trade outreach wave; hospitality spec season begins</td></tr><tr><td class="mo">Apr</td><td>High-intent renovation search</td><td class="act">Paid search on pattern + brand terms; AEO content sprint</td></tr><tr><td class="mo">May</td><td>Peak sample-ordering</td><td class="act">Sample-bundle promos; instrument sample→roll conversion</td></tr><tr><td class="mo">Jun</td><td>Mid-year new-arrivals surge</td><td class="act">The activation drip = daily "new" stories across channels</td></tr><tr><td class="mo">Jul</td><td>Summer install season</td><td class="act">Installer-partner co-marketing; project galleries</td></tr><tr><td class="mo">Aug</td><td>Pre-fall trade buying</td><td class="act">Designer-net program push; hospitality lookbook release</td></tr><tr><td class="mo">Sep</td><td>Fall flagship season</td><td class="act">Concept-direction launch (the new front page ships here)</td></tr><tr><td class="mo">Oct</td><td>Q4 project commits</td><td class="act">Retarget spring samplers; gift-adjacent art-line cross-sell</td></tr><tr><td class="mo">Nov</td><td>Holiday statement walls</td><td class="act">Peel-and-stick line forward; fast-ship messaging</td></tr><tr><td class="mo">Dec</td><td>Planning season</td><td class="act">Year-in-review design content; January intent capture</td></tr></tbody></table>
 </div></section>
 
 <section id="audit"><div class="eyebrow">06 · Website Audit</div><h2 class="disp">A strong engine that hides its best features.</h2><div class="accbody">
-  <p class="lead2">Analyst audit of the live flagship (Shopify + Boost search): the merchandising infrastructure is genuinely advanced — the gap is guided discovery for the retail buyer facing 80,522 choices.</p>
+  <p class="lead2">Analyst audit of the live flagship (Shopify + Boost search): the merchandising infrastructure is genuinely advanced — the gap is guided discovery for the retail buyer facing 80,542 choices.</p>
   <div class="cards2">
     <div class="c"><h3>Working well</h3><p class="good">Left-rail collection navigation · shop-by-color wheel with type pills · AEO content blocks on collections · sort + density controls on grids · New Arrivals / Trending smart collections refreshed by daily tag-sync · $4.25 memo-sample funnel on every product.</p></div>
     <div class="c"><h3>Gaps</h3><p class="flag">Sample-only products present a dead-end buy box (22,952 products) · zero-price actives surface in feeds (1,444) · 333 actives lack a featured image · curation layers (rooms, moods, designer picks) are thin relative to catalog depth.</p></div>
@@ -269,7 +269,7 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
   <div class="sugg">
     <div class="s"><div class="p">Pool 1 · largest</div><h4>The sellable-variant backlog</h4><p>22,952 active products browseable but not buyable. Even a 1% conversion at category AOV is a six-figure annual pool. Remediation is data work, not marketing spend.</p></div>
     <div class="s"><div class="p">Pool 2 · compounding</div><h4>Sample → roll funnel</h4><p>The $4.25 memo program generates purchase-intent signals daily. Instrumented follow-up (sampled-but-didn't-buy sequences) converts existing intent at near-zero cost.</p></div>
-    <div class="s"><div class="p">Pool 3 · scheduled</div><h4>The staged-draft drip</h4><p>16,055 drafts activating ~500/day = a permanent "new arrivals" marketing engine. Sync email + social to the drip and every day ships its own campaign.</p></div>
+    <div class="s"><div class="p">Pool 3 · scheduled</div><h4>The staged-draft drip</h4><p>16,035 drafts activating ~500/day = a permanent "new arrivals" marketing engine. Sync email + social to the drip and every day ships its own campaign.</p></div>
     <div class="s"><div class="p">Pool 4 · zero-inventory</div><h4>Original design licensing</h4><p>Settlement-gated original pattern IP licensed to print-on-demand marketplaces — revenue without inventory, already piloted in the wider operation.</p></div>
     <div class="s"><div class="p">Pool 5 · trade</div><h4>Designer-net portal</h4><p>Formalize trade pricing behind a designer login. Trade buyers are the highest-LTV segment and currently buy through the retail flow.</p></div>
     <div class="s"><div class="p">Pool 6 · projects</div><h4>Hospitality / contract desk</h4><p>Type II contract lines already in catalog. A spec-sheet + quote desk turns one hotel corridor into 400 rolls.</p></div>
@@ -278,16 +278,16 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="desk"><div class="eyebrow">11 · Live Commerce Desk</div><h2 class="disp">The operation, on one screen.</h2><div class="accbody">
-  <p class="lead2">Live KPIs from the Jul 26, 2026, 8:22 AM snapshot — the numbers a weekly growth review should open with. Hit ↻ Refresh (top right) to re-collect on demand.</p>
+  <p class="lead2">Live KPIs from the Jul 26, 2026, 8:55 AM snapshot — the numbers a weekly growth review should open with. Hit ↻ Refresh (top right) to re-collect on demand.</p>
   <div class="kpis">
-    <div class="kpi"><div class="kv">80,522</div><div class="kl">Active products</div></div>
-    <div class="kpi"><div class="kv">16,055</div><div class="kl">Staged drafts</div></div>
-    <div class="kpi"><div class="kv">2,793</div><div class="kl">Stageable today (variant + image)</div></div>
+    <div class="kpi"><div class="kv">80,542</div><div class="kl">Active products</div></div>
+    <div class="kpi"><div class="kv">16,035</div><div class="kl">Staged drafts</div></div>
+    <div class="kpi"><div class="kv">2,778</div><div class="kl">Stageable today (variant + image)</div></div>
     <div class="kpi"><div class="kv">22,952</div><div class="kl">Sample-only backlog (non-quote)</div></div>
     <div class="kpi"><div class="kv">1,444</div><div class="kl">Zero-price actives</div></div>
     <div class="kpi"><div class="kv">333</div><div class="kl">Image-less actives</div></div>
     <div class="kpi"><div class="kv">174</div><div class="kl">Vendor lines live</div></div>
-    <div class="kpi"><div class="kv">234</div><div class="kl">Fleet microsites</div></div>
+    <div class="kpi"><div class="kv">281</div><div class="kl">Fleet microsites</div></div>
   </div>
   <div class="chartwrap"><div class="ct">Weekly activation cadence (same data as Section 05 — the desk's pulse line)</div><canvas id="deskChart"></canvas></div>
 </div></section>
@@ -302,13 +302,13 @@ footer{padding:56px clamp(24px,7vw,120px);border-top:1px solid var(--line);color
 </div></section>
 
 <section id="sources"><div class="eyebrow">13 · Sources &amp; Methodology</div><h2 class="disp">Where every number comes from.</h2><div class="accbody">
-  <p class="lead2">Snapshot collected <b>Jul 26, 2026, 8:22 AM</b> by a read-only collector. Live rows are measured; analyst rows are authored judgment; anything illustrative says so.</p>
+  <p class="lead2">Snapshot collected <b>Jul 26, 2026, 8:55 AM</b> by a read-only collector. Live rows are measured; analyst rows are authored judgment; anything illustrative says so.</p>
   <div class="srclegend"><span class="srcb r">Live snapshot</span><span class="srcb o">Observed live</span><span class="srcb a">Analyst view</span><span class="srcb d">Computed</span><span class="srcb e">Illustrative</span></div>
-  <table><thead><tr><th>Section</th><th>Where it comes from</th><th>How it's produced</th><th>Provenance</th></tr></thead><tbody><tr><td><b>Catalog KPIs — statuses, vendors, types, integrity, cadence</b></td><td>The dw_unified local mirror (READ-ONLY psql over the /tmp socket)</td><td>Collected by <code>scripts/collect-dw.mjs</code> at <b>Jul 26, 2026, 8:22 AM</b>; every number on this page renders from that snapshot</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>5-field / sample-only split</b></td><td>Mirror rollup columns (has_sample_variant, has_product_variant, has_description, image_url) + the quotes tag</td><td>Direct SQL counts; quote-only lines (by-design sample-only) separated from true backlog</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Social channel status</b></td><td>The DW marketing command center API (marketing.designerwallcoverings.com)</td><td>Authenticated status read at collection time — connected flags + account counts per platform</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Microsite fleet</b></td><td>The fleet aggregator directory API (all.designerwallcoverings.com)</td><td>234 sites enumerated at collection time</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor watch-list</b></td><td>The connie_competitors table (the DW competitor-scan registry)</td><td>Rendered verbatim: domain, watch status, products found by prior scans</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor paid-ads table</b></td><td>A $0 homepage pixel scan of each tracked domain (Google/Meta/TikTok/Pinterest/Bing tag signatures)</td><td>Measured at seed time by <code>scripts/seed-buckets.mjs</code>; unreachable homepages say so rather than guessing</td><td class="srccell"><span class="srcb o">Observed live</span></td></tr><tr><td><b>Competitor scoring chart + map pins</b></td><td>Analyst assessment over public sites; HQ geo compiled from public records</td><td>Authored consulting view — NOT scraped metrics; the map is oriented, not surveyed</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Price-band chart</b></td><td>products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side</td><td>Partial-basis chart, labeled as such — full variant pricing lives Shopify-side</td><td class="srccell"><span class="srcb d">Computed</span></td></tr><tr><td><b>Website & social audits, partners, revenue plays, roadmap</b></td><td>Analyst strategy grounded in the operating knowledge of the DW stack</td><td>Consulting recommendations — models and plays, not measurements</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Catalog DNA — style, color & workflow-tag charts</b></td><td>Tag-match SQL over all actives (the same tag buckets the storefront sort uses)</td><td>Live counts per style/color/Needs-* tag; the color doughnut renders in representative hues of the tag names</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Monthly activation ramp</b></td><td>created_at_shopify over the last 7 calendar months, live mirror</td><td>Direct SQL; the ramp multiplier in the copy is computed from the same series</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Product mosaic + concept-grid imagery</b></td><td>The store's own CDN (one current ACTIVE product per vendor line, forbidden-vendor-filtered)</td><td>Already customer-facing on the live store; hotlinked at thumbnail width</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Hero imagery</b></td><td>Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)</td><td>Hotlinked, decorative only — carries no data meaning</td><td class="srccell"><span class="srcb e">Illustrative</span></td></tr></tbody></table>
+  <table><thead><tr><th>Section</th><th>Where it comes from</th><th>How it's produced</th><th>Provenance</th></tr></thead><tbody><tr><td><b>Catalog KPIs — statuses, vendors, types, integrity, cadence</b></td><td>The dw_unified local mirror (READ-ONLY psql over the /tmp socket)</td><td>Collected by <code>scripts/collect-dw.mjs</code> at <b>Jul 26, 2026, 8:55 AM</b>; every number on this page renders from that snapshot</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>5-field / sample-only split</b></td><td>Mirror rollup columns (has_sample_variant, has_product_variant, has_description, image_url) + the quotes tag</td><td>Direct SQL counts; quote-only lines (by-design sample-only) separated from true backlog</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Social channel status</b></td><td>The DW marketing command center API (marketing.designerwallcoverings.com)</td><td>Authenticated status read at collection time — connected flags + account counts per platform</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Microsite fleet</b></td><td>The fleet aggregator directory API (all.designerwallcoverings.com)</td><td>281 sites enumerated at collection time</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor watch-list</b></td><td>The connie_competitors table (the DW competitor-scan registry)</td><td>Rendered verbatim: domain, watch status, products found by prior scans</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Competitor paid-ads table</b></td><td>A $0 homepage pixel scan of each tracked domain (Google/Meta/TikTok/Pinterest/Bing tag signatures)</td><td>Measured at seed time by <code>scripts/seed-buckets.mjs</code>; unreachable homepages say so rather than guessing</td><td class="srccell"><span class="srcb o">Observed live</span></td></tr><tr><td><b>Competitor scoring chart + map pins</b></td><td>Analyst assessment over public sites; HQ geo compiled from public records</td><td>Authored consulting view — NOT scraped metrics; the map is oriented, not surveyed</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Price-band chart</b></td><td>products whose minimum variant exceeds the $4.25 memo sample — the priced subset of the mirror (~3.8k); most actives resolve min-variant to the sample, and full variant-level pricing lives Shopify-side</td><td>Partial-basis chart, labeled as such — full variant pricing lives Shopify-side</td><td class="srccell"><span class="srcb d">Computed</span></td></tr><tr><td><b>Website & social audits, partners, revenue plays, roadmap</b></td><td>Analyst strategy grounded in the operating knowledge of the DW stack</td><td>Consulting recommendations — models and plays, not measurements</td><td class="srccell"><span class="srcb a">Analyst view</span></td></tr><tr><td><b>Catalog DNA — style, color & workflow-tag charts</b></td><td>Tag-match SQL over all actives (the same tag buckets the storefront sort uses)</td><td>Live counts per style/color/Needs-* tag; the color doughnut renders in representative hues of the tag names</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Monthly activation ramp</b></td><td>created_at_shopify over the last 7 calendar months, live mirror</td><td>Direct SQL; the ramp multiplier in the copy is computed from the same series</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Product mosaic + concept-grid imagery</b></td><td>The store's own CDN (one current ACTIVE product per vendor line, forbidden-vendor-filtered)</td><td>Already customer-facing on the live store; hotlinked at thumbnail width</td><td class="srccell"><span class="srcb r">Live snapshot</span></td></tr><tr><td><b>Hero imagery</b></td><td>Unsplash editorial stock (luxury materials, per the luxe-only imagery rule)</td><td>Hotlinked, decorative only — carries no data meaning</td><td class="srccell"><span class="srcb e">Illustrative</span></td></tr></tbody></table>
   <div class="srcnote"><div class="i">&#9881;</div><div><h4>How this document is built</h4><p>Generated, not hand-typed. A read-only collector (<code>scripts/collect-dw.mjs</code>) snapshots the DW systems into <code>data/dw-analysis.json</code>; the build (<code>build.mjs</code>) renders that snapshot into this page. The ↻ Refresh button re-runs collector + build on demand. Nothing writes to any DW production system.</p></div></div>
 </div></section>
 
-<footer><span>Designer Wallcoverings · Growth Strategy Brief</span><span>Data as of Jul 26, 2026, 8:22 AM</span><span>Confidential — for discussion</span></footer>
+<footer><span>Designer Wallcoverings · Growth Strategy Brief</span><span>Data as of Jul 26, 2026, 8:55 AM</span><span>Confidential — for discussion</span></footer>
 
 <script>
 (function(){var s=document.querySelectorAll('.hero .slide'),i=0;if(s.length<2)return;setInterval(function(){s[i].classList.remove('on');i=(i+1)%s.length;s[i].classList.add('on');},5200);})();
@@ -335,7 +335,7 @@ function initCharts(){if(charted||!window.Chart)return;charted=true;
   var RM=window.matchMedia&&window.matchMedia('(prefers-reduced-motion:reduce)').matches;
   Chart.defaults.animation=RM?false:{duration:1150,easing:'easeInOutQuart'};
   if(!RM){Chart.defaults.animations={y:{from:function(c){return c.chart.scales.y?c.chart.scales.y.getPixelForValue(0):0;}}};}
-  var D={"cadence":{"labels":["05-11","05-25","06-01","06-08","06-15","06-22","06-29","07-06","07-13","07-20"],"added":[490,3,492,924,1993,1510,1854,4255,1471,3377]},"vendors":{"labels":["Phillipe Romano","Rebel Walls","Clarke And Clarke","Hollywood Wallcoverings","Malibu Wallpaper","Thibaut","Jeffrey Stevens","Brunschwig & Fils","Kravet","Phillip Jeffries"],"counts":[11270,3770,3570,3515,3232,2987,2884,2761,2616,2469]},"types":{"labels":["Wallcovering","Fabric","Commercial Fabric","Mural","Wallcoverings","Memo Sample"],"counts":[58283,16195,1797,1305,453,451]},"integrity":{"labels":["Missing sellable variant","Missing sample variant","Zero / null price","Missing image","Missing description"],"counts":[26737,2298,1444,333,172]},"bands":{"labels":["Under $50","$50–150","$150–300","$300–600","$600+"],"counts":[2118,699,435,443,129]},"channels":{"labels":["Facebook Pages","Instagram","TikTok","YouTube","Bluesky","Threads","LinkedIn"],"accounts":[80,34,1,1,1,1,1]},"sampleOnlyVendors":{"labels":["Phillipe Romano","Phillip Jeffries","Koroseal","China Seas","Coordonné","Hollywood Wallcoverings","Designers Guild","Osborne & Little"],"counts":[5924,2461,2454,1776,1300,1089,840,820]},"comp":{"labels":["Designer Wallcoverings","DecoratorsBest","Burke Decor","Mahones","Finest Wallpaper","Steve's B&W"],"catalog":[96,62,48,55,40,45],"digital":[58,82,78,60,42,55]},"monthly":{"labels":["Jan","Feb","Mar","Apr","May","Jun","Jul"],"added":[223,1363,4578,3416,493,5547,10329]},"needs":{"labels":["Needs Price","Needs Image","Needs Width","Needs Description"],"counts":[19226,16531,19656,27]},"styles":{"labels":["Contemporary","Textured","Traditional","Geometric","Floral","Grasscloth","Stripe","Mural","Metallic","Damask"],"counts":[32580,29302,22704,11747,10284,9846,9153,4769,3212,1925]},"colors":{"labels":["Beige","White","Gray","Blue","Green","Brown","Black","Gold","Pink","Red"],"counts":[22079,22061,12163,8550,7749,5192,4882,4326,3456,2946],"hex":["#d9c9a8","#f2efe8","#9a9a99","#5a7fa8","#6b8f6d","#8a6a4c","#2b2b2b","#c9a24b","#d3a0a6","#a84a44"]}};
+  var D={"cadence":{"labels":["05-11","05-25","06-01","06-08","06-15","06-22","06-29","07-06","07-13","07-20"],"added":[490,3,492,924,1993,1510,1854,4260,1486,3377]},"vendors":{"labels":["Phillipe Romano","Rebel Walls","Clarke And Clarke","Hollywood Wallcoverings","Malibu Wallpaper","Thibaut","Jeffrey Stevens","Brunschwig & Fils","Kravet","Phillip Jeffries"],"counts":[11270,3770,3570,3515,3232,2987,2899,2761,2616,2469]},"types":{"labels":["Wallcovering","Fabric","Commercial Fabric","Mural","Wallcoverings","Memo Sample"],"counts":[58298,16200,1797,1305,453,451]},"integrity":{"labels":["Missing sellable variant","Missing sample variant","Zero / null price","Missing image","Missing description"],"counts":[26742,2298,1444,333,172]},"bands":{"labels":["Under $50","$50–150","$150–300","$300–600","$600+"],"counts":[2118,699,435,443,129]},"channels":{"labels":["Facebook Pages","Instagram","TikTok","YouTube","Bluesky","Threads","LinkedIn"],"accounts":[80,34,1,1,1,1,1]},"sampleOnlyVendors":{"labels":["Phillipe Romano","Phillip Jeffries","Koroseal","China Seas","Coordonné","Hollywood Wallcoverings","Designers Guild","Osborne & Little"],"counts":[5924,2461,2454,1776,1300,1089,840,820]},"comp":{"labels":["Designer Wallcoverings","DecoratorsBest","Burke Decor","Mahones","Finest Wallpaper","Steve's B&W"],"catalog":[96,62,48,55,40,45],"digital":[58,82,78,60,42,55]},"monthly":{"labels":["Jan","Feb","Mar","Apr","May","Jun","Jul"],"added":[223,1363,4578,3416,493,5547,10349]},"needs":{"labels":["Needs Price","Needs Image","Needs Width","Needs Description"],"counts":[19246,16531,19656,27]},"styles":{"labels":["Contemporary","Textured","Traditional","Geometric","Floral","Grasscloth","Stripe","Mural","Metallic","Damask"],"counts":[32580,29302,22704,11748,10286,9846,9153,4769,3212,1926]},"colors":{"labels":["Beige","White","Gray","Blue","Green","Brown","Black","Gold","Pink","Red"],"counts":[22079,22061,12163,8551,7749,5192,4883,4326,3456,2946],"hex":["#d9c9a8","#f2efe8","#9a9a99","#5a7fa8","#6b8f6d","#8a6a4c","#2b2b2b","#c9a24b","#d3a0a6","#a84a44"]}};
   function mk(id,cfg){var el=document.getElementById(id);if(el)new Chart(el,cfg);}
   // Vertical gold gradient for area fills — scriptable so it re-derives per chart area
   function goldFill(a){return function(c){var ch=c.chart,area=ch.chartArea;if(!area)return 'rgba(201,162,75,.12)';var g=ch.ctx.createLinearGradient(0,area.top,0,area.bottom);g.addColorStop(0,'rgba(201,162,75,'+a+')');g.addColorStop(1,'rgba(201,162,75,0)');return g;};}
@@ -355,7 +355,7 @@ function initCharts(){if(charted||!window.Chart)return;charted=true;
 }
 var mapped=false;
 function initMap(){if(mapped||!window.L||!document.getElementById('compmap'))return;mapped=true;
-  var pts=[{"name":"Designer Wallcoverings — Los Angeles","lat":34.076,"lng":-118.377,"you":true,"note":"HQ · showroom · 80,522 live SKUs"},{"name":"DecoratorsBest","lat":40.752,"lng":-73.993,"note":"New York, NY — designer-brand e-commerce"},{"name":"Burke Decor","lat":41.099,"lng":-80.649,"note":"Youngstown, OH — home decor + wallpaper"},{"name":"Mahone's Wallpaper Shop","lat":37.089,"lng":-76.473,"note":"Newport News, VA — wallpaper specialist"},{"name":"Finest Wallpaper","lat":43.09,"lng":-79.08,"note":"Ontario, Canada — designer lines, US/CA pricing"},{"name":"Steve's Blinds & Wallpaper","lat":42.58,"lng":-83.03,"note":"Sterling Heights, MI — discount volume"}];
+  var pts=[{"name":"Designer Wallcoverings — Los Angeles","lat":34.076,"lng":-118.377,"you":true,"note":"HQ · showroom · 80,542 live SKUs"},{"name":"DecoratorsBest","lat":40.752,"lng":-73.993,"note":"New York, NY — designer-brand e-commerce"},{"name":"Burke Decor","lat":41.099,"lng":-80.649,"note":"Youngstown, OH — home decor + wallpaper"},{"name":"Mahone's Wallpaper Shop","lat":37.089,"lng":-76.473,"note":"Newport News, VA — wallpaper specialist"},{"name":"Finest Wallpaper","lat":43.09,"lng":-79.08,"note":"Ontario, Canada — designer lines, US/CA pricing"},{"name":"Steve's Blinds & Wallpaper","lat":42.58,"lng":-83.03,"note":"Sterling Heights, MI — discount volume"}];
   var m=L.map('compmap',{scrollWheelZoom:false}).setView([38.5,-96],4);
   L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© OpenStreetMap © CARTO',maxZoom:18}).addTo(m);
   pts.forEach(function(p){var mk=L.circleMarker([p.lat,p.lng],{radius:p.you?10:7,color:p.you?'#c9a24b':'#78aaff',fillColor:p.you?'#c9a24b':'#78aaff',fillOpacity:.85,weight:1});
diff --git a/scripts/collect-dw.mjs b/scripts/collect-dw.mjs
index 137d597..62d7e7b 100644
--- a/scripts/collect-dw.mjs
+++ b/scripts/collect-dw.mjs
@@ -5,9 +5,10 @@
 // microsite directory, and the public storefront feed. Never writes to any DW
 // system. Output: data/dw-analysis.json with a collected_at stamp.
 import { execFileSync } from 'node:child_process';
-import { writeFileSync, mkdirSync } from 'node:fs';
+import { writeFileSync, mkdirSync, readFileSync, statSync } from 'node:fs';
 import { dirname, join } from 'node:path';
 import { fileURLToPath } from 'node:url';
+import { homedir } from 'node:os';
 
 const HERE = dirname(fileURLToPath(import.meta.url));
 const OUT = join(HERE, '..', 'data');
@@ -148,6 +149,95 @@ const fleet = (Array.isArray(siteList) ? siteList : []).map(s => {
   };
 }).filter(s => s.host && !FORBIDDEN.test(s.host));
 
+/* ----------------------------------------------------- traffic & search --- */
+// GSC "Traffic & Search Reality" (DTD verdict A, 5/5, 2026-07-26): try the LIVE
+// OpenSEO MCP at localhost:3001 first (freshest first-party GSC for
+// sc-domain:designerwallcoverings.com); on unreachable/empty FALL BACK to the
+// REAL cached pull the sibling dw-seo-report project already holds for the SAME
+// property. Additive/optional — NEVER blocks the snapshot (no sanity-gate exit).
+// GA4 is honest-null: no live property is provisioned for the main store (the
+// analytics rollout is still 'awaiting ID').
+const GSC_PROJECT = '20a5b2e9-ea7b-4645-964a-46f04c9992e7';
+const GSC_PROPERTY = 'sc-domain:designerwallcoverings.com';
+const SEO_CACHE = join(homedir(), 'Projects', 'dw-seo-report', 'data');
+const GA4_NULL = { available: false, note: 'No GA4 property provisioned for the main store (analytics rollout still awaiting ID).' };
+
+async function mcpGsc(dimensions, dateRange, rowLimit) {
+  const payload = { jsonrpc: '2.0', id: 1, method: 'tools/call', params: {
+    name: 'get_search_console_performance',
+    arguments: { projectId: GSC_PROJECT, dimensions, dateRange, rowLimit } } };
+  const r = await fetch('http://localhost:3001/mcp', {
+    method: 'POST',
+    headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream' },
+    body: JSON.stringify(payload), signal: AbortSignal.timeout(4000),
+  });
+  if (!r.ok) throw new Error('http ' + r.status);
+  const text = await r.text(); // MCP replies as SSE — the JSON line is 'data: {...}'
+  for (const raw of text.split('\n')) {
+    const ln = raw.replace(/^data:\s*/, '').trim();
+    if (!ln || ln[0] !== '{') continue;
+    try { const j = JSON.parse(ln); const rows = j?.result?.structuredContent?.rows; if (Array.isArray(rows) && rows.length) return rows; } catch { /* keep scanning */ }
+  }
+  throw new Error('no rows');
+}
+
+async function collectTraffic() {
+  let q, qp, dt, source, pulledAt;
+  try {
+    [q, qp, dt] = await Promise.all([
+      mcpGsc(['query'], 'last_28_days', 1000),
+      mcpGsc(['query', 'page'], 'last_28_days', 1000),
+      mcpGsc(['date'], 'last_6_months', 200),
+    ]);
+    source = 'live-openseo'; pulledAt = new Date().toISOString();
+  } catch (liveErr) {
+    try { // fall back to the real cached dw-seo-report pull for the same property
+      const rd = f => JSON.parse(readFileSync(join(SEO_CACHE, f), 'utf8')).rows || [];
+      q = rd('q.json'); qp = rd('qp.json'); dt = rd('date.json');
+      if (!q.length) throw new Error('cache empty');
+      source = 'cached-dw-seo-report';
+      pulledAt = statSync(join(SEO_CACHE, 'q.json')).mtime.toISOString();
+    } catch (cacheErr) {
+      return { available: false, source: 'unavailable', property: GSC_PROPERTY,
+        note: `GSC unavailable at collection time (live: ${String(liveErr.message).slice(0, 60)}; cache: ${String(cacheErr.message).slice(0, 60)})`,
+        ga4: GA4_NULL };
+    }
+  }
+  const sum = (a, f) => a.reduce((s, r) => s + f(r), 0);
+  const clicks = sum(q, r => r.clicks), impressions = sum(q, r => r.impressions);
+  const wpos = impressions ? sum(q, r => r.position * r.impressions) / impressions : 0;
+  const BR = /designer\s*wallcovering|designerwallcovering/i; // brand-term match
+  const brandedClicks = sum(q.filter(r => BR.test(r.keys[0])), r => r.clicks);
+  const topQueries = [...q].sort((a, b) => b.clicks - a.clicks).slice(0, 12)
+    .map(r => ({ query: r.keys[0], clicks: r.clicks, impressions: r.impressions, ctr: r.ctr, position: r.position }));
+  // Striking distance = page-2 rank (pos 8–20) with real demand (≥100 impr): one push from page 1
+  const striking = q.filter(r => r.position >= 8 && r.position <= 20 && r.impressions >= 100)
+    .sort((a, b) => b.impressions - a.impressions).slice(0, 10)
+    .map(r => ({ query: r.keys[0], impressions: r.impressions, clicks: r.clicks, position: r.position }));
+  const pg = {};
+  qp.forEach(r => { const p = r.keys[1] || ''; (pg[p] ??= { clicks: 0, impressions: 0 }); pg[p].clicks += r.clicks; pg[p].impressions += r.impressions; });
+  const topPages = Object.entries(pg).sort((a, b) => b[1].clicks - a[1].clicks).slice(0, 10)
+    .map(([url, v]) => ({ path: url.replace(/^https?:\/\/[^/]+/, '') || '/', clicks: v.clicks, impressions: v.impressions }));
+  const mo = {};
+  dt.forEach(r => { const m = r.keys[0].slice(0, 7); (mo[m] ??= { clicks: 0, impressions: 0 }); mo[m].clicks += r.clicks; mo[m].impressions += r.impressions; });
+  const monthly = Object.entries(mo).sort((a, b) => a[0].localeCompare(b[0]))
+    .map(([ym, v]) => ({ ym, month: new Date(ym + '-01T00:00:00Z').toLocaleString('en-US', { month: 'short', timeZone: 'UTC' }), clicks: v.clicks, impressions: v.impressions }));
+  const lastDate = dt.length ? dt[dt.length - 1].keys[0] : null;
+  const ageDays = (Date.now() - new Date(pulledAt).getTime()) / 86400000;
+  return {
+    available: true, source, property: GSC_PROPERTY, pulled_at: pulledAt,
+    stale: ageDays > 7, age_days: Math.round(ageDays), window: 'last 28 days', last_data_date: lastDate,
+    totals_28d: { clicks, impressions, ctr: impressions ? clicks / impressions : 0, avg_position: wpos },
+    branded_split: { branded_clicks: brandedClicks, nonbranded_clicks: clicks - brandedClicks, branded_pct: clicks ? brandedClicks / clicks : 0 },
+    top_queries: topQueries, striking_distance: striking, top_pages: topPages, monthly_trend: monthly,
+    ga4: GA4_NULL,
+    note: source === 'cached-dw-seo-report'
+      ? 'Real first-party GSC — cached from the OpenSEO pull the dw-seo-report project holds for this property (OpenSEO not reachable live at collection time).'
+      : 'Live first-party GSC via the OpenSEO MCP at collection time.',
+  };
+}
+const traffic = await collectTraffic();
+
 const snapshot = {
   collected_at: new Date().toISOString(),
   sources: {
@@ -155,6 +245,7 @@ const snapshot = {
     mcc: mcc?._error || mcc?._status ? `unreachable (${mcc._error || mcc._status})` : 'marketing.designerwallcoverings.com/api/channels/status',
     fleet: microsites?._error || microsites?._status ? `unreachable (${microsites._error || microsites._status})` : 'all.designerwallcoverings.com/api/microsites',
     storefront: storefront?._error || storefront?._status ? `probe ${storefront._error || storefront._status}` : 'live products.json OK',
+    traffic: traffic.available ? `${traffic.source} (GSC ${GSC_PROPERTY})` : (traffic.source || 'unavailable'),
   },
   catalog: {
     statuses, vendors_active: +vendors || 0, top_vendors: topVendors, types,
@@ -168,6 +259,7 @@ const snapshot = {
   fleet: { count: fleet.length, sites: fleet.slice(0, 60) },
   competitors,
   gallery,
+  traffic,
   storefront_live: !(storefront?._error) && storefront?._status !== 404,
 };
 
@@ -188,4 +280,5 @@ console.log(JSON.stringify({
   active: fiveField.active_total, vendors: snapshot.catalog.vendors_active,
   channels: channels.length, fleet_sites: fleet.length, competitors: competitors.length,
   mcc_ok: !mcc?._error && !mcc?._status, fleet_ok: !microsites?._error && !microsites?._status,
+  traffic: traffic.available ? `${traffic.source}: ${traffic.totals_28d.clicks} clicks/28d (${traffic.stale ? 'stale ' + traffic.age_days + 'd' : 'fresh'})` : 'unavailable',
 }, null, 2));

← 9b9d09a graphic-designer advisory pass: chart typography/gridlines,  ·  back to Consulting Designerwallcoverings Com  ·  Unlikely Revenue: quantify sample→roll funnel (Pool 2) from 26ca9ee →