[object Object]

← back to Dw Unbuyable Recovery Pilot

TK-11252: add sellable Single Roll variants to 18 unbuyable Hollywood products

109df2d37f6cd3b1c50a16d646d26c1ff04e2e34 · 2026-09-04 11:30:14 -0700 · Steve

18 ACTIVE Hollywood Wallcoverings products had only a $4.25 sample variant and
could not be bought. Price sourced per-product from its own pattern's live
sellable siblings (8-36 identically-priced siblings each). Canary-first, then 17.
Verified 18/18 live. Undo script + created.json variant ids included.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011rLMRd91EREgUHbEMQDNiy

Files touched

Diff

commit 109df2d37f6cd3b1c50a16d646d26c1ff04e2e34
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Sep 4 11:30:14 2026 -0700

    TK-11252: add sellable Single Roll variants to 18 unbuyable Hollywood products
    
    18 ACTIVE Hollywood Wallcoverings products had only a $4.25 sample variant and
    could not be bought. Price sourced per-product from its own pattern's live
    sellable siblings (8-36 identically-priced siblings each). Canary-first, then 17.
    Verified 18/18 live. Undo script + created.json variant ids included.
    
    Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_011rLMRd91EREgUHbEMQDNiy
---
 tk11252-hollywood/add-roll-variants.mjs    |  47 +++++++++++
 tk11252-hollywood/canary.tsv               |   1 +
 tk11252-hollywood/created-canary.json      |   9 ++
 tk11252-hollywood/created.json             | 128 +++++++++++++++++++++++++++++
 tk11252-hollywood/targets-rest.tsv         |  17 ++++
 tk11252-hollywood/targets.tsv              |  18 ++++
 tk11252-hollywood/undo-remove-variants.mjs |  18 ++++
 7 files changed, 238 insertions(+)

