← 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
A weight-census.mjsA weight-check.mjs
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 →