← back to Marketing Command Center
drafts/glitter-sequin-exclusive/README.md
71 lines
# Glitter & Sequin — Exclusive Collection (Constant Contact DRAFT)
**Status:** send-ready artifact built + validated. Draft-create returned a MOCK id
because Connie CC (the live Constant Contact v3 OAuth holder) is unreachable from
this node. Real draft-create is **pending Connie reachability** (see below).
Ticket: TK-11075. Cost: **$0** (CC reads/draft are free; all render + verify local).
## What this is
An "ad" (email campaign) for the glitterwalls.com line, angle = **EXCLUSIVITY**
(private / trade-first release), reusing the Designer Wallcoverings email design
system. DRAFT ONLY — do NOT send/schedule (hard-gated, Steve's decision).
- **Campaign name:** `Glitter & Sequin — Exclusive Collection`
- **Subject:** `By invitation: the Glitter & Sequin collection`
- **Preheader:** `A private release of shimmer, sequin, and metallic, reserved for our trade list first.`
- **From:** `info@designerwallcoverings.com` (DW's verified CC sender)
- **Files:** `campaign.html` (send-ready HTML) · `draft-payload.json` (exact POST body)
· `build-email.mjs` (regenerator) · `draft-response.json` (mock draft-create result)
## Reused design elements (from the DW email system / brand lib)
Cormorant Garamond wordmark, ink `#14110f` / cream `#f4efe7` / gold `#b8925a`
palette, gold hairline rule, centered hero image block, 2-col product grid, dark
CTA button, editorial serif+Inter type. CAN-SPAM footer carries the real physical
mailing address + working unsubscribe (send-ready).
> NOTE — the "last sent email" the design was meant to mirror could not be pulled:
> Connie (Constant Contact) is unreachable from this node, and the MCC proxy reaches
> Connie but is 401'd, so the live campaign list falls back to MOCK. The design was
> therefore built from the DW brand system + the mock "last sent" (Spring Grasscloth
> Edit) shape, which is the same house design language.
## Verified send-ready (all checks green)
- CAN-SPAM: physical address `15442 Ventura Blvd #102, Sherman Oaks, CA 91403` +
`[[trackingUnsubscribe]]` present (module `_canSpamCheck` → ok).
- CA §17529.5: subject clean (no ALL-CAPS / fake RE: / deceptive), from valid.
- Word "Wallpaper" BANNED: 0 occurrences in visible copy/alt (only inside live URL
slugs, unavoidable).
- Slop lint: score 0.
- **Every href + image verified 200 on the live store** (contrarian caught the
original stale-catalog links that 404'd; rebuilt off the live
`/collections/glitter-wallpaper` feed — 18/18 URLs now 200).
- Real collection: `/collections/glitter-wallpaper` ("Glitter + Sequins", 663 SKUs).
> Set `MCC_PASS` first (marketing-command-center basic-auth pass, in its `.env`):
> `export MCC_PASS="$(grep '^MCC_PASS=' ~/Projects/marketing-command-center/.env | cut -d= -f2-)"`
## To CREATE THE DRAFT once Connie is reachable
When the Connie CC node (`100.107.67.67:9820`) is reachable from the running box
(or the MCC's Connie auth is fixed so it stops 401'ing), re-run the same POST — it
will create a REAL Constant Contact DRAFT (`mock:false`, real `draft_id`):
```sh
# From ~/Projects/marketing-command-center/drafts/glitter-sequin-exclusive
curl -s -u "admin:$MCC_PASS" -H 'Content-Type: application/json' \
-X POST http://127.0.0.1:9661/api/constant-contact/draft \
--data @draft-payload.json | node -e 'let d="";process.stdin.on("data",c=>d+=c).on("end",()=>{const r=JSON.parse(d);console.log(r.mock?"STILL MOCK — Connie unreachable":"REAL DRAFT "+r.draft_id, r.status)})'
```
## To SEND (GATED — Steve's decision only; do NOT run without his go)
Sending is send-to-a-list → hard-gated (CAN-SPAM / §17529.5 / TCPA / CCPA). The
one-line gated command Steve runs to schedule/send AFTER he approves AND once a
real `draft_id` exists (replace `<REAL_DRAFT_ID>`; `scheduled_time` omitted = send now):
```sh
curl -s -u "admin:$MCC_PASS" -H 'Content-Type: application/json' \
-X POST http://127.0.0.1:9661/api/constant-contact/schedule \
--data '{"draft_id":"<REAL_DRAFT_ID>","confirm":true,"dryRun":false,"subject":"By invitation: the Glitter & Sequin collection","from":"info@designerwallcoverings.com","html":"'"$(node -e 'process.stdout.write(JSON.stringify(require("./draft-payload.json").html).slice(1,-1))')"'"}'
```
(The `/schedule` route re-runs the CAN-SPAM + §17529.5 gates and refuses without
`confirm:true`; `dryRun:false` is what actually commits the send.)