[object Object]

← back to Designer Wallcoverings

snapshot before restart: preserve in-flight work

51d7d0d2af7e311baedad5d7ddf8e7d90df948e4 · 2026-09-04 22:38:50 -0700 · Steve

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

Files touched

Diff

commit 51d7d0d2af7e311baedad5d7ddf8e7d90df948e4
Author: Steve <steve@designerwallcoverings.com>
Date:   Fri Sep 4 22:38:50 2026 -0700

    snapshot before restart: preserve in-flight work
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_011gbmuMHgCLDEPM4TpfAr4G
---
 DW-Programming/versa-evo-pvcfree-scraper.js       |  10 +-
 mailers/_glitter_gen.js                           | 162 +++++++++++++++++++
 mailers/cc-api/build-glitter-sparkle-campaign.js  | 134 ++++++++++++++++
 mailers/cc-api/cc-stats.js                        |  32 ++++
 mailers/cc-api/check-glitter-sparkle.js           |  24 +++
 mailers/cc-api/update-glitter-sparkle-campaign.js | 136 ++++++++++++++++
 mailers/glitter-sparkle-launch.html               | 180 ++++++++++++++++++++++
 7 files changed, 677 insertions(+), 1 deletion(-)

diff --git a/DW-Programming/versa-evo-pvcfree-scraper.js b/DW-Programming/versa-evo-pvcfree-scraper.js
index 386aa228..2e3ebb51 100644
--- a/DW-Programming/versa-evo-pvcfree-scraper.js
+++ b/DW-Programming/versa-evo-pvcfree-scraper.js
@@ -84,7 +84,15 @@ async function scrapeCollection() {
               }
               const img = link.querySelector('img');
               let imgSrc = '';
-              if (img) imgSrc = img.getAttribute('src') || img.getAttribute('data-src') || '';
+              if (img) {
+                // TK-11048 FIX: prefer the REAL lazy-loaded URL (srcset/data-src);
+                // `src` is a base64 data-URI PLACEHOLDER that must NEVER be stored
+                // (this was the original bug that filled versa_catalog with base64).
+                const srcset = img.getAttribute('srcset') || img.getAttribute('data-srcset') || '';
+                const firstSrcset = srcset.split(',')[0].trim().split(/\s+/)[0] || '';
+                imgSrc = img.getAttribute('data-src') || firstSrcset || img.getAttribute('src') || '';
+                if (/^data:|;base64,/i.test(imgSrc)) imgSrc = '';   // hard-reject data: URIs
+              }
 
               data.colorways.push({ sku, colorName, url: href, imgSrc });
             }
