Changelog as Marketing
Position in workflow: v0.8 Release Planning → v0.8 Changelog as Marketing → v0.9 Launch Channels (ORB)
Execution Mode
Default is standard. See .claude/rules/08-skill-execution-modes.md for selection logic.
| Mode |
What this skill produces |
| quick |
One release format (markdown for site); one channel mapping; minimum-viable changelog page |
| standard |
Release categorization + 2–3 channel mappings; per-channel format templates; publish cadence; attribution plan |
| deep |
Full categorization taxonomy; format templates for all relevant channels (email, blog, Twitter, LinkedIn, RSS, Slack); cadence + voice guide; KPI- attribution per channel |
What This Does
Treats the changelog as a distribution surface, not an engineering record. Each shipped release becomes a content artifact that lands across Owned and Rented channels with minimal extra effort. This is the bridge between v0.8 (what shipped) and v0.9 (where it gets told).
Done well, this is one of the highest-leverage Owned-channel investments — Stripe, Linear, Vercel, and Sentry have shown that an opinionated changelog drives ongoing inbound that compounds over years. Done badly, it's a dumping ground for "fixed bug X" that nobody reads.
How It Works
- Define the changelog audience(s) — Engineering changelogs (for users running self-hosted or integrating an API), customer-facing changelogs (for end-users), and internal changelogs (for the team) have different shapes. Anchor to the Positioning best-fit segment.
- Categorize release content — Each shipped item gets a category:
- New feature (publish loudly)
- Improvement (publish, briefly)
- Breaking change (publish, prominently, with migration path)
- Deprecation (publish, with timeline)
- Fix (publish only if user-visible)
- Internal (don't publish externally)
- Map categories to channels — Each category gets a channel destination from the ORB mix:
- New feature → Blog post + email + Twitter + LinkedIn
- Breaking change → Email (high-priority) + RSS + blog
- Improvement → Blog (digest) + Twitter (digest)
- Fix → Changelog page only
- Build per-channel format templates — Each channel has a length/tone constraint:
- Email: subject line + 2-paragraph body + CTA
- Blog: full writeup, screenshots, code samples
- Twitter/X: 280 chars, one image
- LinkedIn: 1,000-1,500 chars, professional voice
- Slack/Discord: short with link to blog
- RSS: full content for engineering audiences
- Set publish cadence — Per-release (every shipped release publishes immediately) vs. digest (weekly/monthly roll-up). Most teams need both: per-release for big things, digest for the rest.
- Plan attribution — Every channel-published release gets a UTM. Track changelog → signup conversion to identify which categories convert.
Example
A developer-tools product ships:
| Item |
Category |
Channels |
New /api/v2/webhooks endpoint |
New feature |
Blog (full), email, Twitter, LinkedIn, RSS |
/api/v1/webhooks deprecation (sunset in 6mo) |
Deprecation |
Email (high-priority), blog, RSS |
| 30% faster response time on heavy queries |
Improvement |
Twitter, weekly digest |
| Fixed: webhook signing edge case |
Fix |
Changelog page only |
| Internal: refactored auth middleware |
Internal |
(none) |
Tuesday publish:
- Blog post: "Webhooks v2 is live — here's what changed and how to migrate"
- Email to API customers (segment-targeted, not full list): "Action needed: webhook v1 sunset"
- Twitter: "Webhooks v2 ships today. v1 is sunset in 6 months. Migration guide: [link]"
- Changelog page: all five items (including the fix and internal note marked appropriately)
What You Get Back
- MON-CHG-* changelog entries (one per shipped release) — Master record with category, audience, channel mapping, links to per-channel publications
- GTM-CHG-* per-channel formats (one per channel) — Templates and example content
- Publish cadence schedule — Per-release vs. digest decisions
- KPI attribution plan — UTMs and conversion tracking
When to Use It
| Trigger |
Mode |
| First release post-launch (no changelog system yet) |
quick |
| Standard launch cadence stabilizing |
standard |
| Pre-investor / pre-Series A — changelog as proof of velocity |
deep |
| API or developer-tool product |
deep (changelog is a primary surface) |
| One-time announcements (acquisition, big feature) |
standard |
Consumes
- DEP-* release entries (from v0.8 Release Planning) — What's being released, when
- FEA-* features (from v0.3) — What new features exist; categorization input
- GTM-* channel mix (from v0.9 Launch Channels ORB, when available) — Where to publish
- GTM-* positioning (from v0.9 Positioning, when available) — Voice and tone constraints
- PER-* best-fit characteristics — Audience tone calibration
- KPI-* baselines — Attribution targets
When this skill runs before v0.9 has executed, channel mapping uses placeholder channels and is reconciled when v0.9 channels are finalized.
Produces
- MON-CHG-* entries in
SoT/SoT.DEPLOYMENT.md (or a dedicated SoT/SoT.CHANGELOG.md if release volume warrants)
- GTM-CHG-* entries with
Type=Channel-Changelog (per-channel format templates)
- CFD-* gaps surfaced — If a release category lacks an obvious channel mapping, log as research gap
Output Template
MON-CHG-XXX: Release — [Release name / version]
Type: Changelog
Date: YYYY-MM-DD
Owner: [Person / role]
Status: [Drafted | Reviewed | Published]
Released items:
- [Item 1] — Category: [New feature | Improvement | Breaking change | Deprecation | Fix | Internal]
- [Item 2] — Category: ...
Audience: [API customers | All users | Internal team | Mixed]
Channel publications:
- Blog: [URL or "scheduled YYYY-MM-DD"]
- Email: [Segment + scheduled date]
- Twitter: [Scheduled date]
- LinkedIn: [Scheduled date]
- Changelog page: [Updated YYYY-MM-DD]
Attribution: utm_campaign=changelog-<version>
Linked IDs: DEP-AAA (release), FEA-BBB (features shipped), GTM-CHG-CCC (channel formats), KPI-DDD (attribution)
GTM-CHG-XXX: Channel Format — [Channel name]
Type: Channel-Changelog
Channel: [Blog | Email | Twitter | LinkedIn | RSS | Slack]
Owner: [Person / role]
Format constraints:
Length: [chars / words / sections]
Tone: [Conversational | Technical | Formal — anchored in Positioning voice]
Visuals: [Required / optional]
CTA: [Specific action expected]
Template:
[Reusable template for this channel, with variable placeholders]
Example (most recent use):
[Concrete example from MON-CHG-XXX]
Publish trigger: [Per-release | Weekly digest | Monthly digest]
Linked IDs: MON-CHG-AAA (latest use), GTM-YYY (positioning voice)
Anti-Patterns
| Pattern |
Signal |
Fix |
| Dumping internal commits |
Changelog reads like git log |
Categorize; publish only what users care about |
| Same content everywhere |
Same blog post copy-pasted to Twitter and LinkedIn |
Each channel has its own format constraints; honor them |
| Vague feature claims |
"Various improvements" |
Name the specific change; "30% faster heavy queries" beats "performance improvements" |
| Engineering-only voice |
Customer changelog uses internal jargon |
Tone-shift per audience; engineer changelog ≠ end-user changelog |
| No attribution |
Changelog publishes but no idea what converts |
UTM every link; track per-channel conversion |
| Sporadic cadence |
Publish heavily for 2 months, then quiet for 6 |
Pick per-release or digest cadence; commit to it |
| Breaking change buried |
Hidden in a sea of small items |
Breaking changes get a dedicated, prominent slot |
Quality Gates
Before publishing the first release:
Downstream Connections
| Consumer |
What it uses |
Example |
| Launch Channels (ORB) |
Changelog is an Owned channel; rolls into mix matrix |
Blog-changelog = Owned-content |
| Launch Metrics |
Per-channel changelog conversion targets |
KPI-changelog-blog-signups |
| Feedback Loop Setup |
Changelog reader comments become CFD- |
Blog comment threads → CFD- pattern |
| AEO Audit |
High-traffic changelog posts become AI citation sources |
Changelog entries cited by AI search |
| v1.0 Case Study Builder |
Shipped features in changelog feed case study material |
"How we use [feature] at [customer]" |
Detailed References
- Stripe changelog: stripe.com/changelog — the canonical example
- Linear changelog: linear.app/changelog — opinionated voice
- Vercel changelog: vercel.com/changelog — visual-heavy
- jonathimer's
changelog-updates skill (devmarketing-skills)
- (No bundled
references/ — read the source examples for current best practice)
1---2name: prd-v08-changelog-as-marketing3description: Design the changelog as a distribution surface bridging engineering releases (DEP-/FEA-) to marketing channels (GTM-) during PRD v0.8 Deployment & Ops. Triggers on requests to set up a changelog system, publish releases, or when user asks "how should we publish releases?", "changelog as marketing", "release notes", "Stripe-style changelog", "what to do with our release notes", "ship and tell". Outputs MON-CHG-* changelog entries and per-channel formats.4---5
6# Changelog as Marketing
7
8Position in workflow: v0.8 Release Planning → **v0.8 Changelog as Marketing** → v0.9 Launch Channels (ORB)
9
10## Execution Mode
11
12Default is **standard**. See [`.claude/rules/08-skill-execution-modes.md`](../../rules/08-skill-execution-modes.md) for selection logic.
13
14| Mode | What this skill produces |
15|------|--------------------------|
16| **quick** | One release format (markdown for site); one channel mapping; minimum-viable changelog page |
17| **standard** | Release categorization + 2–3 channel mappings; per-channel format templates; publish cadence; attribution plan |
18| **deep** | Full categorization taxonomy; format templates for all relevant channels (email, blog, Twitter, LinkedIn, RSS, Slack); cadence + voice guide; KPI- attribution per channel |
19
20## What This Does
21
22Treats the changelog as a **distribution surface**, not an engineering record. Each shipped release becomes a content artifact that lands across Owned and Rented channels with minimal extra effort. This is the bridge between v0.8 (what shipped) and v0.9 (where it gets told).
23
24Done well, this is one of the highest-leverage Owned-channel investments — Stripe, Linear, Vercel, and Sentry have shown that an opinionated changelog drives ongoing inbound that compounds over years. Done badly, it's a dumping ground for "fixed bug X" that nobody reads.
25
26## How It Works
27
281. **Define the changelog audience(s)** — Engineering changelogs (for users running self-hosted or integrating an API), customer-facing changelogs (for end-users), and internal changelogs (for the team) have different shapes. Anchor to the Positioning best-fit segment.
292. **Categorize release content** — Each shipped item gets a category:
30 - **New feature** (publish loudly)
31 - **Improvement** (publish, briefly)
32 - **Breaking change** (publish, prominently, with migration path)
33 - **Deprecation** (publish, with timeline)
34 - **Fix** (publish only if user-visible)
35 - **Internal** (don't publish externally)
363. **Map categories to channels** — Each category gets a channel destination from the ORB mix:
37 - New feature → Blog post + email + Twitter + LinkedIn
38 - Breaking change → Email (high-priority) + RSS + blog
39 - Improvement → Blog (digest) + Twitter (digest)
40 - Fix → Changelog page only
414. **Build per-channel format templates** — Each channel has a length/tone constraint:
42 - Email: subject line + 2-paragraph body + CTA
43 - Blog: full writeup, screenshots, code samples
44 - Twitter/X: 280 chars, one image
45 - LinkedIn: 1,000-1,500 chars, professional voice
46 - Slack/Discord: short with link to blog
47 - RSS: full content for engineering audiences
485. **Set publish cadence** — Per-release (every shipped release publishes immediately) vs. digest (weekly/monthly roll-up). Most teams need both: per-release for big things, digest for the rest.
496. **Plan attribution** — Every channel-published release gets a UTM. Track changelog → signup conversion to identify which categories convert.
50
51## Example
52
53A developer-tools product ships:
54
55| Item | Category | Channels |
56|------|----------|----------|
57| New `/api/v2/webhooks` endpoint | New feature | Blog (full), email, Twitter, LinkedIn, RSS |
58| `/api/v1/webhooks` deprecation (sunset in 6mo) | Deprecation | Email (high-priority), blog, RSS |
59| 30% faster response time on heavy queries | Improvement | Twitter, weekly digest |
60| Fixed: webhook signing edge case | Fix | Changelog page only |
61| Internal: refactored auth middleware | Internal | (none) |
62
63Tuesday publish:
64- Blog post: "Webhooks v2 is live — here's what changed and how to migrate"
65- Email to API customers (segment-targeted, not full list): "Action needed: webhook v1 sunset"
66- Twitter: "Webhooks v2 ships today. v1 is sunset in 6 months. Migration guide: [link]"
67- Changelog page: all five items (including the fix and internal note marked appropriately)
68
69## What You Get Back
70
71- **MON-CHG-\* changelog entries** (one per shipped release) — Master record with category, audience, channel mapping, links to per-channel publications
72- **GTM-CHG-\* per-channel formats** (one per channel) — Templates and example content
73- **Publish cadence schedule** — Per-release vs. digest decisions
74- **KPI attribution plan** — UTMs and conversion tracking
75
76## When to Use It
77
78| Trigger | Mode |
79|---------|------|
80| First release post-launch (no changelog system yet) | quick |
81| Standard launch cadence stabilizing | standard |
82| Pre-investor / pre-Series A — changelog as proof of velocity | deep |
83| API or developer-tool product | deep (changelog is a primary surface) |
84| One-time announcements (acquisition, big feature) | standard |
85
86## Consumes
87
88- **DEP-\* release entries** (from v0.8 Release Planning) — What's being released, when
89- **FEA-\* features** (from v0.3) — What new features exist; categorization input
90- **GTM-\* channel mix** (from v0.9 Launch Channels ORB, when available) — Where to publish
91- **GTM-\* positioning** (from v0.9 Positioning, when available) — Voice and tone constraints
92- **PER-\* best-fit characteristics** — Audience tone calibration
93- **KPI-\* baselines** — Attribution targets
94
95> When this skill runs before v0.9 has executed, channel mapping uses placeholder channels and is reconciled when v0.9 channels are finalized.
96
97## Produces
98
99- **MON-CHG-\* entries** in `SoT/SoT.DEPLOYMENT.md` (or a dedicated `SoT/SoT.CHANGELOG.md` if release volume warrants)
100- **GTM-CHG-\* entries** with `Type=Channel-Changelog` (per-channel format templates)
101- **CFD-\* gaps surfaced** — If a release category lacks an obvious channel mapping, log as research gap
102
103## Output Template
104
105```
106MON-CHG-XXX: Release — [Release name / version]
107Type: Changelog
108Date: YYYY-MM-DD
109Owner: [Person / role]
110Status: [Drafted | Reviewed | Published]
111
112Released items:
113 - [Item 1] — Category: [New feature | Improvement | Breaking change | Deprecation | Fix | Internal]
114 - [Item 2] — Category: ...
115
116Audience: [API customers | All users | Internal team | Mixed]
117
118Channel publications:
119 - Blog: [URL or "scheduled YYYY-MM-DD"]
120 - Email: [Segment + scheduled date]
121 - Twitter: [Scheduled date]
122 - LinkedIn: [Scheduled date]
123 - Changelog page: [Updated YYYY-MM-DD]
124
125Attribution: utm_campaign=changelog-<version>
126
127Linked IDs: DEP-AAA (release), FEA-BBB (features shipped), GTM-CHG-CCC (channel formats), KPI-DDD (attribution)
128```
129
130```
131GTM-CHG-XXX: Channel Format — [Channel name]
132Type: Channel-Changelog
133Channel: [Blog | Email | Twitter | LinkedIn | RSS | Slack]
134Owner: [Person / role]
135
136Format constraints:
137 Length: [chars / words / sections]
138 Tone: [Conversational | Technical | Formal — anchored in Positioning voice]
139 Visuals: [Required / optional]
140 CTA: [Specific action expected]
141
142Template:
143 [Reusable template for this channel, with variable placeholders]
144
145Example (most recent use):
146 [Concrete example from MON-CHG-XXX]
147
148Publish trigger: [Per-release | Weekly digest | Monthly digest]
149
150Linked IDs: MON-CHG-AAA (latest use), GTM-YYY (positioning voice)
151```
152
153## Anti-Patterns
154
155| Pattern | Signal | Fix |
156|---------|--------|-----|
157| **Dumping internal commits** | Changelog reads like `git log` | Categorize; publish only what users care about |
158| **Same content everywhere** | Same blog post copy-pasted to Twitter and LinkedIn | Each channel has its own format constraints; honor them |
159| **Vague feature claims** | "Various improvements" | Name the specific change; "30% faster heavy queries" beats "performance improvements" |
160| **Engineering-only voice** | Customer changelog uses internal jargon | Tone-shift per audience; engineer changelog ≠ end-user changelog |
161| **No attribution** | Changelog publishes but no idea what converts | UTM every link; track per-channel conversion |
162| **Sporadic cadence** | Publish heavily for 2 months, then quiet for 6 | Pick per-release or digest cadence; commit to it |
163| **Breaking change buried** | Hidden in a sea of small items | Breaking changes get a dedicated, prominent slot |
164
165## Quality Gates
166
167Before publishing the first release:
168
169- [ ] Audience(s) defined (engineering, customer-facing, internal — separately if needed)
170- [ ] Categorization scheme exists (at minimum: new / improvement / breaking / fix)
171- [ ] Channel mapping table exists (categories → channels)
172- [ ] Per-channel format templates exist
173- [ ] Publish cadence committed
174- [ ] Attribution plan (UTM convention) defined
175- [ ] Voice/tone honors GTM- positioning (if v0.9 is done)
176
177## Downstream Connections
178
179| Consumer | What it uses | Example |
180|----------|--------------|---------|
181| **Launch Channels (ORB)** | Changelog is an Owned channel; rolls into mix matrix | Blog-changelog = Owned-content |
182| **Launch Metrics** | Per-channel changelog conversion targets | KPI-changelog-blog-signups |
183| **Feedback Loop Setup** | Changelog reader comments become CFD- | Blog comment threads → CFD- pattern |
184| **AEO Audit** | High-traffic changelog posts become AI citation sources | Changelog entries cited by AI search |
185| **v1.0 Case Study Builder** | Shipped features in changelog feed case study material | "How we use [feature] at [customer]" |
186
187## Detailed References
188
189- Stripe changelog: [stripe.com/changelog](https://stripe.com/changelog) — the canonical example
190- Linear changelog: [linear.app/changelog](https://linear.app/changelog) — opinionated voice
191- Vercel changelog: [vercel.com/changelog](https://vercel.com/changelog) — visual-heavy
192- jonathimer's `changelog-updates` skill (devmarketing-skills)
193- (No bundled `references/` — read the source examples for current best practice)