From shadowtek-edm
Structured intake for new email/EDM projects. Walks through brand, sequence type, email purposes, imagery source, and deployment target — then auto-creates the directory structure, brand kit (if new), template skeletons, and runs the live-site inspector. Pairs with branded-edm-builder + email-preflight. Use when starting a new email sequence, EDM campaign, or onboarding flow for any Shadowtek client.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shadowtek-edm:edm-new-projectThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The kickoff flow for any new email project in the Shadowtek email-components system. Run this before touching MJML. The email-components directory is bundled inside this plugin at `email-components/`. Set `<EMAIL_COMPONENTS_PATH>` to the full path of that directory on your machine — e.g. `~/Developer/GitHub/shadowtek-claude-plugin/plugins/shadowtek-edm/email-components`.
The kickoff flow for any new email project in the Shadowtek email-components system. Run this before touching MJML. The email-components directory is bundled inside this plugin at email-components/. Set <EMAIL_COMPONENTS_PATH> to the full path of that directory on your machine — e.g. ~/Developer/GitHub/shadowtek-claude-plugin/plugins/shadowtek-edm/email-components.
When invoked, walks the user through questions to scope the project, then:
<EMAIL_COMPONENTS_PATH>/intake/<brand>-<sequence>-<date>.mdtemplates/<brand>/<sequence-type>/brand-kits/<brand>.json and runs the site inspectorUse AskUserQuestion if available. If not, ask one at a time as plain questions. Always show options.
"Which brand is this project for?"
Options:
- Existing: SiteLaunch (sitelaunch.com.au) — tradie websites, Shadowtek × Lead Laundry JV
- Existing: Shadowtek (shadowtek.com.au / shadowtek.ai) — agency brand
- Existing: Londyloans (londyloans.com.au) — vehicle finance
- Existing: OPO (ourpacificoffice.com) — Pacific workforce outsourcing
- Existing: CXN (con-x-ion.com) — workforce connection
- New brand (will trigger site-inspector + new brand-kit creation)
If "New brand", ask follow-ups:
Brand kits on disk:
<EMAIL_COMPONENTS_PATH>/brand-kits/— check here before treating a brand as "new". If a.jsonexists, it's an existing brand.
"What kind of email sequence is this?"
Options:
- Welcome / Onboarding (typically 3-7 emails, post-signup or post-purchase)
- Sales Nurture (3-6 emails, post-discovery-call follow-up)
- Monthly Newsletter (single email, recurring)
- Promotional EDM (one-off, image-heavy)
- Re-engagement / Win-back (3-4 emails for lapsed contacts)
- Transactional (welcome, password reset, receipt — usually 1-2 emails)
- Custom — describe in 1 sentence
Directory name mapping: welcome-nurture, sales-nurture, monthly-newsletter, promo-<name>, winback, transactional, custom-<name>.
"How many emails in the sequence?"
Options: 1, 2, 3, 4, 5, 6, 7, 8+ (if 8+, ask for exact count)
For each email in the sequence, ask:
"Email N — what's its job?"
Options:
- Welcome / Lead magnet delivery (deliver promised asset + set expectations)
- Brand story / About us (founder story, why we exist)
- Education / Strategy (teach a concept that frames your offer)
- Showcase / Portfolio (visual proof — past work, designs, results)
- Features & benefits (what they get, with bento card grid)
- Case study / Social proof (one customer's story with outcomes)
- Offer / Pricing / Guarantee (the conversion email — price, terms, guarantee)
- Book a call / Consultation invite (founder-led close)
- Newsletter / Monthly update (mixed-content recap)
- Re-engagement ("We miss you" / "Still interested?")
- Transactional (receipt, password reset, account update)
- Custom — describe in 1 sentence
These purposes map to known template patterns from the reference repo:
| Purpose | Reference template |
|---|---|
| Welcome / Lead magnet | opo/welcome-nurture/01-lead-magnet-delivery or sitelaunch/onboarding/01-welcome |
| Brand story | opo/welcome-nurture/02-brand-story |
| Education / Strategy | opo/welcome-nurture/03-diversified-location-strategy |
| Showcase / Portfolio | sitelaunch/onboarding/02-design-showcase |
| Features & benefits | sitelaunch/onboarding/03-features-benefits |
| Case study / Social proof | opo/welcome-nurture/05-client-results |
| Offer / Pricing | sitelaunch/onboarding/04-offer-guarantee |
| Book a call | opo/welcome-nurture/06-book-call |
| Newsletter | (build from scratch with bento card patterns) |
| Re-engagement | (build from scratch) |
| Transactional | (build minimal) |
"Where will hero imagery come from?"
Options:
- Live brand site (auto-extract real photography via site inspector — best brand match)
- Brand-provided assets (path to a folder of images the client will provide)
- AI-generated via nano-banana (Shadowtek's Gemini image gen — good for product/scene shots)
- Unsplash placeholders (free, generic — good for first draft, swap later)
- None / text-only (clean text-led templates, no hero photography)
"Where should the compiled HTML go after build?"
Options:
- Cloudflare Pages — email previews (default — shareable client review URL)
- Don't deploy yet (build locally only — useful for early iteration)
"Which platform will these emails ultimately be sent from?"
Options:
- GoHighLevel / GHL (
{{contact.first_name}}) — most common for Shadowtek clients- MailerLite (
{$name})- HubSpot (
{{ contact.firstname }})- Mailchimp (
*|FNAME|*)- Klaviyo (
{{ first_name|default:'there' }})- Standard / SendGrid (keep
{{first_name}}as-is)- Not deciding yet (default to Standard)
Write to <EMAIL_COMPONENTS_PATH>/intake/<brand>-<sequence>-YYYY-MM-DD.md:
# EDM Intake: <Brand> · <Sequence Name>
**Date:** YYYY-MM-DD
**Brand:** <name> (<short_code>)
**Sequence type:** <type>
**Email count:** N
**Hero source:** <source>
**Deploy target:** <target>
**Send platform:** <platform>
## Emails
| # | Purpose | Reference template | Status |
| --- | --- | --- | --- |
| 01 | <purpose> | <ref> | skeleton |
| 02 | ... | ... | skeleton |
## Build plan
1. <For new brand:> Run `node scripts/inspect-<brand>-site.mjs` to capture brand DNA
2. <For new brand:> Create `brand-kits/<brand>.json`
3. <For new brand:> Process logo + imagery via `process-<brand>-assets.py`
4. Build N skeleton MJML files at `templates/<brand>/<sequence>/<NN>-<purpose>.mjml`
5. `npm run build` to verify clean compile
6. `npm run preflight:fast` to confirm no layout issues
7. <If deploying:> `npm run deploy` → live URLs
## Acceptance criteria
- [ ] All N emails compile cleanly (no MJML warnings)
- [ ] Preflight passes all checks at 4 viewports
- [ ] Mobile rendering verified visually
- [ ] Compliance footer (unsubscribe + sender info) on every email
- [ ] View-in-browser link in every email header
- [ ] Hero imagery licensed/sourced
New brand path:
scripts/inspect-opo-site.mjs → scripts/inspect-<brand>-site.mjs, edit URLrefs/<brand>-site/brand-kits/<brand>.json based on real tokensExisting brand path:
brand-kits/<brand>.json and assetsBoth paths — create template skeletons:
templates/<brand>/<sequence>/<NN>-<slug>.mjml<mj-include path="../../../components/view-in-browser.mjml" />, brand header, hero section with placeholder copy, brand footerCompile + preflight:
cd <EMAIL_COMPONENTS_PATH> && npm run buildnpm run preflight:fastcd build && python3 -m http.server 8765 & if needed)Deploy if requested:
npm run deploymj-column containing raw HTML <table> with two <td> cells. CSS media query at <=480px flips TDs to display: block for mobile stacking. Never try to stack two mj-column siblings via @media — MJML's table-row layout overrides it.mj-column with raw HTML <table> containing 4 <td> cells at width="25%". CSS media query at <=480px makes TDs display: inline-block; width: 50% for 2×2 mobile grid.mj-column width="33%" with css-class="bento-card bento-equal stack-on-mobile". The bento-equal class forces equal heights via height: 280px on the inner td.mj-column width="48%" / 52%". Auto-stack on mobile.<mj-include path="../../../components/view-in-browser.mjml" /> immediately after <mj-body>.<mj-include path="../../../components/footer.mjml" />. Must have unsubscribe link + sender email visible.✓ Project scoped: <Brand> · <Sequence> (N emails)
✓ Brand kit: brand-kits/<brand>.json (<new|existing>)
✓ Skeletons created: templates/<brand>/<sequence>/01-...mjml through NN-...mjml
✓ Build: clean (N templates compiled)
✓ Preflight: N pass / 0 fail
✓ Deployed: https://email-previews.pages.dev/<brand>/<sequence>/
Next step: fill in copy and hero imagery in each skeleton, then re-run
npm run build && npm run preflight:fast && npm run deploy
branded-edm-builder — the MJML design system + repo conventionsemail-preflight — the QA system this skill triggers at the endWhole-repo audit for over-engineering: finds dead code, unnecessary abstractions, stdlib-replaceable dependencies. Outputs ranked findings and net line/dep savings.
npx claudepluginhub shadowtek-dev/shadowtek-claude-plugin