← 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
A tk11252-hollywood/add-roll-variants.mjsA tk11252-hollywood/canary.tsvA tk11252-hollywood/created-canary.jsonA tk11252-hollywood/created.jsonA tk11252-hollywood/targets-rest.tsvA tk11252-hollywood/targets.tsvA tk11252-hollywood/undo-remove-variants.mjs
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 →