[object Object]

← back to Shopify Sample Shipping

Weight-band feasibility check for TK-11333: REFUTED (no store writes)

48c00bbecf708de0ecaaf7c1c8e755736fc6734e · 2026-09-09 14:47:46 -0700 · Steve Abrams

Tested whether a weight band would beat the price band. It won't: DW sells most
wallcovering by the yard (~2 lb), so ~1,007 of 1,042 sampled regular products
weigh <=3 lb -- a weight band would leak free shipping to ~97% of light products,
worse than the price band. Neither price nor weight cleanly separates samples
from products on this catalog; only the (broken) dedicated profile does.
Confirms the price-band + accepted-GAP2 decision is the right cheap call.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QiMydL4hVbmto91Ty7tRss

Files touched

Diff

commit 48c00bbecf708de0ecaaf7c1c8e755736fc6734e
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Wed Sep 9 14:47:46 2026 -0700

    Weight-band feasibility check for TK-11333: REFUTED (no store writes)
    
    Tested whether a weight band would beat the price band. It won't: DW sells most
    wallcovering by the yard (~2 lb), so ~1,007 of 1,042 sampled regular products
    weigh <=3 lb -- a weight band would leak free shipping to ~97% of light products,
    worse than the price band. Neither price nor weight cleanly separates samples
    from products on this catalog; only the (broken) dedicated profile does.
    Confirms the price-band + accepted-GAP2 decision is the right cheap call.
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01QiMydL4hVbmto91Ty7tRss
---
 weight-census.mjs | 30 ++++++++++++++++++++++++++++++
 weight-check.mjs  | 13 +++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/weight-census.mjs b/weight-census.mjs
new file mode 100644
index 0000000..f94d099
--- /dev/null
+++ b/weight-census.mjs
@@ -0,0 +1,30 @@
+import {query} from './query.mjs';
+// Bounded census: sample active products, split variants into Sample vs non-Sample, characterize weights.
+let cursor=null, pages=0;
+const buckets={ sample:{n:0,w0:0,wLE3:0,wGT3:0,min:1e9,max:0}, regular:{n:0,w0:0,wLE3:0,wGT3:0,min:1e9,max:0} };
+const lightRegularExamples=[];
+const q=`query($c:String){products(first:120,after:$c,query:"status:active"){pageInfo{hasNextPage endCursor} nodes{title variants(first:15){nodes{title price inventoryItem{measurement{weight{value unit}}}}}}}}`;
+while(pages<9){ // up to ~1080 products as a signal
+  const d=await query(q,{c:cursor});
+  for(const p of d.products.nodes){
+    for(const v of p.variants.nodes){
+      const isSample=/sample/i.test(v.title);
+      const w=v.inventoryItem?.measurement?.weight;
+      const val=w?Number(w.value):null; // POUNDS assumed (confirmed on spot-check)
+      const b=isSample?buckets.sample:buckets.regular;
+      b.n++;
+      if(val===null||val===0){b.w0++;}
+      else{ b.min=Math.min(b.min,val); b.max=Math.max(b.max,val); if(val<=3)b.wLE3++; else b.wGT3++; }
+      if(!isSample && val!==null && val>0 && val<=3 && lightRegularExamples.length<12) lightRegularExamples.push(`${p.title.slice(0,40)} / ${v.title} = ${val}lb $${v.price}`);
+    }
+  }
+  pages++;
+  if(!d.products.pageInfo.hasNextPage) break;
+  cursor=d.products.pageInfo.endCursor;
+}
+console.log('pages scanned:',pages);
+console.log('SAMPLE variants:',JSON.stringify(buckets.sample));
+console.log('REGULAR variants:',JSON.stringify(buckets.regular));
+console.log('\nLight (<=3lb, weight>0) REGULAR examples (would leak under a 3lb band):');
+for(const e of lightRegularExamples) console.log('  '+e);
+console.log('\nNOTE: regular variants with weight=0/missing ('+buckets.regular.w0+') would ALSO leak free under a weight band — key risk to weigh.');
diff --git a/weight-check.mjs b/weight-check.mjs
new file mode 100644
index 0000000..83a195b
--- /dev/null
+++ b/weight-check.mjs
@@ -0,0 +1,13 @@
+import {query} from './query.mjs';
+const ids={
+  'sample DWPR-426312':'gid://shopify/ProductVariant/44090076954675',
+  'sample DWPN-100994':'gid://shopify/ProductVariant/44086096756787',
+  'sample DWRW-210156':'gid://shopify/ProductVariant/44044973408307',
+  'REGULAR (control)':'gid://shopify/ProductVariant/40348093055027',
+};
+const q=`query($id:ID!){productVariant(id:$id){displayName price inventoryItem{measurement{weight{value unit}}}}}`;
+for(const [label,id] of Object.entries(ids)){
+  const v=(await query(q,{id})).productVariant;
+  const w=v.inventoryItem?.measurement?.weight;
+  console.log(`${label}: $${v.price}  weight=${w?w.value+' '+w.unit:'(none set)'}  [${v.displayName}]`);
+}

← 6dc2c32 TK-11333: remove redundant Priority Sample Only $24.95 rate  ·  back to Shopify Sample Shipping  ·  5x: 3 clean sweeps verifying TK-11333 live shipping invarian 68cba17 →