[object Object]

← back to Dw Yolo Loop

empty-collections audit: 575 advertised -> ~37 live-empty + 14 single-product crawlable pages in sitemap (sitemap-fed to Googlebot, distinct from c58/c59); 33 'errors' were transient 429s

1bc3c5b081c3d006ab7ac74601b7aea16f3748cd · 2026-06-17 11:53:15 -0700 · Steve Abrams

Files touched

Diff

commit 1bc3c5b081c3d006ab7ac74601b7aea16f3748cd
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Jun 17 11:53:15 2026 -0700

    empty-collections audit: 575 advertised -> ~37 live-empty + 14 single-product crawlable pages in sitemap (sitemap-fed to Googlebot, distinct from c58/c59); 33 'errors' were transient 429s
---
 .../empty-collections-list-2026-06-17.json         | 193 +++++++++++++++++++++
 scripts/empty-collections/empty-collections.mjs    |  38 ++++
 2 files changed, 231 insertions(+)

diff --git a/scripts/empty-collections/empty-collections-list-2026-06-17.json b/scripts/empty-collections/empty-collections-list-2026-06-17.json
new file mode 100644
index 0000000..3837bc7
--- /dev/null
+++ b/scripts/empty-collections/empty-collections-list-2026-06-17.json
@@ -0,0 +1,193 @@
+{
+  "ts": "2026-06-17T18:51:17.927Z",
+  "advertised": 575,
+  "empty": [
+    "nicolette-mayer-designs",
+    "ralph-lauren-fabrics",
+    "kravet-bascis",
+    "china-seas-fabrics",
+    "carlisle-and-company-wallcoverings",
+    "even-more-textures",
+    "fentucci-fabrics",
+    "phillipe-romano-barclay-living-in-style",
+    "phillipe-romano-barclay-butera-distinctive-walls",
+    "phillipe-romano-natural-textiles",
+    "phillipe-romano-thom-filicia-vinyls",
+    "phillipe-romano-island-weaves",
+    "phillipe-romano-natural-resouces-vol-1",
+    "phillipe-romano-classic-elegance",
+    "phillipe-romano-simply-sisal",
+    "phillipe-romano-the-keys",
+    "phillipe-romano-taniya-nayak",
+    "phillipe-romano-barclay-butera-plains",
+    "phillipe-romano-metallic-textures",
+    "phillipe-romano-oriental-classics",
+    "phillipe-romano-serenity",
+    "phillipe-romano-showhouse",
+    "phillipe-romano-specialty-effects",
+    "phillipe-romano-elegant-silks",
+    "kravet-contract-1",
+    "crypton",
+    "coordonne-collection-european-wallpaper",
+    "paul-montgomery-murals",
+    "paul-montgomery-all-products",
+    "colefax-and-fowler",
+    "martyn-lawrence-bullard",
+    "phillipe-romano-outdoor-1",
+    "carlisle-co",
+    "colefax-fowler",
+    "nicolette-mayer",
+    "hermes",
+    "hinson"
+  ],
+  "small": [
+    "surface-stick-3m-self-adhesive",
+    "phillipe-romano-asian-essence",
+    "malibu-walls-1",
+    "catchii-european-wallpaper",
+    "mark-alexander",
+    "armani-casa-wallcoverings",
+    "surface-stick",
+    "catchii",
+    "emiliana-parati-wallcoverings",
+    "farrow-ball-wallcoverings",
+    "milton-and-king",
+    "tables",
+    "dedar",
+    "dedar-wallcovering"
+  ],
+  "errs": [
+    {
+      "h": "commercial-styles",
+      "status": 0
+    },
+    {
+      "h": "barclay-butera-collection-1",
+      "status": 503
+    },
+    {
+      "h": "candice-olson-collection-1",
+      "status": 503
+    },
+    {
+      "h": "baker-lifestyle",
+      "status": 503
+    },
+    {
+      "h": "kravet",
+      "status": 503
+    },
+    {
+      "h": "threads",
+      "status": 503
+    },
+    {
+      "h": "fornasetti",
+      "status": 503
+    },
+    {
+      "h": "botanicals-and-florals",
+      "status": 503
+    },
+    {
+      "h": "drapery-fabrics",
+      "status": 503
+    },
+    {
+      "h": "durable-w-c",
+      "status": 503
+    },
+    {
+      "h": "beige-cream-wallpaper-collection",
+      "status": 503
+    },
+    {
+      "h": "white-wallpaper-collection",
+      "status": 503
+    },
+    {
+      "h": "sarah-rowland-wallpaper-collection",
+      "status": 503
+    },
+    {
+      "h": "grasscloth-wallpaper-collection",
+      "status": 503
+    },
+    {
+      "h": "borastapeter",
+      "status": 503
+    },
+    {
+      "h": "arte-international",
+      "status": 503
+    },
+    {
+      "h": "harlequin",
+      "status": 503
+    },
+    {
+      "h": "holly-hunt",
+      "status": 503
+    },
+    {
+      "h": "laura-ashley",
+      "status": 503
+    },
+    {
+      "h": "malibu-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "mind-the-gap-1",
+      "status": 503
+    },
+    {
+      "h": "missoni",
+      "status": 503
+    },
+    {
+      "h": "nina-campbell",
+      "status": 503
+    },
+    {
+      "h": "phillipe-romano-1",
+      "status": 503
+    },
+    {
+      "h": "romo",
+      "status": 503
+    },
+    {
+      "h": "ultrasuede-1",
+      "status": 503
+    },
+    {
+      "h": "william-morris-1",
+      "status": 503
+    },
+    {
+      "h": "transitional-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "textured-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "ikat-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "paisley-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "victorian-wallpaper",
+      "status": 503
+    },
+    {
+      "h": "neoclassical-wallpaper",
+      "status": 503
+    }
+  ]
+}
\ No newline at end of file
diff --git a/scripts/empty-collections/empty-collections.mjs b/scripts/empty-collections/empty-collections.mjs
new file mode 100644
index 0000000..a1c7167
--- /dev/null
+++ b/scripts/empty-collections/empty-collections.mjs
@@ -0,0 +1,38 @@
+// empty-collections — READ-ONLY, $0. Officer-recommended (c59). Does the collections
+// sitemap advertise LIVE collection URLs that render 0 products? Those are thin /
+// soft-404-adjacent pages — and UNLIKE the c59 product case, collection URLs ARE in
+// the sitemap, so they ARE actively submitted to Googlebot. VERIFY LIVE via the
+// storefront /collections/<h>/products.json (reflects published products a shopper
+// sees) — NOT the stale mirror collections_count (proven unreliable, c40).
+const WWW='https://www.designerwallcoverings.com';
+const sleep=ms=>new Promise(r=>setTimeout(r,ms));
+async function get(u){for(let a=0;a<4;a++){try{const r=await fetch(u);if(r.status===429){await sleep(1200*(a+1));continue;}return {status:r.status,text:await r.text()};}catch(e){await sleep(800*(a+1));}}return {status:0,text:''};}
+
+console.log('=== empty-collections (READ-ONLY, $0) ===\n');
+const sm=await get(`${WWW}/sitemap_collections_1.xml?from=79864463472&to=301565804595`);
+// real collection locs only (exclude nested image:loc .jpg entries)
+const handles=[...new Set([...sm.text.matchAll(/<loc>https:\/\/[^<]*\/collections\/([^<\/?]+)<\/loc>/g)].map(m=>m[1]))];
+console.log(`collections advertised in sitemap: ${handles.length}\n`);
+
+const empty=[], small=[], errs=[];
+let done=0;
+for(const h of handles){
+  // limit=2 so we can distinguish 0 / 1 / 2+ cheaply
+  const r=await get(`${WWW}/collections/${h}/products.json?limit=2`);
+  if(r.status!==200){ errs.push({h,status:r.status}); done++; continue; }
+  let n=0; try{ n=(JSON.parse(r.text).products||[]).length; }catch{ errs.push({h,status:'parse'}); done++; continue; }
+  if(n===0) empty.push(h);
+  else if(n===1) small.push(h);
+  done++;
+  if(done%100===0) console.log(`  ${done}/${handles.length} probed (empty so far: ${empty.length})`);
+  await sleep(120);
+}
+console.log(`\nprobed ${done}/${handles.length}`);
+console.log(`EMPTY (0 products via products.json): ${empty.length}`);
+console.log(`single-product (1): ${small.length}`);
+console.log(`fetch/parse errors: ${errs.length}`);
+if(empty.length){ console.log('\nsample empty collections:'); empty.slice(0,25).forEach(h=>console.log('  - '+h)); }
+
+import fs from 'fs';
+fs.writeFileSync('/tmp/empty-collections.json',JSON.stringify({ts:new Date().toISOString(),advertised:handles.length,empty,small,errs},null,2));
+console.log('\nwrote /tmp/empty-collections.json (full list for live verification)');

← 540c991 sitemap-health audit: robots+sitemap clean; 0 genuine dead U  ·  back to Dw Yolo Loop  ·  jsonld-audit: Product JSON-LD structurally healthy (50/50) b 2845706 →