[object Object]

← back to Sample Followup Sweep

16 vendor follow-up drafts created; fill blanks via primary vendor addresses (Concertex, Sandberg/Rebel Walls via Gimmersta)

b4029314742b04ffee2163c9f8359540b9b55576 · 2026-08-14 15:21:23 -0700 · Steve Abrams

Files touched

Diff

commit b4029314742b04ffee2163c9f8359540b9b55576
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Fri Aug 14 15:21:23 2026 -0700

    16 vendor follow-up drafts created; fill blanks via primary vendor addresses (Concertex, Sandberg/Rebel Walls via Gimmersta)
---
 data/contacts.json     |  6 +++++-
 scripts/make-drafts.js | 44 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/data/contacts.json b/data/contacts.json
index 2a25803..8aad2d7 100644
--- a/data/contacts.json
+++ b/data/contacts.json
@@ -22,5 +22,9 @@
   "olp":      { "name": "Olivia & Poppy", "sample_email": "info@oliviaandpoppy.com", "account_number": "" },
   "san":      { "name": "Sancar (AS Création) — inferred", "sample_email": "sales@sancarwallcovering.com", "account_number": "1674444" },
   "chin":     { "name": "China Seas by Quadrille — inferred", "sample_email": "Rhaiza@quadrilleinc.com", "account_number": "37017" },
-  "jofa":     { "name": "Lee Jofa (Kravet family) — inferred", "sample_email": "matt.schoffman@kravet.com", "account_number": "10087117" }
+  "jofa":     { "name": "Lee Jofa (Kravet family) — inferred", "sample_email": "matt.schoffman@kravet.com", "account_number": "10087117" },
+  "con":      { "name": "Concertex", "sample_email": "info@concertex.com", "account_number": "On File" },
+  "sand":     { "name": "Sandberg (via Gimmersta US)", "sample_email": "support@gimmersta.com", "account_number": "On File" },
+  "sandb":    { "name": "Sandberg (via Gimmersta US)", "sample_email": "support@gimmersta.com", "account_number": "On File" },
+  "rbl":      { "name": "Rebel Walls (via Gimmersta US)", "sample_email": "support@gimmersta.com", "account_number": "On File" }
 }
diff --git a/scripts/make-drafts.js b/scripts/make-drafts.js
new file mode 100644
index 0000000..c9d3641
--- /dev/null
+++ b/scripts/make-drafts.js
@@ -0,0 +1,44 @@
+'use strict';
+// Consolidate READY vendors by sample_email into one letter per recipient,
+// so a vendor with multiple vids (O&L dgd+osb, Thibaut thi+thib, etc.) gets ONE email.
+const fs = require('fs');
+const path = require('path');
+const { compose } = require('../lib/compose');
+
+const SHIP_TO = { name: 'Designer Wallcoverings', line1: '15442 Ventura Blvd. #102', city_state_zip: 'Sherman Oaks, CA 91403', phone: '1-888-373-4564' };
+const root = path.join(__dirname, '..');
+const fleet = JSON.parse(fs.readFileSync(path.join(root, 'data', 'fleet.json'), 'utf8')).vendors;
+const contacts = JSON.parse(fs.readFileSync(path.join(root, 'data', 'contacts.json'), 'utf8'));
+
+const groups = {};
+for (const v of fleet) {
+  const c = contacts[v.slug];
+  if (!c || !c.sample_email || !c.account_number) continue; // READY only
+  const key = c.sample_email.toLowerCase();
+  groups[key] = groups[key] || { to: c.sample_email, account: c.account_number, name: c.name, slugs: [], items: [] };
+  groups[key].slugs.push(v.slug);
+  for (const it of v.items) groups[key].items.push(it);
+}
+
+const drafts = [];
+for (const key of Object.keys(groups)) {
+  const g = groups[key];
+  // Clean: drop blank Mfr# rows, dedupe identical lines (keep vendor letter tidy).
+  const seen = new Set();
+  const rows = [];
+  for (const it of g.items) {
+    const m = (it.mfr || '').trim();
+    if (!m || seen.has(m)) continue;
+    seen.add(m); rows.push({ mfr: m });
+  }
+  if (!rows.length) continue; // nothing real to chase
+  const vendor = { name: g.name, account_number: g.account, sample_email: g.to, ship_to: SHIP_TO };
+  const d = compose(vendor, rows);
+  drafts.push({ to: d.to, subject: d.subject, body: d.html, slugs: g.slugs, name: g.name, items: rows.length });
+}
+drafts.sort((a, b) => b.items - a.items);
+
+fs.mkdirSync(path.join(root, 'out'), { recursive: true });
+fs.writeFileSync(path.join(root, 'out', 'all-drafts.json'), JSON.stringify(drafts, null, 2));
+console.log(`consolidated letters: ${drafts.length} (from ${Object.values(groups).reduce((s, g) => s + g.slugs.length, 0)} ready vids)`);
+drafts.forEach((d, i) => console.log(`  ${String(i + 1).padStart(2)}. ${String(d.items).padStart(2)} items -> ${d.to}  [${d.slugs.join('+')}]  ${d.name}`));

← 658a9b1 Harvest page 2: +9 vendor contacts (astek, arte, pindler, ma  ·  back to Sample Followup Sweep  ·  Add send-drafts.js (Steve-triggered sender via George approv 2678e39 →