diff --git a/tk11252-hollywood/add-roll-variants.mjs b/tk11252-hollywood/add-roll-variants.mjs
new file mode 100644
index 0000000..062432a
--- /dev/null
+++ b/tk11252-hollywood/add-roll-variants.mjs
@@ -0,0 +1,47 @@
+#!/usr/bin/env node
+// TK-11252 — add a sellable "Single Roll" variant to 18 unbuyable ACTIVE Hollywood products.
+// Price sourced from the product's own pattern siblings (8-36 identically-priced live siblings each).
+// DRY RUN unless --apply. Records every created variant id to created.json for undo.
+import fs from 'node:fs';
+const TOK = fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8')
+  .split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN=')).split('=').slice(1).join('=').trim();
+const SHOP='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const APPLY = process.argv.includes('--apply');
+const gql = async (query, variables={}) => {
+  for (let a=0;a<4;a++){
+    const r = await fetch(`https://${SHOP}/admin/api/${API}/graphql.json`,{method:'POST',
+      headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},
+      body:JSON.stringify({query,variables})});
+    const t = await r.text();
+    try { const j=JSON.parse(t); if(j.errors) throw new Error(JSON.stringify(j.errors).slice(0,300)); return j; }
+    catch(e){ if(a===3) throw e; await new Promise(s=>setTimeout(s,1500*(a+1))); }
+  }
+};
+const targets = fs.readFileSync(process.argv[2]||'targets.tsv','utf8').trim().split('\n')
+  .filter(Boolean).map(l=>{const [pid,title,sku,price,optName]=l.split('\t');return {pid,title,sku,price,optName};});
+
+const M = `mutation($productId: ID!, $variants: [ProductVariantsBulkInput!]!) {
+  productVariantsBulkCreate(productId: $productId, variants: $variants) {
+    productVariants { id sku price inventoryPolicy selectedOptions { name value } }
+    userErrors { field message }
+  }
+}`;
+const created=[]; let ok=0, fail=0;
+for (const t of targets) {
+  const vars={ productId:`gid://shopify/Product/${t.pid}`,
+    variants:[{ price:String(t.price), inventoryPolicy:'CONTINUE',
+      inventoryItem:{ sku:t.sku, tracked:false },
+      optionValues:[{ name:'Single Roll', optionName:t.optName }] }] };
+  if(!APPLY){ console.log(`DRY  ${t.pid} | ${t.sku.padEnd(16)} | $${String(t.price).padStart(6)} | opt='${t.optName}' | ${t.title.slice(0,42)}`); ok++; continue; }
+  try {
+    const j = await gql(M,vars);
+    const res = j.data.productVariantsBulkCreate;
+    if(res.userErrors?.length){ console.log(`FAIL ${t.pid} | ${JSON.stringify(res.userErrors).slice(0,140)}`); fail++; }
+    else { const v=res.productVariants[0];
+      created.push({pid:t.pid,sku:t.sku,price:t.price,variant_id:v.id,title:t.title});
+      console.log(`OK   ${t.pid} | ${v.sku.padEnd(16)} | $${v.price} | ${v.inventoryPolicy} | ${v.selectedOptions.map(o=>o.name+'='+o.value).join(',')}`); ok++; }
+  } catch(e){ console.log(`FAIL ${t.pid} | ${String(e.message).slice(0,140)}`); fail++; }
+  await new Promise(s=>setTimeout(s,350));
+}
+if(APPLY) fs.writeFileSync(new URL('./created.json',import.meta.url), JSON.stringify(created,null,2));
+console.log(`\n${APPLY?'APPLIED':'DRY RUN'}: ok=${ok} fail=${fail} of ${targets.length}`);
diff --git a/tk11252-hollywood/canary.tsv b/tk11252-hollywood/canary.tsv
new file mode 100644
index 0000000..cfb8007
--- /dev/null
+++ b/tk11252-hollywood/canary.tsv
@@ -0,0 +1 @@
+7800009752627	Aries - Single Color Commercial Wallcovering | DW Commercial Surfaces	A188-722-285	26.43	Purchase Option
diff --git a/tk11252-hollywood/created-canary.json b/tk11252-hollywood/created-canary.json
new file mode 100644
index 0000000..dde7fc9
--- /dev/null
+++ b/tk11252-hollywood/created-canary.json
@@ -0,0 +1,9 @@
+[
+  {
+    "pid": "7800009752627",
+    "sku": "A188-722-285",
+    "price": "26.43",
+    "variant_id": "gid://shopify/ProductVariant/44820507492403",
+    "title": "Aries - Single Color Commercial Wallcovering | DW Commercial Surfaces"
+  }
+]
\ No newline at end of file
diff --git a/tk11252-hollywood/created.json b/tk11252-hollywood/created.json
new file mode 100644
index 0000000..f86abd7
--- /dev/null
+++ b/tk11252-hollywood/created.json
@@ -0,0 +1,128 @@
+[
+  {
+    "pid": "7800009752627",
+    "sku": "A188-722-285",
+    "price": "26.43",
+    "variant_id": "gid://shopify/ProductVariant/44820507492403",
+    "title": "Aries - Single Color Commercial Wallcovering | DW Commercial Surfaces"
+  },
+  {
+    "pid": "7800243454003",
+    "sku": "A201-706-297",
+    "price": "63.86",
+    "variant_id": "gid://shopify/ProductVariant/44820508082227",
+    "title": "Akasha - Eris Mylar Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800003952691",
+    "sku": "A176-762",
+    "price": "66.90",
+    "variant_id": "gid://shopify/ProductVariant/44820508147763",
+    "title": "Alley Cat - Cougar Mylar Wallcovering"
+  },
+  {
+    "pid": "7800003723315",
+    "sku": "A176-054",
+    "price": "66.90",
+    "variant_id": "gid://shopify/ProductVariant/44820508180531",
+    "title": "Alley Cat - Downtown Mylar Wallcovering"
+  },
+  {
+    "pid": "7800007360563",
+    "sku": "A185-336-283",
+    "price": "46.19",
+    "variant_id": "gid://shopify/ProductVariant/44820508213299",
+    "title": "Balliano - Indigo Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800006934579",
+    "sku": "A184-592-282",
+    "price": "46.19",
+    "variant_id": "gid://shopify/ProductVariant/44820508311603",
+    "title": "Balliano Texture - Chennai Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800019484723",
+    "sku": "A194-100",
+    "price": "55.24",
+    "variant_id": "gid://shopify/ProductVariant/44820508409907",
+    "title": "Caba - Iced Cappuccino Wallcovering"
+  },
+  {
+    "pid": "7800001953843",
+    "sku": "A167-865-271",
+    "price": "48.22",
+    "variant_id": "gid://shopify/ProductVariant/44820508475443",
+    "title": "Flint Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800256364595",
+    "sku": "A213-879-309",
+    "price": "49.95",
+    "variant_id": "gid://shopify/ProductVariant/44820508508211",
+    "title": "Isla Grass - Nocturnal Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800005591091",
+    "sku": "A181-777-280",
+    "price": "58.43",
+    "variant_id": "gid://shopify/ProductVariant/44820508606515",
+    "title": "Mandolin - Deep Space Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800007786547",
+    "sku": "A187",
+    "price": "47.78",
+    "variant_id": "gid://shopify/ProductVariant/44820508704819",
+    "title": "Matka - Single Color Commercial Wallcovering | DW Commercial Surfaces"
+  },
+  {
+    "pid": "7800260198451",
+    "sku": "A218-810-314",
+    "price": "50.46",
+    "variant_id": "gid://shopify/ProductVariant/44820508737587",
+    "title": "Orsay - Boulevard Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800251285555",
+    "sku": "A208-890-304",
+    "price": "52.71",
+    "variant_id": "gid://shopify/ProductVariant/44820508770355",
+    "title": "Patina Blocks - Obsidian Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800000249907",
+    "sku": "A162-896-268",
+    "price": "45.47",
+    "variant_id": "gid://shopify/ProductVariant/44820508901427",
+    "title": "Ravelle - Fossil Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800000380979",
+    "sku": "A163-164-269",
+    "price": "48.14",
+    "variant_id": "gid://shopify/ProductVariant/44820508966963",
+    "title": "Ravelle Texture - Stucco Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800258035763",
+    "sku": "A215-896-311",
+    "price": "54.59",
+    "variant_id": "gid://shopify/ProductVariant/44820509065267",
+    "title": "Secret Garden - Overcast Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800249417779",
+    "sku": "A207-501-303",
+    "price": "52.71",
+    "variant_id": "gid://shopify/ProductVariant/44820509130803",
+    "title": "Sterling Heights - Sun Ray Type II Vinyl Wallcovering"
+  },
+  {
+    "pid": "7800261378099",
+    "sku": "A219-847-315",
+    "price": "53.14",
+    "variant_id": "gid://shopify/ProductVariant/44820509163571",
+    "title": "Zenith - Solstice Type II Vinyl Wallcovering"
+  }
+]
\ No newline at end of file
diff --git a/tk11252-hollywood/targets-rest.tsv b/tk11252-hollywood/targets-rest.tsv
new file mode 100644
index 0000000..faffe62
--- /dev/null
+++ b/tk11252-hollywood/targets-rest.tsv
@@ -0,0 +1,17 @@
+7800243454003	Akasha - Eris Mylar Type II Vinyl Wallcovering	A201-706-297	63.86	Purchase Option
+7800003952691	Alley Cat - Cougar Mylar Wallcovering	A176-762	66.90	Title
+7800003723315	Alley Cat - Downtown Mylar Wallcovering	A176-054	66.90	Title
+7800007360563	Balliano - Indigo Type II Vinyl Wallcovering	A185-336-283	46.19	Purchase Option
+7800006934579	Balliano Texture - Chennai Type II Vinyl Wallcovering	A184-592-282	46.19	Purchase Option
+7800019484723	Caba - Iced Cappuccino Wallcovering	A194-100	55.24	Purchase Option
+7800001953843	Flint Type II Vinyl Wallcovering	A167-865-271	48.22	Purchase Option
+7800256364595	Isla Grass - Nocturnal Type II Vinyl Wallcovering	A213-879-309	49.95	Purchase Option
+7800005591091	Mandolin - Deep Space Type II Vinyl Wallcovering	A181-777-280	58.43	Purchase Option
+7800007786547	Matka - Single Color Commercial Wallcovering | DW Commercial Surfaces	A187	47.78	Purchase Option
+7800260198451	Orsay - Boulevard Type II Vinyl Wallcovering	A218-810-314	50.46	Purchase Option
+7800251285555	Patina Blocks - Obsidian Type II Vinyl Wallcovering	A208-890-304	52.71	Purchase Option
+7800000249907	Ravelle - Fossil Type II Vinyl Wallcovering	A162-896-268	45.47	Purchase Option
+7800000380979	Ravelle Texture - Stucco Type II Vinyl Wallcovering	A163-164-269	48.14	Purchase Option
+7800258035763	Secret Garden - Overcast Type II Vinyl Wallcovering	A215-896-311	54.59	Purchase Option
+7800249417779	Sterling Heights - Sun Ray Type II Vinyl Wallcovering	A207-501-303	52.71	Purchase Option
+7800261378099	Zenith - Solstice Type II Vinyl Wallcovering	A219-847-315	53.14	Purchase Option
diff --git a/tk11252-hollywood/targets.tsv b/tk11252-hollywood/targets.tsv
new file mode 100644
index 0000000..f79a386
--- /dev/null
+++ b/tk11252-hollywood/targets.tsv
@@ -0,0 +1,18 @@
+7800243454003	Akasha - Eris Mylar Type II Vinyl Wallcovering	A201-706-297	63.86	Purchase Option
+7800003952691	Alley Cat - Cougar Mylar Wallcovering	A176-762	66.90	Title
+7800003723315	Alley Cat - Downtown Mylar Wallcovering	A176-054	66.90	Title
+7800009752627	Aries - Single Color Commercial Wallcovering | DW Commercial Surfaces	A188-722-285	26.43	Purchase Option
+7800007360563	Balliano - Indigo Type II Vinyl Wallcovering	A185-336-283	46.19	Purchase Option
+7800006934579	Balliano Texture - Chennai Type II Vinyl Wallcovering	A184-592-282	46.19	Purchase Option
+7800019484723	Caba - Iced Cappuccino Wallcovering	A194-100	55.24	Purchase Option
+7800001953843	Flint Type II Vinyl Wallcovering	A167-865-271	48.22	Purchase Option
+7800256364595	Isla Grass - Nocturnal Type II Vinyl Wallcovering	A213-879-309	49.95	Purchase Option
+7800005591091	Mandolin - Deep Space Type II Vinyl Wallcovering	A181-777-280	58.43	Purchase Option
+7800007786547	Matka - Single Color Commercial Wallcovering | DW Commercial Surfaces	A187	47.78	Purchase Option
+7800260198451	Orsay - Boulevard Type II Vinyl Wallcovering	A218-810-314	50.46	Purchase Option
+7800251285555	Patina Blocks - Obsidian Type II Vinyl Wallcovering	A208-890-304	52.71	Purchase Option
+7800000249907	Ravelle - Fossil Type II Vinyl Wallcovering	A162-896-268	45.47	Purchase Option
+7800000380979	Ravelle Texture - Stucco Type II Vinyl Wallcovering	A163-164-269	48.14	Purchase Option
+7800258035763	Secret Garden - Overcast Type II Vinyl Wallcovering	A215-896-311	54.59	Purchase Option
+7800249417779	Sterling Heights - Sun Ray Type II Vinyl Wallcovering	A207-501-303	52.71	Purchase Option
+7800261378099	Zenith - Solstice Type II Vinyl Wallcovering	A219-847-315	53.14	Purchase Option
diff --git a/tk11252-hollywood/undo-remove-variants.mjs b/tk11252-hollywood/undo-remove-variants.mjs
new file mode 100644
index 0000000..f87ee82
--- /dev/null
+++ b/tk11252-hollywood/undo-remove-variants.mjs
@@ -0,0 +1,18 @@
+#!/usr/bin/env node
+// UNDO for TK-11252: delete every variant recorded in created.json.
+import fs from 'node:fs';
+const TOK = fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8')
+  .split('\n').find(l=>l.startsWith('SHOPIFY_ADMIN_TOKEN=')).split('=').slice(1).join('=').trim();
+const SHOP='designer-laboratory-sandbox.myshopify.com', API='2024-10';
+const APPLY = process.argv.includes('--apply');
+const created = JSON.parse(fs.readFileSync(new URL('./created.json',import.meta.url),'utf8'));
+const M=`mutation($productId: ID!, $variantsIds: [ID!]!){ productVariantsBulkDelete(productId:$productId, variantsIds:$variantsIds){ userErrors{field message} } }`;
+for (const c of created){
+  if(!APPLY){ console.log(`DRY delete ${c.variant_id} (${c.sku})`); continue; }
+  const r=await fetch(`https://${SHOP}/admin/api/${API}/graphql.json`,{method:'POST',
+    headers:{'X-Shopify-Access-Token':TOK,'Content-Type':'application/json'},
+    body:JSON.stringify({query:M,variables:{productId:`gid://shopify/Product/${c.pid}`,variantsIds:[c.variant_id]}})});
+  const j=await r.json();
+  console.log(`${j.data?.productVariantsBulkDelete?.userErrors?.length? 'FAIL':'OK  '} delete ${c.variant_id} (${c.sku})`);
+  await new Promise(s=>setTimeout(s,300));
+}

← 1313e2e Correct TK-11133 proof timestamp  ·  back to Dw Unbuyable Recovery Pilot  ·  auto-data-snapshot: 2026-09-04T12:10:54 (1 data files) — tk1 dc82409 →