taketomarket 2.2.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +13 -17
- package/.claude-plugin/plugin.json +2 -2
- package/README.md +35 -12
- package/bin/lib/campaign.cjs +12 -8
- package/bin/lib/codebase-scan.cjs +86 -0
- package/bin/lib/config.cjs +129 -0
- package/bin/lib/deploy.cjs +36 -0
- package/bin/lib/deviation.cjs +1 -1
- package/bin/lib/drift-log.cjs +4 -4
- package/bin/lib/health.cjs +32 -31
- package/bin/lib/install-detect.cjs +62 -0
- package/bin/lib/legacy-folder.cjs +100 -0
- package/bin/lib/playwright-check.cjs +26 -0
- package/bin/lib/site-location.cjs +22 -0
- package/bin/lib/state.cjs +3 -3
- package/bin/lib/svg-render.cjs +42 -0
- package/bin/ttm-tools.cjs +136 -4
- package/gates/base-gates.md +8 -8
- package/gates/gate-evaluation.md +8 -8
- package/install.js +37 -3
- package/package.json +10 -6
- package/playbooks/aeo.md +218 -114
- package/playbooks/affiliate.md +225 -160
- package/playbooks/email.md +236 -174
- package/playbooks/events.md +303 -213
- package/playbooks/landing-pages.md +309 -0
- package/playbooks/linkedin.md +264 -142
- package/playbooks/manifesto.md +322 -0
- package/playbooks/paid-ads.md +240 -189
- package/playbooks/positioning.md +340 -0
- package/playbooks/pr-media.md +308 -168
- package/playbooks/pseo.md +426 -0
- package/playbooks/seo.md +251 -158
- package/playbooks/social.md +253 -182
- package/playbooks/youtube.md +286 -181
- package/references/brand-color-theory.md +48 -0
- package/references/codex-image-gen-research.md +58 -0
- package/references/context-loading.md +6 -6
- package/references/humanizer-patterns.md +433 -0
- package/references/inline-education-blurbs.md +461 -0
- package/references/landing-page-anatomy.md +65 -0
- package/references/landing-page-headline-examples.md +190 -0
- package/references/linkedin-post-patterns.md +174 -0
- package/references/logo-design-principles.md +55 -0
- package/references/meta-gate-evaluation.md +3 -3
- package/references/obra-superpowers-conventions.md +170 -0
- package/references/playbook-leaders.md +472 -0
- package/references/playwright-mcp-setup.md +164 -0
- package/references/positioning-check-report.md +2 -2
- package/references/pseo-page-anatomy.md +56 -0
- package/references/pseo-templates/alternative-anatomy.md +31 -0
- package/references/pseo-templates/alternative-content-playbook.md +32 -0
- package/references/pseo-templates/blog-anatomy.md +28 -0
- package/references/pseo-templates/blog-content-playbook.md +36 -0
- package/references/pseo-templates/comparison-anatomy.md +29 -0
- package/references/pseo-templates/comparison-content-playbook.md +35 -0
- package/references/pseo-templates/use-case-anatomy.md +28 -0
- package/references/pseo-templates/use-case-content-playbook.md +30 -0
- package/skills/ttm-101/SKILL.md +25 -0
- package/skills/ttm-aeo-check/SKILL.md +17 -12
- package/skills/ttm-affiliate-kit/SKILL.md +5 -0
- package/skills/ttm-archive/SKILL.md +5 -0
- package/skills/ttm-brand-refresh/SKILL.md +5 -0
- package/skills/ttm-brief/SKILL.md +5 -0
- package/skills/ttm-competitor-scan/SKILL.md +5 -0
- package/skills/ttm-deploy/SKILL.md +22 -0
- package/skills/ttm-discover/SKILL.md +17 -0
- package/skills/ttm-email-check/SKILL.md +17 -0
- package/skills/ttm-email-preflight/SKILL.md +17 -11
- package/skills/ttm-fix/SKILL.md +5 -0
- package/skills/ttm-health/SKILL.md +6 -1
- package/skills/ttm-humanize/SKILL.md +33 -0
- package/skills/ttm-icp-refresh/SKILL.md +5 -0
- package/skills/ttm-improve-skill/SKILL.md +18 -0
- package/skills/ttm-init/SKILL.md +10 -3
- package/skills/ttm-keyword-map/SKILL.md +17 -11
- package/skills/ttm-landing/SKILL.md +19 -0
- package/skills/ttm-learn/SKILL.md +5 -0
- package/skills/ttm-linkedin-post/SKILL.md +26 -0
- package/skills/ttm-measure/SKILL.md +5 -0
- package/skills/ttm-new-campaign/SKILL.md +5 -0
- package/skills/ttm-next/SKILL.md +5 -0
- package/skills/ttm-playwright-setup/SKILL.md +18 -0
- package/skills/ttm-positioning-check/SKILL.md +5 -0
- package/skills/ttm-positioning-shift/SKILL.md +5 -0
- package/skills/ttm-produce/SKILL.md +5 -0
- package/skills/ttm-pseo/SKILL.md +26 -0
- package/skills/ttm-repurpose/SKILL.md +5 -0
- package/skills/ttm-request-skill/SKILL.md +18 -0
- package/skills/ttm-research/SKILL.md +18 -6
- package/skills/ttm-resume/SKILL.md +5 -0
- package/skills/ttm-review/SKILL.md +5 -0
- package/skills/ttm-seo/SKILL.md +64 -0
- package/skills/ttm-seo-audit/SKILL.md +17 -12
- package/skills/ttm-ship/SKILL.md +5 -0
- package/skills/ttm-state/SKILL.md +5 -0
- package/skills/ttm-update/SKILL.md +152 -4
- package/skills/ttm-verify/SKILL.md +5 -0
- package/templates/agents-md.md +14 -4
- package/templates/campaign-research.md +6 -6
- package/templates/campaign-state.md +1 -1
- package/templates/claude-md.md +14 -4
- package/templates/linkedin-base-template.md +48 -0
- package/templates/next-step-footer.md +13 -0
- package/templates/production-manifest.json +4 -4
- package/templates/pseo/alternative-cms-schema.json +65 -0
- package/templates/pseo/blog-cms-schema.json +55 -0
- package/templates/pseo/comparison-cms-schema.json +56 -0
- package/templates/pseo/use-case-cms-schema.json +62 -0
- package/templates/reference-files/brand.md +51 -0
- package/templates/reference-files/product-dna.md +73 -0
- package/templates/site-scaffold/app/globals.css +2 -0
- package/templates/site-scaffold/app/layout.tsx +17 -0
- package/templates/site-scaffold/app/page.tsx +33 -0
- package/templates/site-scaffold/app/robots.ts +8 -0
- package/templates/site-scaffold/app/sitemap.ts +10 -0
- package/templates/site-scaffold/app/tokens.css +21 -0
- package/templates/site-scaffold/components/Comparison.tsx +14 -0
- package/templates/site-scaffold/components/Faq.tsx +14 -0
- package/templates/site-scaffold/components/Features.tsx +14 -0
- package/templates/site-scaffold/components/FinalCta.tsx +17 -0
- package/templates/site-scaffold/components/Footer.tsx +12 -0
- package/templates/site-scaffold/components/Hero.tsx +22 -0
- package/templates/site-scaffold/components/HowItWorks.tsx +14 -0
- package/templates/site-scaffold/components/PricingTeaser.tsx +14 -0
- package/templates/site-scaffold/components/Problem.tsx +14 -0
- package/templates/site-scaffold/components/SocialProof.tsx +14 -0
- package/templates/site-scaffold/components/Solution.tsx +14 -0
- package/templates/site-scaffold/components/Testimonials.tsx +14 -0
- package/templates/site-scaffold/components/UseCases.tsx +14 -0
- package/templates/site-scaffold/content/.gitkeep +0 -0
- package/templates/site-scaffold/lib/.gitkeep +0 -0
- package/templates/site-scaffold/next.config.mjs +10 -0
- package/templates/site-scaffold/package.json +25 -0
- package/templates/site-scaffold/postcss.config.mjs +3 -0
- package/templates/site-scaffold/public/llms.txt +9 -0
- package/templates/site-scaffold/tsconfig.json +21 -0
- package/templates/verification-report.md +1 -1
- package/workflows/channel/linkedin-post.md +178 -0
- package/workflows/discipline/affiliate-kit.md +65 -6
- package/workflows/discipline/{email-preflight.md → email-check.md} +39 -4
- package/workflows/discipline/repurpose.md +82 -31
- package/workflows/discipline/{aeo-check.md → seo/aeo.md} +13 -6
- package/workflows/discipline/{seo-audit.md → seo/audit.md} +13 -6
- package/workflows/discipline/{keyword-map.md → seo/keyword-map.md} +13 -6
- package/workflows/education/ttm-101.md +114 -0
- package/workflows/lifecycle/brief-positioning-check.md +1 -1
- package/workflows/lifecycle/brief.md +64 -28
- package/workflows/lifecycle/{research.md → discover.md} +61 -19
- package/workflows/lifecycle/fix.md +72 -37
- package/workflows/lifecycle/humanize.md +280 -0
- package/workflows/lifecycle/learn.md +72 -35
- package/workflows/lifecycle/measure.md +54 -18
- package/workflows/lifecycle/produce.md +88 -37
- package/workflows/lifecycle/review.md +71 -25
- package/workflows/lifecycle/ship.md +62 -18
- package/workflows/lifecycle/verify.md +72 -26
- package/workflows/reference-mgmt/brand-refresh.md +50 -13
- package/workflows/reference-mgmt/competitor-scan.md +51 -15
- package/workflows/reference-mgmt/icp-refresh.md +48 -12
- package/workflows/reference-mgmt/positioning-check.md +55 -20
- package/workflows/reference-mgmt/positioning-shift.md +53 -17
- package/workflows/setup/init-brand-colors.md +75 -0
- package/workflows/setup/init-logo.md +113 -0
- package/workflows/setup/init-product-dna.md +83 -0
- package/workflows/setup/init-questions.md +166 -30
- package/workflows/setup/init-validation.md +22 -0
- package/workflows/setup/init.md +144 -39
- package/workflows/setup/new-campaign.md +48 -12
- package/workflows/site/deploy.md +98 -0
- package/workflows/site/landing.md +156 -0
- package/workflows/site/pseo.md +96 -0
- package/workflows/site/quality-gates.md +88 -0
- package/workflows/utility/archive.md +45 -9
- package/workflows/utility/health.md +77 -3
- package/workflows/utility/improve-skill.md +233 -0
- package/workflows/utility/next.md +38 -2
- package/workflows/utility/playwright-setup.md +128 -0
- package/workflows/utility/request-skill.md +218 -0
- package/workflows/utility/resume.md +40 -3
- package/workflows/utility/state.md +42 -7
package/playbooks/email.md
CHANGED
|
@@ -1,173 +1,163 @@
|
|
|
1
1
|
---
|
|
2
2
|
discipline: email
|
|
3
|
-
asset_types: [
|
|
4
|
-
version: "
|
|
3
|
+
asset_types: [welcome-series, broadcast, lifecycle-email]
|
|
4
|
+
version: "2.0"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Email Playbook
|
|
8
8
|
|
|
9
|
+
> **Framework: The Dinner Party Strategy — Val Geisler (Fix My Churn).** Every email is a course of a dinner party. You are the host. The reader is a guest who walked into your home. You do not greet a guest by handing them a logo, a discount code, and three buttons. You say hello, you pour them a drink, you ask how they are, and only much later — once they are full and comfortable — do you ask if they would like to see the renovation you did upstairs. Email is not a broadcast channel. Email is a dinner conversation that happens at scale.
|
|
10
|
+
|
|
9
11
|
## Production Guidance
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
If a reader read your email aloud at a real dinner table, would the table laugh, lean in, or push their plate away? That is the entire production target. Every rule below exists to keep your email in the first two categories.
|
|
14
|
+
|
|
15
|
+
### The Dinner Party metaphor (the spine)
|
|
16
|
+
|
|
17
|
+
Five course types. Every email in a lifecycle program is one of these — and the order matters.
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
1. **Welcome (the host moment).** They just walked in. Hang their coat. Tell them where the bathroom is. Tell them what's for dinner. Then stop talking and let them settle. The welcome email sets every expectation that follows. Pitching here is the equivalent of greeting a guest with a sales contract on the doormat.
|
|
20
|
+
2. **Appetizers (low-pressure value).** Short, useful, no ask. You're feeding them something small and good so they trust the kitchen before the main course arrives. One idea per email. No CTA-stuffing.
|
|
21
|
+
3. **Main course (the product talk).** You earned it. Now you can be direct about features, demos, expansion, pricing. The main course is allowed to be substantial — but only because you fed them appetizers first.
|
|
22
|
+
4. **Sides (complementary value).** Adjacent value that makes the main course better — integrations, recipes, use-case stories, customer rituals. Sides keep the main course in context.
|
|
23
|
+
5. **Dessert (delight + retention).** Post-purchase. Anniversary. Renewal. A check-in that asks for nothing. Dessert is what makes guests come back. Most B2B SaaS programs never serve it. That's why they have churn problems.
|
|
14
24
|
|
|
15
|
-
|
|
25
|
+
Before you write an email, classify it. *"This is an appetizer."* *"This is dessert."* If you can't name the course, you're not writing an email — you're broadcasting.
|
|
16
26
|
|
|
17
|
-
###
|
|
27
|
+
### Sender voice — a person, not a brand
|
|
18
28
|
|
|
19
|
-
|
|
29
|
+
The from-line says a human name. "Val from Fix My Churn." "Rishi at takeToMarket." Not "The takeToMarket Team." Not "noreply@". A guest does not get greeted by a logo. A guest gets greeted by *you*. The brand earns its place in the signature, not the sender field.
|
|
20
30
|
|
|
21
|
-
|
|
31
|
+
The body follows the same rule. Write the way you talk to one specific customer you know by name. If you can't picture that customer — go pull a support ticket, a sales-call transcript, an onboarding-chat log, and read it aloud. Their exact phrases are the script. Customer language beats marketing language every single time.
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
### Plain-text-first aesthetic
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
A real friend doesn't email you a glossy four-column HTML mailer with a hero image and a CTA button the size of a dinner plate. A real friend writes you a few sentences and signs off. The default rendering target is plain-text-feel — even if the underlying email is HTML, it should look like a person typed it. Heavy-HTML promotional layouts read as marketing-blasts the moment the inbox preview loads. The reader's mental category is set before they click.
|
|
26
36
|
|
|
27
|
-
|
|
37
|
+
This is not anti-design. It is anti-corporate-design. Logos belong at the bottom. Buttons belong below content. The first line of the body is a sentence, not a brand banner.
|
|
28
38
|
|
|
29
|
-
###
|
|
39
|
+
### Behavior-triggered, not time-triggered
|
|
30
40
|
|
|
31
|
-
|
|
41
|
+
"Day 1, day 3, day 7" is a lazy drip schedule that sends the same sequence to a champion and a no-show. Trigger on what the user did or didn't do: signed up but never invited a teammate; activated feature A but never feature B; opened the last three emails but never replied; downgraded; upgraded. The trigger is the entire reason this email exists. If you cannot name the behavior that triggered the email, you don't have a lifecycle program — you have a calendar.
|
|
32
42
|
|
|
33
|
-
|
|
43
|
+
### One ask per email
|
|
34
44
|
|
|
35
|
-
|
|
45
|
+
A guest can hear one question at a time. Multiple CTAs at equal weight dilute every click. The primary ask is a single button or a single inline link. Secondary asks live as smaller text-link "P.S." moves at the bottom. The primary ask is sometimes "reply to this email" — especially in welcome — because a reply is the highest-trust signal email can produce. An email that asks for a reply and gets one converts at a rate that no button ever will.
|
|
36
46
|
|
|
37
|
-
###
|
|
47
|
+
### Generosity before pitch
|
|
38
48
|
|
|
39
|
-
|
|
40
|
-
- **Unsubscribe link:** Clear, easy to find, functional. One-click unsubscribe preferred (required by Gmail/Yahoo for bulk senders as of Feb 2024).
|
|
41
|
-
- **Physical mailing address:** Required by CAN-SPAM Act. Can be a PO Box.
|
|
42
|
-
- **Sender identification:** "From" name and email must accurately identify the sender.
|
|
49
|
+
You feed before you sell. In the appetizer course, the value is given freely with no hook. The reader closes the email and thinks "that was useful" — not "they want my credit card." The pitch is what you earn after generosity. Inverting this is the single most common failure of B2B SaaS email programs.
|
|
43
50
|
|
|
44
51
|
---
|
|
45
52
|
|
|
46
53
|
## Discipline Gates
|
|
47
54
|
|
|
48
|
-
### DISC-EMAIL-01:
|
|
55
|
+
### DISC-EMAIL-01: Sender Is A Person -- Tier 1
|
|
49
56
|
|
|
50
|
-
**Checks:**
|
|
51
|
-
**Against:**
|
|
57
|
+
**Checks:** From-name, from-address, and email opening identify a named human sender, not a corporate brand entity
|
|
58
|
+
**Against:** Email asset metadata (from-name, from-address) and the first 200 characters of body content
|
|
52
59
|
|
|
53
60
|
#### Evaluation Criteria
|
|
54
61
|
|
|
55
|
-
1. **
|
|
56
|
-
- PASS:
|
|
57
|
-
- WARN:
|
|
58
|
-
- FAIL:
|
|
62
|
+
1. **From-name**
|
|
63
|
+
- PASS: From-name is a human first name (optionally first + last), with the brand attached as a suffix (e.g., "Val from Fix My Churn", "Rishi at takeToMarket")
|
|
64
|
+
- WARN: From-name is the brand alone but the body opens with a clearly named sender in the first paragraph (e.g., "Hey, Val here.")
|
|
65
|
+
- FAIL: From-name is a brand/team string ("The takeToMarket Team", "Marketing", "noreply", "info"), AND the body has no named human sender in the first paragraph
|
|
59
66
|
|
|
60
|
-
2. **
|
|
61
|
-
- PASS:
|
|
62
|
-
- WARN:
|
|
63
|
-
- FAIL:
|
|
67
|
+
2. **From-address**
|
|
68
|
+
- PASS: From-address uses a personal mailbox at the brand domain (e.g., `val@fixmychurn.com`) and is reply-capable
|
|
69
|
+
- WARN: From-address is a role mailbox (e.g., `hello@`, `team@`) but replies are monitored by a human
|
|
70
|
+
- FAIL: From-address contains `noreply`, `no-reply`, or `donotreply` in any form
|
|
64
71
|
|
|
65
|
-
### DISC-EMAIL-02:
|
|
72
|
+
### DISC-EMAIL-02: Course Classification Present -- Tier 1
|
|
66
73
|
|
|
67
|
-
**Checks:**
|
|
68
|
-
**Against:**
|
|
74
|
+
**Checks:** Email asset metadata declares which Dinner Party course this email is (welcome, appetizer, main, side, dessert), and the content matches that course's intent
|
|
75
|
+
**Against:** Email asset metadata course tag and body content
|
|
69
76
|
|
|
70
77
|
#### Evaluation Criteria
|
|
71
78
|
|
|
72
|
-
1. **
|
|
73
|
-
- PASS:
|
|
74
|
-
- WARN:
|
|
75
|
-
- FAIL:
|
|
79
|
+
1. **Course declared**
|
|
80
|
+
- PASS: Metadata explicitly tags the email as one of {welcome, appetizer, main, side, dessert}
|
|
81
|
+
- WARN: Course can be unambiguously inferred from filename, sequence position, or content but is not explicitly tagged
|
|
82
|
+
- FAIL: Course cannot be determined from metadata or content — the email exists without a place in the meal
|
|
76
83
|
|
|
77
|
-
2. **
|
|
78
|
-
- PASS:
|
|
79
|
-
- WARN:
|
|
80
|
-
- FAIL:
|
|
84
|
+
2. **Course-content match**
|
|
85
|
+
- PASS: Content matches the declared course's intent (welcome sets expectations and names next step; appetizer gives value with no pitch; main course is direct product talk; side is adjacent value; dessert asks for nothing)
|
|
86
|
+
- WARN: Content mostly matches but contains one mild deviation (e.g., a welcome email with a soft secondary feature mention)
|
|
87
|
+
- FAIL: Course-content mismatch (e.g., a "welcome" email that pitches paid upgrade in the first paragraph; an "appetizer" with a hard CTA above the fold)
|
|
81
88
|
|
|
82
|
-
### DISC-EMAIL-03:
|
|
89
|
+
### DISC-EMAIL-03: No Pitch In Welcome -- Tier 1
|
|
83
90
|
|
|
84
|
-
**Checks:**
|
|
85
|
-
**Against:**
|
|
91
|
+
**Checks:** If course is "welcome", the email does not contain a direct product pitch, paid-tier promotion, or sales CTA above the signature
|
|
92
|
+
**Against:** Body content of welcome emails only (this gate is skipped for other course types)
|
|
86
93
|
|
|
87
94
|
#### Evaluation Criteria
|
|
88
95
|
|
|
89
|
-
1. **
|
|
90
|
-
- PASS:
|
|
91
|
-
- WARN:
|
|
92
|
-
- FAIL:
|
|
93
|
-
|
|
94
|
-
2. **Physical address**
|
|
95
|
-
- PASS: Physical mailing address present (required by CAN-SPAM)
|
|
96
|
-
- WARN: Address present but incomplete (e.g., city only, no street/PO Box)
|
|
97
|
-
- FAIL: No physical address present in the email
|
|
96
|
+
1. **Welcome integrity**
|
|
97
|
+
- PASS: Welcome email greets the reader, sets expectations for what's coming, names the next step, and asks for a reply or no action — no paid-tier pitch, no demo booking link, no "upgrade" CTA
|
|
98
|
+
- WARN: Welcome contains a soft mention of a paid feature in the body but the primary CTA is reply-oriented or expectation-setting
|
|
99
|
+
- FAIL: Welcome email's primary CTA is a paid-upgrade button, demo-booking link, or "buy now" action
|
|
98
100
|
|
|
99
|
-
### DISC-EMAIL-04:
|
|
101
|
+
### DISC-EMAIL-04: Single Ask -- Tier 1
|
|
100
102
|
|
|
101
|
-
**Checks:**
|
|
102
|
-
**Against:**
|
|
103
|
+
**Checks:** Body contains exactly one primary call to action — one button or one inline link presented at primary visual weight. Secondary asks are permitted only as visually subordinate text links (e.g., P.S. moves)
|
|
104
|
+
**Against:** Body content link and button inventory
|
|
103
105
|
|
|
104
106
|
#### Evaluation Criteria
|
|
105
107
|
|
|
106
|
-
1. **
|
|
107
|
-
- PASS:
|
|
108
|
-
- WARN:
|
|
109
|
-
- FAIL:
|
|
108
|
+
1. **Primary ask count**
|
|
109
|
+
- PASS: Exactly one primary CTA at full visual weight (button or bold inline link). Any other asks are clearly subordinate (smaller text links, P.S. lines, footer)
|
|
110
|
+
- WARN: One primary CTA plus one secondary that is visually close in weight (e.g., a button and a bold inline link in the same section)
|
|
111
|
+
- FAIL: Two or more competing primary CTAs at equal visual weight, OR the email has no clear primary ask at all
|
|
110
112
|
|
|
111
|
-
2. **
|
|
112
|
-
- PASS:
|
|
113
|
-
- WARN:
|
|
114
|
-
- FAIL:
|
|
113
|
+
2. **Reply-as-CTA bonus**
|
|
114
|
+
- PASS: If the email is a welcome or appetizer, the primary ask is "reply to this email" or a reply-prompting question — this is the strongest valid CTA for those courses
|
|
115
|
+
- WARN: Welcome/appetizer has a clickable CTA but no reply prompt anywhere
|
|
116
|
+
- FAIL: N/A — informational signal only
|
|
115
117
|
|
|
116
|
-
### DISC-EMAIL-05: Subject Line
|
|
118
|
+
### DISC-EMAIL-05: Subject Line Conversation Test -- Tier 1
|
|
117
119
|
|
|
118
|
-
**Checks:** Subject line and
|
|
119
|
-
**Against:**
|
|
120
|
+
**Checks:** Subject line sounds like something a human would actually write to another human. Length is short. Hype words, ALL CAPS, and stacked punctuation are absent
|
|
121
|
+
**Against:** Subject line text and known marketing-blast patterns
|
|
120
122
|
|
|
121
123
|
#### Evaluation Criteria
|
|
122
124
|
|
|
123
|
-
1. **
|
|
124
|
-
- PASS: Subject line is
|
|
125
|
-
- WARN: Subject
|
|
126
|
-
- FAIL: Subject
|
|
127
|
-
|
|
128
|
-
2. **Preview text**
|
|
129
|
-
- PASS: Preview text present, 40-130 characters, and distinct from subject line
|
|
130
|
-
- WARN: Preview text present but too short (under 40 chars), too long (over 130 chars), or repeats the subject line
|
|
131
|
-
- FAIL: No preview text specified (email client will pull first line of body copy)
|
|
132
|
-
|
|
133
|
-
### DISC-EMAIL-06: Single Clear CTA -- Tier 2
|
|
134
|
-
|
|
135
|
-
**Checks:** CTA clarity and prominence in email layout
|
|
136
|
-
**Against:** Email content structure and visual hierarchy
|
|
137
|
-
|
|
138
|
-
#### Evaluation Criteria
|
|
125
|
+
1. **Conversational length**
|
|
126
|
+
- PASS: Subject line is between 3 and 9 words AND under 50 characters (a sentence fragment a friend would type)
|
|
127
|
+
- WARN: Subject is 10-12 words or 50-70 characters — leans broadcast, may truncate on mobile
|
|
128
|
+
- FAIL: Subject is over 12 words, over 70 characters, ALL CAPS, or contains stacked punctuation (`!!`, `??`, `$$`)
|
|
139
129
|
|
|
140
|
-
|
|
141
|
-
- PASS:
|
|
142
|
-
- WARN:
|
|
143
|
-
- FAIL:
|
|
130
|
+
2. **Hype-word scan**
|
|
131
|
+
- PASS: No marketing-hype words in subject (no "free", "guarantee", "act now", "limited time", "exclusive offer", "don't miss", "winner")
|
|
132
|
+
- WARN: One borderline word with context that softens it (e.g., "free trial" in a clearly product context)
|
|
133
|
+
- FAIL: Two or more hype words, or any combination of hype + ALL CAPS + stacked punctuation
|
|
144
134
|
|
|
145
|
-
|
|
146
|
-
- PASS:
|
|
147
|
-
- WARN:
|
|
148
|
-
- FAIL:
|
|
135
|
+
3. **First-line preview test**
|
|
136
|
+
- PASS: Body's first sentence (the inbox preview slot) is a sentence written to a human — not "View in browser", not a logo alt-text, not a navigation header
|
|
137
|
+
- WARN: First line is generic but readable (e.g., "Hi there,")
|
|
138
|
+
- FAIL: First line is "View in browser", a tracking pixel reference, or a navigation/menu bar
|
|
149
139
|
|
|
150
|
-
### DISC-EMAIL-
|
|
140
|
+
### DISC-EMAIL-06: Compliance Footer -- Tier 1
|
|
151
141
|
|
|
152
|
-
**Checks:**
|
|
153
|
-
**Against:**
|
|
142
|
+
**Checks:** Legally required elements (unsubscribe link, physical mailing address, accurate sender identification) and deliverability hygiene
|
|
143
|
+
**Against:** Footer content and email asset metadata
|
|
154
144
|
|
|
155
145
|
#### Evaluation Criteria
|
|
156
146
|
|
|
157
|
-
1. **
|
|
158
|
-
- PASS:
|
|
159
|
-
- WARN:
|
|
160
|
-
- FAIL: No
|
|
147
|
+
1. **Unsubscribe**
|
|
148
|
+
- PASS: One-click unsubscribe link present, visible, and functional (one-click is required by Gmail/Yahoo for bulk senders as of Feb 2024)
|
|
149
|
+
- WARN: Unsubscribe present but requires multiple steps or is buried in small text under 8px
|
|
150
|
+
- FAIL: No unsubscribe mechanism in the email
|
|
161
151
|
|
|
162
|
-
2. **
|
|
163
|
-
- PASS:
|
|
164
|
-
- WARN:
|
|
165
|
-
- FAIL: No
|
|
152
|
+
2. **Physical address**
|
|
153
|
+
- PASS: Physical mailing address present (street address, suite, or PO Box). CAN-SPAM requirement
|
|
154
|
+
- WARN: Partial address (city/country only, no street or PO Box)
|
|
155
|
+
- FAIL: No physical address present
|
|
166
156
|
|
|
167
|
-
3. **
|
|
168
|
-
- PASS: `dig TXT
|
|
169
|
-
- WARN:
|
|
170
|
-
- FAIL:
|
|
157
|
+
3. **DNS authentication (sending domain)**
|
|
158
|
+
- PASS: `dig TXT {domain}` confirms valid SPF (`v=spf1` with ESP include), DKIM (`v=DKIM1; k=rsa; p=...` at the ESP's selector), and DMARC (`p=quarantine` or `p=reject`) records
|
|
159
|
+
- WARN: All three records exist but DMARC is `p=none` (monitoring only, not enforcing)
|
|
160
|
+
- FAIL: Any of SPF, DKIM, or DMARC missing for the sending domain
|
|
171
161
|
|
|
172
162
|
---
|
|
173
163
|
|
|
@@ -175,132 +165,204 @@ Every email must include:
|
|
|
175
165
|
|
|
176
166
|
| Base Gate ID | Default Tier | Override Tier | Reason |
|
|
177
167
|
|-------------|-------------|---------------|--------|
|
|
178
|
-
| GATE-07 | Tier 2 (advisory) | Tier 1 (blocking) | Email compliance (CAN-SPAM, GDPR) is legally required
|
|
168
|
+
| GATE-07 | Tier 2 (advisory) | Tier 1 (blocking) | Email compliance (CAN-SPAM, GDPR, CASL, Gmail/Yahoo bulk-sender rules) is legally required and directly tied to inbox placement. A compliance miss is not advisory — it harms every future send from the same domain. |
|
|
179
169
|
|
|
180
170
|
---
|
|
181
171
|
|
|
182
172
|
## Format Rules
|
|
183
173
|
|
|
184
|
-
|
|
174
|
+
Geisler-style format rules. Each one exists to keep the email feeling like a dinner conversation, not a brochure.
|
|
185
175
|
|
|
186
|
-
- **
|
|
187
|
-
- **
|
|
188
|
-
- **
|
|
189
|
-
- **
|
|
190
|
-
- **
|
|
191
|
-
- **
|
|
192
|
-
- **
|
|
193
|
-
- **
|
|
194
|
-
- **
|
|
195
|
-
- **
|
|
176
|
+
- **From-name:** A human name + brand suffix. Never a team string. Never `noreply`.
|
|
177
|
+
- **Subject line:** 3-9 words, under 50 characters. Sentence-fragment voice. No ALL CAPS. No stacked punctuation. No hype words.
|
|
178
|
+
- **Preview text:** 40-130 characters, distinct from subject, extends the subject's promise. If left blank the inbox will pull "View in browser" — do not let that happen.
|
|
179
|
+
- **First body line:** A sentence written to a person. Not a logo. Not a banner. Not a menu bar.
|
|
180
|
+
- **Body length:** Short. A welcome email is 60-150 words. An appetizer is 80-250 words. A main course can be longer but stays under 500 words. Dessert is often the shortest of all — 40-100 words.
|
|
181
|
+
- **Layout:** Single column. Plain-text-feel even when HTML. Logo at the bottom, not the top.
|
|
182
|
+
- **CTA:** One primary ask. Button or inline link at primary weight. Action-oriented verb ("Reply with your one stuck point", "Watch the 90-second demo", "Pick a time"). Never "Click here." Never "Learn more."
|
|
183
|
+
- **Reply path:** From-address accepts replies. A human reads them.
|
|
184
|
+
- **Link count:** Under 10 unique URLs. Most appetizers should have 0-2 links total.
|
|
185
|
+
- **Image ratio:** Text-dominant. The email must read end-to-end with images off. Every image carries descriptive alt text.
|
|
186
|
+
- **Compliance footer:** Unsubscribe + physical address + sender identification. Every email. Every time.
|
|
196
187
|
|
|
197
188
|
---
|
|
198
189
|
|
|
199
190
|
## Examples
|
|
200
191
|
|
|
201
|
-
### Good
|
|
192
|
+
### Good — Welcome (the host moment)
|
|
202
193
|
|
|
203
194
|
```
|
|
204
|
-
|
|
205
|
-
|
|
195
|
+
From: Val from Fix My Churn <val@fixmychurn.com>
|
|
196
|
+
Subject: you're in — here's what happens next (6 words, 36 chars)
|
|
197
|
+
Preview: A note from me, plus the one thing I'd love for you to do.
|
|
198
|
+
|
|
199
|
+
Hey {first_name} —
|
|
200
|
+
|
|
201
|
+
Val here. Real human, currently drinking coffee that's gone cold.
|
|
202
|
+
|
|
203
|
+
You just joined Fix My Churn. Here is what to expect from me:
|
|
206
204
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
205
|
+
- One email every Tuesday. Short. About one churn pattern I see this week.
|
|
206
|
+
- Zero pitches in the next three emails. I want to be useful first.
|
|
207
|
+
- After that, I'll occasionally mention the Incubator — only when it
|
|
208
|
+
actually fits what you wrote me about.
|
|
210
209
|
|
|
211
|
-
|
|
210
|
+
One ask, and it's not a button:
|
|
212
211
|
|
|
213
|
-
|
|
212
|
+
Hit reply and tell me the single stuck point in your retention right now.
|
|
213
|
+
One sentence is plenty. I read every reply myself.
|
|
214
214
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
3. Your top-performing rep closed 4 deals this week
|
|
215
|
+
Talk soon,
|
|
216
|
+
Val
|
|
218
217
|
|
|
219
|
-
|
|
218
|
+
P.S. If Tuesday isn't your day, you can unsubscribe at the bottom and
|
|
219
|
+
I will not be offended — I'd rather you stay because you want to.
|
|
220
220
|
|
|
221
221
|
---
|
|
222
|
-
|
|
222
|
+
Fix My Churn · 123 Real Street, Real City, MA 02114
|
|
223
|
+
Unsubscribe (one-click)
|
|
223
224
|
```
|
|
224
225
|
|
|
225
|
-
**Why it works:**
|
|
226
|
+
**Why it works:** Course = welcome, explicitly. Sender is a person, reply-capable. No pitch. Single ask is a reply. Subject is 6 words and sounds like a text message. First body line is "Hey {first_name} —", not a logo. P.S. handles compliance without breaking voice.
|
|
226
227
|
|
|
227
|
-
### Good
|
|
228
|
+
### Good — Churn-recovery (dessert that doubles as save)
|
|
228
229
|
|
|
229
230
|
```
|
|
230
|
-
|
|
231
|
-
|
|
231
|
+
From: Val from Fix My Churn <val@fixmychurn.com>
|
|
232
|
+
Subject: did something go sideways? (4 words, 29 chars)
|
|
233
|
+
Preview: No pitch. Just checking in — and a way out if you need it.
|
|
232
234
|
|
|
233
|
-
|
|
235
|
+
Hey {first_name},
|
|
234
236
|
|
|
235
|
-
|
|
237
|
+
I noticed your account moved to canceled yesterday. I'm not writing to
|
|
238
|
+
talk you out of it. I'm writing because I'd genuinely like to know what
|
|
239
|
+
happened, so I can either fix it for the next person or learn that we
|
|
240
|
+
weren't the right fit.
|
|
236
241
|
|
|
237
|
-
|
|
242
|
+
If you have 30 seconds, hit reply with one of these:
|
|
238
243
|
|
|
239
|
-
|
|
240
|
-
|
|
244
|
+
A. Wrong tool for what I needed
|
|
245
|
+
B. Too expensive for the value I got
|
|
246
|
+
C. Something else (please say what)
|
|
247
|
+
|
|
248
|
+
Whatever you say, I'll read it. No follow-up sales sequence.
|
|
249
|
+
|
|
250
|
+
— Val
|
|
241
251
|
|
|
242
252
|
---
|
|
243
|
-
|
|
253
|
+
Fix My Churn · 123 Real Street, Real City, MA 02114
|
|
254
|
+
Unsubscribe (one-click)
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Why it works:** Behavior-triggered (cancellation event). Course = dessert / save. No CTA button — the reply IS the CTA. Customer-language options. Promises no follow-up sales sequence and means it.
|
|
258
|
+
|
|
259
|
+
### Good — Broadcast appetizer
|
|
260
|
+
|
|
244
261
|
```
|
|
262
|
+
From: Val from Fix My Churn <val@fixmychurn.com>
|
|
263
|
+
Subject: the 4-word welcome email test (6 words, 32 chars)
|
|
264
|
+
Preview: If your welcome email fails this, your churn starts on day one.
|
|
265
|
+
|
|
266
|
+
Hey {first_name},
|
|
267
|
+
|
|
268
|
+
Quick test you can run on your own welcome email in 10 seconds.
|
|
269
|
+
|
|
270
|
+
Open it. Read it out loud. If the first four words sound like something
|
|
271
|
+
a marketing department would say — "We're so excited to..." — your guest
|
|
272
|
+
just walked into a sales pitch instead of a dinner party.
|
|
245
273
|
|
|
246
|
-
|
|
274
|
+
The fix is short. The first four words should pass this test:
|
|
247
275
|
|
|
248
|
-
|
|
276
|
+
"Could a human have actually typed this to one other human?"
|
|
249
277
|
|
|
278
|
+
That's the whole thing for this week.
|
|
279
|
+
|
|
280
|
+
— Val
|
|
281
|
+
|
|
282
|
+
P.S. If you want the full Welcome Email Audit checklist I use with
|
|
283
|
+
Incubator members, hit reply with the word "audit" and I'll send it over.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
Fix My Churn · 123 Real Street, Real City, MA 02114
|
|
287
|
+
Unsubscribe (one-click)
|
|
250
288
|
```
|
|
251
|
-
Subject: FREE GUARANTEED RESULTS!!! Act Now -- Limited Time Offer!!!
|
|
252
|
-
Preview: Don't miss this incredible opportunity to save BIG $$$
|
|
253
289
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
290
|
+
**Why it works:** Course = appetizer. One idea. No button. P.S. is the soft ask, gated on a reply (still single-ask). Generosity-first — the test is given fully in the body, the checklist offer is optional dessert.
|
|
291
|
+
|
|
292
|
+
### Bad — Corporate broadcast ("the buffet line")
|
|
293
|
+
|
|
294
|
+
```
|
|
295
|
+
From: The Acme Marketing Team <marketing@acme.io>
|
|
296
|
+
Subject: 🎉 HUGE NEWS FROM ACME! Don't miss our biggest launch ever!!! 🎉
|
|
297
|
+
Preview: (none — pulls "View in browser | Update preferences | Acme Logo")
|
|
298
|
+
|
|
299
|
+
[Hero image: 1200x600 product render, no alt text]
|
|
300
|
+
[Three side-by-side CTA buttons of identical weight:
|
|
301
|
+
"Start Free Trial" | "Book a Demo" | "Download the eBook"]
|
|
302
|
+
[Body is 90% image, ~30 words of text]
|
|
303
|
+
[Footer: 6px gray unsubscribe link in #DDDDDD on #FFFFFF]
|
|
258
304
|
```
|
|
259
305
|
|
|
260
|
-
**Why it fails:** DISC-EMAIL-01 FAIL
|
|
306
|
+
**Why it fails:** Sender is a team string (DISC-EMAIL-01 FAIL). No course classification — and the content is incoherent as any course (DISC-EMAIL-02 FAIL). Three competing primary CTAs (DISC-EMAIL-04 FAIL). Subject is 11 words, ALL CAPS, stacked punctuation, hype words (DISC-EMAIL-05 FAIL). First line is "View in browser" (DISC-EMAIL-05 FAIL again). Image-heavy. Footer is hidden. This is a broadcast, not a dinner conversation — and the inbox will treat it accordingly.
|
|
261
307
|
|
|
262
|
-
### Bad
|
|
308
|
+
### Bad — "Newsletter"-branded image-heavy mailer
|
|
263
309
|
|
|
264
310
|
```
|
|
265
|
-
|
|
266
|
-
|
|
311
|
+
From: Acme Newsletter <newsletter@acme.io>
|
|
312
|
+
Subject: 📰 The Acme Newsletter — Issue #47 — November 2026 Edition
|
|
313
|
+
Preview: (none)
|
|
267
314
|
|
|
268
|
-
[
|
|
269
|
-
[
|
|
270
|
-
[No
|
|
271
|
-
[Unsubscribe link in tiny 8px gray text]
|
|
315
|
+
[Banner image with "THE ACME NEWSLETTER" in 72pt type]
|
|
316
|
+
[Five sections, each with its own image header and its own CTA button]
|
|
317
|
+
[No reply path — noreply@ in headers]
|
|
272
318
|
```
|
|
273
319
|
|
|
274
|
-
**Why it fails:**
|
|
320
|
+
**Why it fails:** Calling it a "newsletter" sets the reader's mental category to "marketing material I can ignore" before they read a word. Five competing CTAs (DISC-EMAIL-04 FAIL). `noreply@` (DISC-EMAIL-01 FAIL). Subject leads with an emoji and a magazine-style edition number — nobody texts their friend "📰 Issue #47." No course classification. The reader has been served a buffet of cold appetizers instead of a meal.
|
|
275
321
|
|
|
276
322
|
---
|
|
277
323
|
|
|
278
324
|
## Anti-Patterns
|
|
279
325
|
|
|
280
|
-
1. **
|
|
326
|
+
1. **Pitching in the welcome.** The single most common Geisler-named failure. The welcome is the host moment. Selling in the welcome is greeting a dinner guest with a sales contract on the doormat. Welcome emails set the tone for every email that follows — burning that moment burns the entire program.
|
|
327
|
+
|
|
328
|
+
2. **Day-N drip schedules.** "Day 1, day 3, day 7" treats every signup like every other signup. The user who invited five teammates on day one and the user who never logged in get the same email. Lifecycle is behavior, not time. If you cannot name the user behavior that triggered the email, you do not have a lifecycle — you have a calendar.
|
|
329
|
+
|
|
330
|
+
3. **"The {Brand} Team" or `noreply@` from-lines.** Brands cannot greet guests. People can. A from-line that hides the human kills the reply path before the reader even decides whether to open. Reply rate is the single most underrated email KPI; `noreply@` makes it zero by design.
|
|
281
331
|
|
|
282
|
-
|
|
332
|
+
4. **Image-only / "newsletter"-branded layouts.** A heavy-HTML mailer with a hero banner, a magazine masthead, and five buttons sets the reader's mental category to "marketing" the moment the preview pane loads. Plain-text-feel emails get read; magazine layouts get archived.
|
|
283
333
|
|
|
284
|
-
|
|
334
|
+
5. **Multiple competing CTAs at equal weight.** A guest can answer one question at a time. Three buttons next to each other dilute every click. One primary ask per email, always.
|
|
285
335
|
|
|
286
|
-
|
|
336
|
+
6. **"Hi {first_name}!" with nothing behind it.** Personalization tokens with no actual personalization are the email equivalent of a stranger using your name at a networking event. The token is fine only when the rest of the email reads as something a real person could have written specifically to a real reader.
|
|
287
337
|
|
|
288
|
-
|
|
338
|
+
7. **Marketing language over customer language.** "Leverage our cutting-edge platform to unlock enterprise-grade outcomes" is a sentence no customer ever spoke. Mine support tickets, sales calls, and onboarding chats. Use customer phrases verbatim. The body should sound like the reader's own vocabulary read back to them.
|
|
289
339
|
|
|
290
|
-
|
|
340
|
+
8. **No reply path / no dessert course.** Programs that only send pre-purchase emails optimize for acquisition and starve retention. Dessert — anniversary, check-in, "anything I can fix?" emails that ask for nothing — is what makes guests come back. Most B2B SaaS programs never serve it. That is why their churn graphs trend the way they do.
|
|
291
341
|
|
|
292
|
-
|
|
342
|
+
9. **Batch-and-blast broadcasts.** Sending the same email to every contact at the same time treats the list as an audience instead of as guests at a table. Segment by behavior. Send fewer emails to more specific people.
|
|
293
343
|
|
|
294
344
|
---
|
|
295
345
|
|
|
296
346
|
## Metrics
|
|
297
347
|
|
|
298
|
-
|
|
348
|
+
Geisler reorders the conventional email metric stack. Reply rate and retention sit above open rate.
|
|
349
|
+
|
|
350
|
+
- **Reply rate (KPI).** The strongest signal email can produce. Welcome and appetizer courses should specifically engineer for replies — the primary ask is often a reply. Target: 2-5% reply rate on welcome emails; 0.5-2% on appetizer broadcasts. Below 0.5% across courses means the email reads as a broadcast, not a conversation.
|
|
351
|
+
- **Retention / churn rate (KPI).** Lifecycle email's actual job. Measure cancellation rate, downgrade rate, and dormant-account rate in the cohort that received the program vs. the cohort that did not. Dessert-course emails earn their place against this metric.
|
|
352
|
+
- **Expansion revenue from email.** The main-course test. What percentage of upgrades, seat-adds, and plan-changes can be attributed to a specific main-course email? Geisler's bar: main-course emails should drive measurable expansion, not just opens.
|
|
353
|
+
- **Open rate.** Useful but downgraded — Apple Mail Privacy Protection inflates this number for ~40% of opens. Use it for subject-line A/B comparisons, never as a primary success metric. Benchmark: 25-45% for behavior-triggered sends; lower for broadcast.
|
|
354
|
+
- **Click-through rate.** Useful when the email has a real button. Less meaningful when the primary ask is a reply (clicks ≈ 0 by design). Always interpret CTR in the context of the course type.
|
|
355
|
+
- **Unsubscribe rate.** Healthy floor; do not drive to zero. An unsubscribe is a guest politely leaving the dinner — far better than a guest staying and ignoring you. Target: under 0.5% per send.
|
|
356
|
+
- **Spam complaint rate.** Hard ceiling. Must stay under 0.1% (Gmail/Yahoo enforcement threshold). A single bad send above this floor can damage the sending domain for months.
|
|
357
|
+
- **DNS authentication pass rate.** SPF/DKIM/DMARC alignment per ESP reports. Target: 100%.
|
|
358
|
+
- **Dinner-party feel (qualitative).** Pull 5 random emails from the last quarter. Read each aloud at a real table. Does it sound like a host or a megaphone? This is not a number, but it is the only metric Geisler herself trusts to detect drift before the quantitative metrics do.
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Sources
|
|
299
363
|
|
|
300
|
-
-
|
|
301
|
-
-
|
|
302
|
-
-
|
|
303
|
-
-
|
|
304
|
-
-
|
|
305
|
-
- **DNS authentication pass rate:** SPF/DKIM/DMARC alignment percentage from ESP reports. Target: 100% alignment.
|
|
306
|
-
- **Bounce rate:** List hygiene indicator. Hard bounces above 2% signal list quality issues.
|
|
364
|
+
- Val Geisler — official site & writing index: https://www.valgeisler.com/
|
|
365
|
+
- MicroConf talk archive (Val Geisler, "The Dinner Party Strategy" foundational talk): https://microconf.gen.co/val-geisler/
|
|
366
|
+
- Fix My Churn Incubator (productized lifecycle-email program — the canonical application of the framework): https://fixmychurn.com/incubator/
|
|
367
|
+
- Val Geisler on LinkedIn — "lifecycle marketing is a misnomer if it's time-based" (behavior-trigger principle): https://www.linkedin.com/posts/lovevalgeisler_lifecycle-marketing-is-a-misnomer-if-in-activity-7057708444811755521-LmxB
|
|
368
|
+
- Churn.fm podcast — Val Geisler on customer-language email strategy: https://www.churn.fm/episode/customer-email-strategy
|