← back to Dw Validator Debug TK11314
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
M DW-Programming/versa-evo-pvcfree-scraper.jsA mailers/_glitter_gen.jsA mailers/cc-api/build-glitter-sparkle-campaign.jsA mailers/cc-api/cc-stats.jsA mailers/cc-api/check-glitter-sparkle.jsA mailers/cc-api/update-glitter-sparkle-campaign.jsA mailers/glitter-sparkle-launch.html
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 & 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 & Shine — Glitter, Sequin, Metallic & 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 · 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 · 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 & 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 & hand-set glass bead — 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 — 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 — 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 · Sherman Oaks, CA 91403 · 1-888-373-4564<br>
+ info@designerwallcoverings.com · designerwallcoverings.com
+ </p>
+ <p style="font-family:Helvetica,Arial,sans-serif;font-size:10px;line-height:16px;color:#8d8478;margin:16px 0 0;">
+ You’re receiving this email because you’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 & Shine — Glitter, Sequin, Metallic & 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 · 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 · 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 & 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 & hand-set glass bead — 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 & 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 — 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 — 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 · Sherman Oaks, CA 91403 · 1-888-373-4564<br>
+ info@designerwallcoverings.com · designerwallcoverings.com
+ </p>
+ <p style="font-family:Helvetica,Arial,sans-serif;font-size:10px;line-height:16px;color:#8d8478;margin:16px 0 0;">
+ You’re receiving this email because you’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 Dw Validator Debug TK11314
·
auto-data-snapshot: 2026-09-07T06:51:38 (2 data files) — sho 67a74a1b →