diff --git a/mailers/_glitter_gen.js b/mailers/_glitter_gen.js
new file mode 100644
index 00000000..2d0f4646
--- /dev/null
+++ b/mailers/_glitter_gen.js
@@ -0,0 +1,162 @@
+'use strict';
+// Generates glitter-sparkle-launch.html — 12 products as UNIFORM CIRCLES,
+// reusing the color-coordinate-launch header / BRANDS tabs / SHOP BY CATEGORY /
+// CAN-SPAM footer verbatim. All visible copy + alt use "Wallcovering" (never
+// "Wallpaper") to pass the cc-client build validator.
+const fs = require('fs');
+const path = require('path');
+const UTM = 'utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09';
+const P = (h) => `https://www.designerwallcoverings.com/products/${h}?${UTM}`;
+const C = (s) => `https://www.designerwallcoverings.com/collections/${s}?${UTM}`;
+const IMG = (u) => `${u}?width=320&height=320&crop=center`;
+
+// 12 SKUs — Glitter · Sequin · Metallic (Glitter Walls) + Glambeads (Glass Bead)
+const items = [
+  ['sexy-sequin-wallcovering-blue-dazzle-gls-106','https://cdn.shopify.com/s/files/1/0015/4117/7456/files/sexy-sequin-wallcovering--blue-dazzle_54cb4cb4-bf1e-4bbd-8142-fa2f1a6167c7.jpg','Sexy Sequin','Blue Dazzle'],
+  ['hollywood-sequin-wallcoverings-hsw-51507','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/c1944e5964687b1542f3dc6f8e0708ae.jpg','Hollywood Sequin','Gold'],
+  ['sting-ray-sequin-glm-53041','https://cdn.shopify.com/s/files/1/0015/4117/7456/files/sting-ray-sequin-glm-53041-clean.jpg','Sting Ray Sequin','Bronze Multi'],
+  ['hollywood-sequin-wallcoverings-hsw-51510','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/19235740651b3832a926e3473c7527c5.jpg','Hollywood Sequin','Silver'],
+  ['hollywood-sequin-wallcoverings-hsw-51505','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/b45513e11ba9868087337988e2e7a809.jpg','Hollywood Sequin','Bronze'],
+  ['sexy-sequin-wallcovering-atlantic-blue-gls-109','https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gls-1494847651952-cropped.jpg','Sexy Sequin','Atlantic Blue'],
+  ['leopard-glitter-wallcovering-silver-blue','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_04592.heic','Leopard Glitter','Silver Blue'],
+  ['leopard-glitter-wallcovering-silver-green','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_0461.heic','Leopard Glitter','Silver Green'],
+  ['leopard-glitter-wallcovering-silver-pink','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_0462.heic','Leopard Glitter','Silver Pink'],
+  ['gleaming-glambeads-silver-and-cream-glass-bead-wallpaper','https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gleaming-glambeads-silver-and-cream-glass-bead-wallpaper-14768314122291.jpg','Gleaming Glambeads','Silver & Cream'],
+  ['copy-of-glambeads-glass-bead-stripe-wallpaper-cool-black-metallic','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/ScreenShot2022-03-29at1.50.40PM.png','Glambeads Glass Bead Stripe','Cool Black'],
+  ['glambeads-solid-black-glass-bead-wallpaper-gbs-19014','https://cdn.shopify.com/s/files/1/0015/4117/7456/products/TTN-0714_Item.jpg','Glambeads Solid','Black'],
+];
+
+function circle(it){
+  const [h,img,name,color] = it;
+  return `<td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="${P(h)}" target="_blank" style="text-decoration:none;">
+    <img src="${IMG(img)}" alt="${name} ${color} glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">${name}</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">${color}</p>
+  </a>
+</td>`;
+}
+
+let grid = '';
+for (let i=0;i<items.length;i+=3){
+  grid += `      <tr>\n        ${circle(items[i])}\n        ${circle(items[i+1])}\n        ${circle(items[i+2])}\n      </tr>\n`;
+}
+
+const pill = (label,href,bg) => `<a href="${href}" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:${bg};border:1px solid ${bg};border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">${label}</a>`;
+
+// BRAND tabs (verbatim set from color-coordinate-launch, utm re-pointed)
+const BRANDS = [
+  ['Pierre Frey','https://www.designerwallcoverings.com/search?q=Pierre%20Frey&type=product&'+UTM],
+  ['Phillipe Romano', C('phillipe-romano')],
+  ['Rebel Walls', C('rebel-walls')],
+  ['Thibaut','https://www.designerwallcoverings.com/search?q=Thibaut&type=product&'+UTM],
+  ['Fentucci Naturals', C('fentucci-naturals')],
+  ['Vahallan', C('vahallan')],
+  ['Maharam','https://www.designerwallcoverings.com/search?q=Maharam&type=product&'+UTM],
+  ['CMO Paris','https://www.designerwallcoverings.com/search?q=CMO%20Paris&type=product&'+UTM],
+  ['Designtex','https://www.designerwallcoverings.com/search?q=Designtex&type=product&'+UTM],
+  ['Romo', C('romo')],
+  ['Jeffrey Stevens', C('jeffrey-stevens')],
+].map(([l,h])=>pill(l,h,'#1c1816')).join('');
+
+const CATS = [
+  ['New Arrivals', C('new-arrivals'), '#7a6030'],
+  ['Glitter Walls', C('glitter-walls'), '#1c1816'],
+  ['Glambeads', C('glass-bead'), '#1c1816'],
+  ['Metallics', C('mica'), '#1c1816'],
+  ['Murals', C('murals'), '#1c1816'],
+  ['Shop by Color','https://www.designerwallcoverings.com/pages/shop-by-color?'+UTM, '#1c1816'],
+].map(([l,h,bg])=>pill(l,h,bg)).join('');
+
+const html = `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Sparkle &amp; Shine — Glitter, Sequin, Metallic &amp; Glass-Bead Wallcoverings</title>
+<style type="text/css">
+  body,table,td,p,a{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+  body{margin:0!important;padding:0!important;width:100%!important;background:#f4f1ec;font-family:Georgia,'Times New Roman',serif;color:#2a2724;}
+  table{border-collapse:collapse!important;} img{border:0;outline:none;text-decoration:none;display:block;-ms-interpolation-mode:bicubic;}
+  a{color:#1a1a1a;text-decoration:none;}
+  @media only screen and (max-width:620px){ .stack{display:block!important;width:100%!important;} }
+</style></head>
+<body style="margin:0;padding:0;background:#f4f1ec;">
+<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:#f4f1ec;">
+<tr><td align="center" style="padding:20px 0;">
+  <table role="presentation" width="620" cellspacing="0" cellpadding="0" border="0" style="max-width:620px;background:#ffffff;">
+
+    <!-- LOGO -->
+    <tr><td align="center" style="padding:28px 0 14px;border-bottom:1px solid #e8e2d6;">
+      <a href="https://www.designerwallcoverings.com/?${UTM}" target="_blank" style="text-decoration:none;color:#1a1a1a;">
+        <div style="font-family:Georgia,serif;font-size:28px;letter-spacing:6px;color:#1a1a1a;text-transform:uppercase;">Designer Wallcoverings</div>
+        <div style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:4px;color:#8d8478;margin-top:4px;text-transform:uppercase;">est. 2003 &middot; to the trade</div>
+      </a>
+    </td></tr>
+
+    <!-- ANNOUNCE -->
+    <tr><td align="center" style="padding:34px 36px 6px;">
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;color:#7a6030;margin:0;">New &middot; The Sparkle Collections</p>
+      <p style="font-family:Georgia,serif;font-size:30px;line-height:36px;letter-spacing:1px;color:#1a1a1a;margin:14px 0 0;">Sparkle &amp; Shine</p>
+      <p style="font-family:Georgia,serif;font-size:15px;line-height:23px;color:#5a544c;margin:16px 24px 0;max-width:470px;">
+        Glitter, sequin &amp; hand-set glass bead &mdash; three ways to make a wall catch the light. A dozen looks, below. Order any as a <strong style="color:#7a6030;">$4.25 sample</strong>.
+      </p>
+    </td></tr>
+
+    <!-- PRIMARY CTAs -->
+    <tr><td align="center" style="padding:22px 36px 8px;">
+      <a href="${C('glitter-walls')}" target="_blank" style="display:inline-block;margin:5px;padding:13px 30px;background:transparent;color:#1a1a1a !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1a1a1a;">Shop Glitter Walls</a>
+      <a href="${C('glass-bead')}" target="_blank" style="display:inline-block;margin:5px;padding:13px 30px;background:transparent;color:#1a1a1a !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1a1a1a;">Shop Glambeads</a>
+    </td></tr>
+
+    <!-- 12 UNIFORM CIRCLES -->
+    <tr><td align="center" style="padding:26px 24px 4px;">
+      <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
+${grid}      </table>
+    </td></tr>
+
+    <!-- CLOSING CTA -->
+    <tr><td align="center" style="padding:14px 36px 6px;">
+      <a href="${C('glitter-walls')}" target="_blank" style="display:inline-block;padding:13px 34px;background:#1c1816;color:#ffffff !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1c1816;">See Every Sparkle Pattern</a>
+      <p style="font-family:Georgia,serif;font-style:italic;font-size:13px;color:#8d8478;margin:14px 0 0;">Sold to the trade &mdash; swatches ship the same week.</p>
+    </td></tr>
+
+    <!-- BRANDS -->
+    <tr><td align="center" style="padding:8px 18px 4px;background:#ffffff;border-top:1px solid #e8e2d6;">
+      <div style="font-family:Helvetica,Arial,sans-serif;font-size:10px;letter-spacing:3px;text-transform:uppercase;color:#8d8478;margin:26px 0 16px;">Shop by House</div>
+      ${BRANDS}
+    </td></tr>
+
+    <!-- SHOP BY CATEGORY -->
+    <tr><td align="center" style="padding:14px 18px 34px;background:#ffffff;">
+      <div style="font-family:Helvetica,Arial,sans-serif;font-size:10px;letter-spacing:3px;text-transform:uppercase;color:#8d8478;margin:14px 0 16px;">Shop by Category</div>
+      ${CATS}
+    </td></tr>
+
+    <!-- WORDMARK -->
+    <tr><td align="center" style="padding:40px 24px 28px;border-top:1px solid #e8e2d6;">
+      <a href="https://www.designerwallcoverings.com/?${UTM}" target="_blank" style="text-decoration:none;">
+        <div style="font-family:Georgia,serif;font-size:20px;letter-spacing:5px;color:#1a1a1a;text-transform:uppercase;">Designer Wallcoverings</div>
+        <div style="font-family:Georgia,serif;font-style:italic;font-size:12px;color:#8d8478;margin-top:8px;">To the trade &mdash; Los Angeles, since 2003</div>
+      </a>
+    </td></tr>
+
+    <!-- FOOTER -->
+    <tr><td align="center" style="padding:32px 36px;background:#f4f1ec;border-top:1px solid #e8e2d6;">
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:11px;line-height:18px;color:#8d8478;margin:0 0 8px;">
+        <strong style="color:#5a544c;letter-spacing:1px;">DESIGNER WALLCOVERINGS</strong><br>
+        15442 Ventura Bl &middot; Sherman Oaks, CA 91403 &middot; 1-888-373-4564<br>
+        info@designerwallcoverings.com &middot; designerwallcoverings.com
+      </p>
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:10px;line-height:16px;color:#8d8478;margin:16px 0 0;">
+        You&rsquo;re receiving this email because you&rsquo;ve shopped or registered with Designer Wallcoverings.<br>
+        Unsubscribe and preference links appear below (added automatically by Constant Contact).
+      </p>
+    </td></tr>
+
+  </table>
+</td></tr></table>
+</body></html>`;
+
+const OUT = path.join(__dirname, 'glitter-sparkle-launch.html');
+fs.writeFileSync(OUT, html);
+console.log('wrote', OUT, html.length, 'bytes,', items.length, 'circles');
diff --git a/mailers/cc-api/build-glitter-sparkle-campaign.js b/mailers/cc-api/build-glitter-sparkle-campaign.js
new file mode 100644
index 00000000..9cdecc4d
--- /dev/null
+++ b/mailers/cc-api/build-glitter-sparkle-campaign.js
@@ -0,0 +1,134 @@
+'use strict';
+
+/**
+ * build-hollywood-campaign.js — Designer Wallcoverings
+ * A DUPLICATE of build-pr-naturals-campaign.js (same validation + create path),
+ * pointed at ../hollywood-launch.html. Promotes this week's storewide New Arrivals.
+ *
+ *   --dry-run (DEFAULT): prints payload + validation checklist. NO network.
+ *   --confirm          : creates the DRAFT campaign — STILL double-gated by
+ *                        CC_LIVE === '1' inside cc-client. Creating a DRAFT
+ *                        does NOT send; scheduling/sending is a separate gate.
+ */
+
+const fs = require('fs');
+const path = require('path');
+const cc = require('./cc-client');
+
+const MAILER = path.join(__dirname, '..', 'glitter-sparkle-launch.html');
+
+const argv = process.argv.slice(2);
+const CONFIRM = argv.includes('--confirm');
+const DRY_RUN = argv.includes('--dry-run') || !CONFIRM; // default dry-run
+
+const CAMPAIGN = {
+  name: `Sparkle & Shine — Glitter · Sequin · Metallic · Glass Bead — ${new Date().toISOString().slice(0, 10)}`,
+  subject: 'New: Sparkle & Shine — glitter, sequin, metallic & glass-bead finishes',
+  preheader: 'Four ways to make a wall catch the light: Hollywood Glamour glitter & sequin, Sharon metallic weave, and hand-set Glambeads glass bead. A look from each — order any as a swatch.',
+  fromName: 'Designer Wallcoverings',
+  fromEmail: 'steve@designerwallcoverings.com',
+  replyTo: 'steve@designerwallcoverings.com',
+  physicalAddress: {
+    address_line1: '15442 Ventura Bl',
+    city: 'Sherman Oaks',
+    state_code: 'CA',
+    postal_code: '91403',
+    country_code: 'US',
+  },
+};
+
+const PLACEHOLDER_ADDRESS_MARKER = '15442 Ventura Boulevard #102';
+
+function loadHtml() {
+  if (!fs.existsSync(MAILER)) throw new Error(`mailer not found: ${MAILER}`);
+  return fs.readFileSync(MAILER, 'utf8');
+}
+function extractImageSrcs(html) {
+  const srcs = []; const re = /<img\b[^>]*?\bsrc\s*=\s*(["'])(.*?)\1/gi; let m;
+  while ((m = re.exec(html)) !== null) srcs.push(m[2]);
+  return srcs;
+}
+const isAbsoluteHttps = (u) => /^https:\/\//i.test(u);
+const unhostedLogoSrcs = (srcs) => srcs.filter((s) => /\/vendor-logos\//i.test(s));
+
+function visibleWallpaperHits(html) {
+  const hits = [];
+  const noComments = html.replace(/<!--[\s\S]*?-->/g, '');
+  const altRe = /\balt\s*=\s*(["'])(.*?)\1/gi; let m;
+  while ((m = altRe.exec(noComments)) !== null) if (/\bwallpapers?\b/i.test(m[2])) hits.push(`alt: "${m[2]}"`);
+  const textOnly = noComments.replace(/<[^>]+>/g, ' ');
+  for (const t of (textOnly.match(/\bwallpapers?\b/gi) || [])) hits.push(`visible text: "${t}"`);
+  return hits;
+}
+
+function runChecklist(html) {
+  const results = []; const add = (name, pass, detail) => results.push({ name, pass, detail });
+  add('subject set', !!CAMPAIGN.subject && CAMPAIGN.subject.trim().length > 0, CAMPAIGN.subject);
+  add('from name + email set', !!CAMPAIGN.fromName && !!CAMPAIGN.fromEmail && CAMPAIGN.fromEmail.includes('@'), `${CAMPAIGN.fromName} <${CAMPAIGN.fromEmail}>`);
+  add('reply-to set', !!CAMPAIGN.replyTo && CAMPAIGN.replyTo.includes('@'), CAMPAIGN.replyTo);
+  const addr = CAMPAIGN.physicalAddress || {};
+  const addrComplete = !!(addr.address_line1 && addr.city && addr.state_code && addr.postal_code && addr.country_code);
+  const addrIsPlaceholder = (addr.address_line1 || '').includes(PLACEHOLDER_ADDRESS_MARKER);
+  add('physical address complete', addrComplete, JSON.stringify(addr));
+  add('physical address non-placeholder', addrComplete && !addrIsPlaceholder, addrIsPlaceholder ? 'matches placeholder marker' : 'confirmed non-placeholder');
+  add('html content non-empty', !!html && html.length > 200, `${html.length} bytes`);
+  const bannedHits = visibleWallpaperHits(html);
+  add('no banned word "Wallpaper" (visible copy + alt)', bannedHits.length === 0, bannedHits.length ? `found:\n      - ${bannedHits.join('\n      - ')}` : 'clean (alt + visible text)');
+  const srcs = extractImageSrcs(html);
+  const nonHttps = srcs.filter((s) => !isAbsoluteHttps(s));
+  add('all image src absolute https', nonHttps.length === 0, nonHttps.length ? `${nonHttps.length}/${srcs.length} not absolute-https` : `${srcs.length}/${srcs.length} absolute-https`);
+  const unhosted = unhostedLogoSrcs(srcs);
+  add('logos hosted at public https (not the un-hosted /vendor-logos/ path)', unhosted.length === 0, unhosted.length ? `${unhosted.length} on un-hosted path` : 'all logos on a confirmed-live host');
+  return results;
+}
+
+function buildPayload(html) {
+  return {
+    name: CAMPAIGN.name,
+    email_campaign_activities: [{
+      format_type: 5,
+      from_name: CAMPAIGN.fromName,
+      from_email: CAMPAIGN.fromEmail,
+      reply_to_email: CAMPAIGN.replyTo,
+      subject: CAMPAIGN.subject,
+      preheader: CAMPAIGN.preheader,
+      html_content: html,
+      physical_address_in_footer: CAMPAIGN.physicalAddress,
+    }],
+  };
+}
+
+async function main() {
+  const html = loadHtml();
+  console.log('='.repeat(72));
+  console.log('New Arrivals Weekly → Constant Contact v3 campaign builder');
+  console.log(`mode: ${CONFIRM ? '--confirm' : '--dry-run (default)'}   CC_LIVE=${process.env.CC_LIVE === '1' ? '1' : '(unset)'}`);
+  console.log('='.repeat(72));
+
+  const payload = buildPayload(html);
+  const printable = JSON.parse(JSON.stringify(payload));
+  printable.email_campaign_activities[0].html_content = `<<${html.length} bytes of HTML — truncated>>\n` + html.slice(0, 300) + '\n…';
+  console.log('\n--- CREATE-CAMPAIGN PAYLOAD (html_content truncated) ---');
+  console.log(JSON.stringify(printable, null, 2));
+
+  console.log('\n--- VALIDATION CHECKLIST ---');
+  const results = runChecklist(html); let failed = 0;
+  for (const r of results) { const mark = r.pass ? 'PASS' : 'FAIL'; if (!r.pass) failed++; console.log(`  [${mark}] ${r.name}`); if (r.detail) console.log(`         ${r.detail}`); }
+  console.log(`\n  ${results.length - failed}/${results.length} checks passed, ${failed} failed.`);
+
+  if (DRY_RUN) {
+    console.log('\nDRY-RUN: no network call made. (default)');
+    process.exitCode = failed > 0 ? 2 : 0;
+    return;
+  }
+  if (failed > 0) { console.log('\nREFUSING to create: validation has FAILs.'); process.exitCode = 2; return; }
+  console.log('\n--confirm + validation clean → creating DRAFT (NO-OPs unless CC_LIVE=1):');
+  const activityId = await cc.createCustomCodeCampaign({
+    name: CAMPAIGN.name, subject: CAMPAIGN.subject, preheader: CAMPAIGN.preheader,
+    fromEmail: CAMPAIGN.fromEmail, fromName: CAMPAIGN.fromName, replyTo: CAMPAIGN.replyTo,
+    htmlContent: html, physicalAddress: CAMPAIGN.physicalAddress, confirm: true,
+  });
+  console.log('result:', activityId);
+}
+
+main().catch((e) => { console.error('[build-new-arrivals] ERROR:', e.message); process.exitCode = 1; });
diff --git a/mailers/cc-api/cc-stats.js b/mailers/cc-api/cc-stats.js
new file mode 100644
index 00000000..e7329f98
--- /dev/null
+++ b/mailers/cc-api/cc-stats.js
@@ -0,0 +1,32 @@
+'use strict';
+// Read-only: (1) confirm the campaign's real status (sent vs draft),
+// (2) find it in the email_summary list and print stats. Reuses getAccessToken.
+const cc = require('./cc-client');
+const ID = 'd772eb69-b552-4b4b-9d9b-72a302eceb60';
+const g = (u, at) => fetch(u, { headers: { Authorization: 'Bearer ' + at, Accept: 'application/json' } });
+(async () => {
+  const at = await cc.getAccessToken();
+
+  // 1) status of the activity
+  const a = await cc.getCampaignActivity(ID);
+  console.log('current_status  :', a.current_status);
+  console.log('contact_list_ids:', JSON.stringify(a.contact_list_ids || []));
+  console.log('segment_ids     :', JSON.stringify(a.segment_ids || []));
+
+  // 2) find it in the summary list (list endpoint, then match our id)
+  const r = await g('https://api.cc.email/v3/reports/summary_reports/email_summary?limit=100', at);
+  console.log('\nemail_summary HTTP', r.status);
+  if (r.ok) {
+    const j = await r.json();
+    const rows = j.bulk_email_campaign_summaries || j.results || [];
+    const mine = rows.find(x => x.campaign_activity_id === ID);
+    if (mine) {
+      const c = mine.stats || mine.unique_counts || mine;
+      console.log('FOUND — stats:', JSON.stringify(c, null, 2));
+    } else {
+      console.log(`not in the ${rows.length} recent summaries yet (report not generated — normal right after send).`);
+    }
+  } else {
+    console.log((await r.text()).slice(0, 200));
+  }
+})().catch(e => { console.error('ERROR:', e.message); process.exitCode = 1; });
diff --git a/mailers/cc-api/check-glitter-sparkle.js b/mailers/cc-api/check-glitter-sparkle.js
new file mode 100644
index 00000000..e7596678
--- /dev/null
+++ b/mailers/cc-api/check-glitter-sparkle.js
@@ -0,0 +1,24 @@
+'use strict';
+// Read-only: fetch the live campaign activity and report whether CC's STORED
+// html_content is the NEW grid (leopard glitter + hsw-51510 + gls-106) or the
+// OLD one (play-triangle glm9302 / metallics). Proves server state vs editor cache.
+const cc = require('./cc-client');
+const ID = 'd772eb69-b552-4b4b-9d9b-72a302eceb60';
+(async () => {
+  const a = await cc.getCampaignActivity(ID);
+  const html = a && a.html_content || '';
+  const has = (s) => html.includes(s);
+  console.log('current_status :', a.current_status);
+  console.log('subject        :', a.subject);
+  console.log('html bytes     :', html.length);
+  console.log('--- NEW markers (should all be true) ---');
+  console.log('leopard-glitter-silver-blue :', has('leopard-glitter-wallcovering-silver-blue'));
+  console.log('hollywood-sequin hsw-51510   :', has('hollywood-sequin-wallcoverings-hsw-51510'));
+  console.log('sexy-sequin gls-106          :', has('sexy-sequin-wallcovering-blue-dazzle-gls-106'));
+  console.log('--- OLD markers (should all be false) ---');
+  console.log('play-triangle glm9302        :', has('glitterwalls-glm9302'));
+  console.log('sharon-metallic-weave        :', has('sharon-metallic-weave'));
+  console.log('sequin-wall-paper--blue      :', has('sequin-wall-paper--blue'));
+  const ok = has('leopard-glitter-wallcovering-silver-blue') && !has('glitterwalls-glm9302');
+  console.log('\nVERDICT:', ok ? 'SERVER HAS THE NEW GRID — the editor view is just cached.' : 'SERVER STILL HAS OLD CONTENT — PUT did not stick.');
+})().catch(e => { console.error('ERROR:', e.message); process.exitCode = 1; });
diff --git a/mailers/cc-api/update-glitter-sparkle-campaign.js b/mailers/cc-api/update-glitter-sparkle-campaign.js
new file mode 100644
index 00000000..30a85862
--- /dev/null
+++ b/mailers/cc-api/update-glitter-sparkle-campaign.js
@@ -0,0 +1,136 @@
+'use strict';
+
+/**
+ * build-hollywood-campaign.js — Designer Wallcoverings
+ * A DUPLICATE of build-pr-naturals-campaign.js (same validation + create path),
+ * pointed at ../hollywood-launch.html. Promotes this week's storewide New Arrivals.
+ *
+ *   --dry-run (DEFAULT): prints payload + validation checklist. NO network.
+ *   --confirm          : creates the DRAFT campaign — STILL double-gated by
+ *                        CC_LIVE === '1' inside cc-client. Creating a DRAFT
+ *                        does NOT send; scheduling/sending is a separate gate.
+ */
+
+const fs = require('fs');
+const path = require('path');
+const cc = require('./cc-client');
+
+const MAILER = path.join(__dirname, '..', 'glitter-sparkle-launch.html');
+// Existing DRAFT created earlier this session — update in place (no 2nd draft).
+const ACTIVITY_ID = 'd772eb69-b552-4b4b-9d9b-72a302eceb60';
+
+const argv = process.argv.slice(2);
+const CONFIRM = argv.includes('--confirm');
+const DRY_RUN = argv.includes('--dry-run') || !CONFIRM; // default dry-run
+
+const CAMPAIGN = {
+  name: `Sparkle & Shine — Glitter · Sequin · Metallic · Glass Bead — ${new Date().toISOString().slice(0, 10)}`,
+  subject: 'New: Sparkle & Shine — glitter, sequin & glass-bead wallcoverings',
+  preheader: 'Three ways to make a wall catch the light: sequin, glitter, and hand-set Glambeads glass bead. A dozen looks — order any as a swatch.',
+  fromName: 'Designer Wallcoverings',
+  fromEmail: 'steve@designerwallcoverings.com',
+  replyTo: 'steve@designerwallcoverings.com',
+  physicalAddress: {
+    address_line1: '15442 Ventura Bl',
+    city: 'Sherman Oaks',
+    state_code: 'CA',
+    postal_code: '91403',
+    country_code: 'US',
+  },
+};
+
+const PLACEHOLDER_ADDRESS_MARKER = '15442 Ventura Boulevard #102';
+
+function loadHtml() {
+  if (!fs.existsSync(MAILER)) throw new Error(`mailer not found: ${MAILER}`);
+  return fs.readFileSync(MAILER, 'utf8');
+}
+function extractImageSrcs(html) {
+  const srcs = []; const re = /<img\b[^>]*?\bsrc\s*=\s*(["'])(.*?)\1/gi; let m;
+  while ((m = re.exec(html)) !== null) srcs.push(m[2]);
+  return srcs;
+}
+const isAbsoluteHttps = (u) => /^https:\/\//i.test(u);
+const unhostedLogoSrcs = (srcs) => srcs.filter((s) => /\/vendor-logos\//i.test(s));
+
+function visibleWallpaperHits(html) {
+  const hits = [];
+  const noComments = html.replace(/<!--[\s\S]*?-->/g, '');
+  const altRe = /\balt\s*=\s*(["'])(.*?)\1/gi; let m;
+  while ((m = altRe.exec(noComments)) !== null) if (/\bwallpapers?\b/i.test(m[2])) hits.push(`alt: "${m[2]}"`);
+  const textOnly = noComments.replace(/<[^>]+>/g, ' ');
+  for (const t of (textOnly.match(/\bwallpapers?\b/gi) || [])) hits.push(`visible text: "${t}"`);
+  return hits;
+}
+
+function runChecklist(html) {
+  const results = []; const add = (name, pass, detail) => results.push({ name, pass, detail });
+  add('subject set', !!CAMPAIGN.subject && CAMPAIGN.subject.trim().length > 0, CAMPAIGN.subject);
+  add('from name + email set', !!CAMPAIGN.fromName && !!CAMPAIGN.fromEmail && CAMPAIGN.fromEmail.includes('@'), `${CAMPAIGN.fromName} <${CAMPAIGN.fromEmail}>`);
+  add('reply-to set', !!CAMPAIGN.replyTo && CAMPAIGN.replyTo.includes('@'), CAMPAIGN.replyTo);
+  const addr = CAMPAIGN.physicalAddress || {};
+  const addrComplete = !!(addr.address_line1 && addr.city && addr.state_code && addr.postal_code && addr.country_code);
+  const addrIsPlaceholder = (addr.address_line1 || '').includes(PLACEHOLDER_ADDRESS_MARKER);
+  add('physical address complete', addrComplete, JSON.stringify(addr));
+  add('physical address non-placeholder', addrComplete && !addrIsPlaceholder, addrIsPlaceholder ? 'matches placeholder marker' : 'confirmed non-placeholder');
+  add('html content non-empty', !!html && html.length > 200, `${html.length} bytes`);
+  const bannedHits = visibleWallpaperHits(html);
+  add('no banned word "Wallpaper" (visible copy + alt)', bannedHits.length === 0, bannedHits.length ? `found:\n      - ${bannedHits.join('\n      - ')}` : 'clean (alt + visible text)');
+  const srcs = extractImageSrcs(html);
+  const nonHttps = srcs.filter((s) => !isAbsoluteHttps(s));
+  add('all image src absolute https', nonHttps.length === 0, nonHttps.length ? `${nonHttps.length}/${srcs.length} not absolute-https` : `${srcs.length}/${srcs.length} absolute-https`);
+  const unhosted = unhostedLogoSrcs(srcs);
+  add('logos hosted at public https (not the un-hosted /vendor-logos/ path)', unhosted.length === 0, unhosted.length ? `${unhosted.length} on un-hosted path` : 'all logos on a confirmed-live host');
+  return results;
+}
+
+function buildPayload(html) {
+  return {
+    name: CAMPAIGN.name,
+    email_campaign_activities: [{
+      format_type: 5,
+      from_name: CAMPAIGN.fromName,
+      from_email: CAMPAIGN.fromEmail,
+      reply_to_email: CAMPAIGN.replyTo,
+      subject: CAMPAIGN.subject,
+      preheader: CAMPAIGN.preheader,
+      html_content: html,
+      physical_address_in_footer: CAMPAIGN.physicalAddress,
+    }],
+  };
+}
+
+async function main() {
+  const html = loadHtml();
+  console.log('='.repeat(72));
+  console.log('New Arrivals Weekly → Constant Contact v3 campaign builder');
+  console.log(`mode: ${CONFIRM ? '--confirm' : '--dry-run (default)'}   CC_LIVE=${process.env.CC_LIVE === '1' ? '1' : '(unset)'}`);
+  console.log('='.repeat(72));
+
+  const payload = buildPayload(html);
+  const printable = JSON.parse(JSON.stringify(payload));
+  printable.email_campaign_activities[0].html_content = `<<${html.length} bytes of HTML — truncated>>\n` + html.slice(0, 300) + '\n…';
+  console.log('\n--- CREATE-CAMPAIGN PAYLOAD (html_content truncated) ---');
+  console.log(JSON.stringify(printable, null, 2));
+
+  console.log('\n--- VALIDATION CHECKLIST ---');
+  const results = runChecklist(html); let failed = 0;
+  for (const r of results) { const mark = r.pass ? 'PASS' : 'FAIL'; if (!r.pass) failed++; console.log(`  [${mark}] ${r.name}`); if (r.detail) console.log(`         ${r.detail}`); }
+  console.log(`\n  ${results.length - failed}/${results.length} checks passed, ${failed} failed.`);
+
+  if (DRY_RUN) {
+    console.log('\nDRY-RUN: no network call made. (default)');
+    process.exitCode = failed > 0 ? 2 : 0;
+    return;
+  }
+  if (failed > 0) { console.log('\nREFUSING to create: validation has FAILs.'); process.exitCode = 2; return; }
+  console.log('\n--confirm + validation clean → UPDATING existing DRAFT in place (NO-OPs unless CC_LIVE=1):');
+  const res = await cc.updateCampaignActivity(ACTIVITY_ID, {
+    subject: CAMPAIGN.subject, preheader: CAMPAIGN.preheader,
+    fromEmail: CAMPAIGN.fromEmail, fromName: CAMPAIGN.fromName, replyTo: CAMPAIGN.replyTo,
+    htmlContent: html, physicalAddress: CAMPAIGN.physicalAddress,
+  }, true);
+  console.log('result:', JSON.stringify(res).slice(0, 300));
+}
+
+main().catch((e) => { console.error('[update-glitter-sparkle] ERROR:', e.message); process.exitCode = 1; });
diff --git a/mailers/glitter-sparkle-launch.html b/mailers/glitter-sparkle-launch.html
new file mode 100644
index 00000000..3e9faa86
--- /dev/null
+++ b/mailers/glitter-sparkle-launch.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Sparkle &amp; Shine — Glitter, Sequin, Metallic &amp; Glass-Bead Wallcoverings</title>
+<style type="text/css">
+  body,table,td,p,a{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+  body{margin:0!important;padding:0!important;width:100%!important;background:#f4f1ec;font-family:Georgia,'Times New Roman',serif;color:#2a2724;}
+  table{border-collapse:collapse!important;} img{border:0;outline:none;text-decoration:none;display:block;-ms-interpolation-mode:bicubic;}
+  a{color:#1a1a1a;text-decoration:none;}
+  @media only screen and (max-width:620px){ .stack{display:block!important;width:100%!important;} }
+</style></head>
+<body style="margin:0;padding:0;background:#f4f1ec;">
+<table role="presentation" width="100%" cellspacing="0" cellpadding="0" border="0" style="background:#f4f1ec;">
+<tr><td align="center" style="padding:20px 0;">
+  <table role="presentation" width="620" cellspacing="0" cellpadding="0" border="0" style="max-width:620px;background:#ffffff;">
+
+    <!-- LOGO -->
+    <tr><td align="center" style="padding:28px 0 14px;border-bottom:1px solid #e8e2d6;">
+      <a href="https://www.designerwallcoverings.com/?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;color:#1a1a1a;">
+        <div style="font-family:Georgia,serif;font-size:28px;letter-spacing:6px;color:#1a1a1a;text-transform:uppercase;">Designer Wallcoverings</div>
+        <div style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:4px;color:#8d8478;margin-top:4px;text-transform:uppercase;">est. 2003 &middot; to the trade</div>
+      </a>
+    </td></tr>
+
+    <!-- ANNOUNCE -->
+    <tr><td align="center" style="padding:34px 36px 6px;">
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;color:#7a6030;margin:0;">New &middot; The Sparkle Collections</p>
+      <p style="font-family:Georgia,serif;font-size:30px;line-height:36px;letter-spacing:1px;color:#1a1a1a;margin:14px 0 0;">Sparkle &amp; Shine</p>
+      <p style="font-family:Georgia,serif;font-size:15px;line-height:23px;color:#5a544c;margin:16px 24px 0;max-width:470px;">
+        Glitter, sequin &amp; hand-set glass bead &mdash; three ways to make a wall catch the light. A dozen looks, below. Order any as a <strong style="color:#7a6030;">$4.25 sample</strong>.
+      </p>
+    </td></tr>
+
+    <!-- PRIMARY CTAs -->
+    <tr><td align="center" style="padding:22px 36px 8px;">
+      <a href="https://www.designerwallcoverings.com/collections/glitter-walls?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px;padding:13px 30px;background:transparent;color:#1a1a1a !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1a1a1a;">Shop Glitter Walls</a>
+      <a href="https://www.designerwallcoverings.com/collections/glass-bead?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px;padding:13px 30px;background:transparent;color:#1a1a1a !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1a1a1a;">Shop Glambeads</a>
+    </td></tr>
+
+    <!-- 12 UNIFORM CIRCLES -->
+    <tr><td align="center" style="padding:26px 24px 4px;">
+      <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
+      <tr>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/sexy-sequin-wallcovering-blue-dazzle-gls-106?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/sexy-sequin-wallcovering--blue-dazzle_54cb4cb4-bf1e-4bbd-8142-fa2f1a6167c7.jpg?width=320&height=320&crop=center" alt="Sexy Sequin Blue Dazzle glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Sexy Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Blue Dazzle</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51507?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/c1944e5964687b1542f3dc6f8e0708ae.jpg?width=320&height=320&crop=center" alt="Hollywood Sequin Gold glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Hollywood Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Gold</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/sting-ray-sequin-glm-53041?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/sting-ray-sequin-glm-53041-clean.jpg?width=320&height=320&crop=center" alt="Sting Ray Sequin Bronze Multi glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Sting Ray Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Bronze Multi</p>
+  </a>
+</td>
+      </tr>
+      <tr>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51510?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/19235740651b3832a926e3473c7527c5.jpg?width=320&height=320&crop=center" alt="Hollywood Sequin Silver glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Hollywood Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Silver</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/hollywood-sequin-wallcoverings-hsw-51505?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/b45513e11ba9868087337988e2e7a809.jpg?width=320&height=320&crop=center" alt="Hollywood Sequin Bronze glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Hollywood Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Bronze</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/sexy-sequin-wallcovering-atlantic-blue-gls-109?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gls-1494847651952-cropped.jpg?width=320&height=320&crop=center" alt="Sexy Sequin Atlantic Blue glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Sexy Sequin</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Atlantic Blue</p>
+  </a>
+</td>
+      </tr>
+      <tr>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/leopard-glitter-wallcovering-silver-blue?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_04592.heic?width=320&height=320&crop=center" alt="Leopard Glitter Silver Blue glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Leopard Glitter</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Silver Blue</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/leopard-glitter-wallcovering-silver-green?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_0461.heic?width=320&height=320&crop=center" alt="Leopard Glitter Silver Green glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Leopard Glitter</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Silver Green</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/leopard-glitter-wallcovering-silver-pink?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/IMG_0462.heic?width=320&height=320&crop=center" alt="Leopard Glitter Silver Pink glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Leopard Glitter</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Silver Pink</p>
+  </a>
+</td>
+      </tr>
+      <tr>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/gleaming-glambeads-silver-and-cream-glass-bead-wallpaper?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/gleaming-glambeads-silver-and-cream-glass-bead-wallpaper-14768314122291.jpg?width=320&height=320&crop=center" alt="Gleaming Glambeads Silver & Cream glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Gleaming Glambeads</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Silver & Cream</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/copy-of-glambeads-glass-bead-stripe-wallpaper-cool-black-metallic?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/ScreenShot2022-03-29at1.50.40PM.png?width=320&height=320&crop=center" alt="Glambeads Glass Bead Stripe Cool Black glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Glambeads Glass Bead Stripe</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Cool Black</p>
+  </a>
+</td>
+        <td width="33%" valign="top" align="center" style="padding:0 6px 22px;">
+  <a href="https://www.designerwallcoverings.com/products/glambeads-solid-black-glass-bead-wallpaper-gbs-19014?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/products/TTN-0714_Item.jpg?width=320&height=320&crop=center" alt="Glambeads Solid Black glass-bead &amp; metallic wallcovering" width="160" height="160" style="width:160px;max-width:160px;height:160px;display:block;margin:0 auto;border-radius:50%;border:1px solid #e8e2d6;background:#f4f1ec;">
+    <p style="font-family:Georgia,serif;font-size:12px;color:#1a1a1a;margin:11px 0 1px;line-height:15px;">Glambeads Solid</p>
+    <p style="font-family:Helvetica,Arial,sans-serif;font-size:9px;letter-spacing:1.2px;color:#8d8478;text-transform:uppercase;margin:0;">Black</p>
+  </a>
+</td>
+      </tr>
+      </table>
+    </td></tr>
+
+    <!-- CLOSING CTA -->
+    <tr><td align="center" style="padding:14px 36px 6px;">
+      <a href="https://www.designerwallcoverings.com/collections/glitter-walls?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;padding:13px 34px;background:#1c1816;color:#ffffff !important;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:3px;text-transform:uppercase;text-decoration:none;border-radius:2px;border:1px solid #1c1816;">See Every Sparkle Pattern</a>
+      <p style="font-family:Georgia,serif;font-style:italic;font-size:13px;color:#8d8478;margin:14px 0 0;">Sold to the trade &mdash; swatches ship the same week.</p>
+    </td></tr>
+
+    <!-- BRANDS -->
+    <tr><td align="center" style="padding:8px 18px 4px;background:#ffffff;border-top:1px solid #e8e2d6;">
+      <div style="font-family:Helvetica,Arial,sans-serif;font-size:10px;letter-spacing:3px;text-transform:uppercase;color:#8d8478;margin:26px 0 16px;">Shop by House</div>
+      <a href="https://www.designerwallcoverings.com/search?q=Pierre%20Frey&type=product&utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Pierre Frey</a><a href="https://www.designerwallcoverings.com/collections/phillipe-romano?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Phillipe Romano</a><a href="https://www.designerwallcoverings.com/collections/rebel-walls?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Rebel Walls</a><a href="https://www.designerwallcoverings.com/search?q=Thibaut&type=product&utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Thibaut</a><a href="https://www.designerwallcoverings.com/collections/fentucci-naturals?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Fentucci Naturals</a><a href="https://www.designerwallcoverings.com/collections/vahallan?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Vahallan</a><a href="https://www.designerwallcoverings.com/search?q=Maharam&type=product&utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Maharam</a><a href="https://www.designerwallcoverings.com/search?q=CMO%20Paris&type=product&utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">CMO Paris</a><a href="https://www.designerwallcoverings.com/search?q=Designtex&type=product&utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Designtex</a><a href="https://www.designerwallcoverings.com/collections/romo?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Romo</a><a href="https://www.designerwallcoverings.com/collections/jeffrey-stevens?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Jeffrey Stevens</a>
+    </td></tr>
+
+    <!-- SHOP BY CATEGORY -->
+    <tr><td align="center" style="padding:14px 18px 34px;background:#ffffff;">
+      <div style="font-family:Helvetica,Arial,sans-serif;font-size:10px;letter-spacing:3px;text-transform:uppercase;color:#8d8478;margin:14px 0 16px;">Shop by Category</div>
+      <a href="https://www.designerwallcoverings.com/collections/new-arrivals?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#7a6030;border:1px solid #7a6030;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">New Arrivals</a><a href="https://www.designerwallcoverings.com/collections/glitter-walls?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Glitter Walls</a><a href="https://www.designerwallcoverings.com/collections/glass-bead?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Glambeads</a><a href="https://www.designerwallcoverings.com/collections/mica?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Metallics</a><a href="https://www.designerwallcoverings.com/collections/murals?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Murals</a><a href="https://www.designerwallcoverings.com/pages/shop-by-color?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="display:inline-block;margin:5px 4px;padding:11px 22px;background-color:#1c1816;border:1px solid #1c1816;border-radius:26px;color:#ffffff;font-family:Helvetica,Arial,sans-serif;font-size:11px;letter-spacing:2px;text-transform:uppercase;text-decoration:none;white-space:nowrap;">Shop by Color</a>
+    </td></tr>
+
+    <!-- WORDMARK -->
+    <tr><td align="center" style="padding:40px 24px 28px;border-top:1px solid #e8e2d6;">
+      <a href="https://www.designerwallcoverings.com/?utm_source=email&utm_medium=mailer&utm_campaign=glitter-sparkle-2026-09" target="_blank" style="text-decoration:none;">
+        <div style="font-family:Georgia,serif;font-size:20px;letter-spacing:5px;color:#1a1a1a;text-transform:uppercase;">Designer Wallcoverings</div>
+        <div style="font-family:Georgia,serif;font-style:italic;font-size:12px;color:#8d8478;margin-top:8px;">To the trade &mdash; Los Angeles, since 2003</div>
+      </a>
+    </td></tr>
+
+    <!-- FOOTER -->
+    <tr><td align="center" style="padding:32px 36px;background:#f4f1ec;border-top:1px solid #e8e2d6;">
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:11px;line-height:18px;color:#8d8478;margin:0 0 8px;">
+        <strong style="color:#5a544c;letter-spacing:1px;">DESIGNER WALLCOVERINGS</strong><br>
+        15442 Ventura Bl &middot; Sherman Oaks, CA 91403 &middot; 1-888-373-4564<br>
+        info@designerwallcoverings.com &middot; designerwallcoverings.com
+      </p>
+      <p style="font-family:Helvetica,Arial,sans-serif;font-size:10px;line-height:16px;color:#8d8478;margin:16px 0 0;">
+        You&rsquo;re receiving this email because you&rsquo;ve shopped or registered with Designer Wallcoverings.<br>
+        Unsubscribe and preference links appear below (added automatically by Constant Contact).
+      </p>
+    </td></tr>
+
+  </table>
+</td></tr></table>
+</body></html>
\ No newline at end of file

← 37b817a4 auto-data-snapshot: 2026-09-03T13:07:42 (1 data files) — sho  ·  back to Designer Wallcoverings  ·  auto-data-snapshot: 2026-09-07T06:51:38 (2 data files) — sho 67a74a1b →