/winback-engine
Find dormant subscribers, segment by historical value, draft personalized winback emails per tier, and identify suppression candidates
$ npx -y skills add cognyai/claude-code-marketing-skills --skill winback-engine --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/winback-engine
Context preview
The summary Claude sees to decide when to auto-load this skill.
Find dormant subscribers, segment by historical value, draft personalized winback emails per tier, and identify suppression candidates
SKILL.md
winback-engine.SKILL.mdname: winback-engine
description: Find dormant subscribers, segment by historical value, draft personalized winback emails per tier, and identify suppression candidates
version: "1.0.0"
author: Cogny AI
requires: cogny-mcp
platforms: [klaviyo, mailchimp, rule, get-a-newsletter]
user-invocable: true
argument-hint: "[aggressive|standard|conservative]"
allowed-tools:
# Cogny Cloud (aggregated) namespace
- mcp__cogny__klaviyo__*
- mcp__cogny__mailchimp__*
- mcp__cogny__rule__*
- mcp__cogny__get_a_newsletter__*
- mcp__cogny__create_finding
- mcp__cogny__write_context_node
# Cogny Solo / Lite (per-ESP direct) namespace
- mcp__klaviyo__*
- mcp__mailchimp__*
- mcp__rule__*
- mcp__get_a_newsletter__*
- Bash
- Read
- Write
Winback Engine
Turn dormant subscribers back into customers. This skill scans your connected ESP for inactive subscribers, segments them by historical value, drafts a personalized winback series per tier, and flags who you should suppress before they tank your deliverability.
**Requires:** Cogny MCP + a connected ESP. [Sign up](https://cogny.com)
The output is a complete, ready-to-run winback campaign — not a report.
Usage
`/winback-engine` — standard mode (60-day dormancy threshold) `/winback-engine aggressive` — 30-day threshold (acts earlier, bigger list) `/winback-engine conservative` — 90-day threshold (only chronic dormants)
Prerequisites Check
Detect connected ESP (same pattern as subject-line-lab). If none, prompt user to connect at cogny.com.
Steps
1. Define dormancy thresholds
| Mode | Dormant | Deep dormant | Suppress candidate | |------|---------|--------------|-------------------| | aggressive | 30+ days no open | 90+ days no open | 180+ days no open/click, no purchase | | standard | 60+ days | 180+ days | 365+ days no engagement | | conservative | 90+ days | 270+ days | 540+ days |
2. Pull subscriber data
From the connected ESP, pull every active subscriber with:
- Subscribe date
- Last open date + last click date (take max as last_engaged)
- Total historical opens / clicks
- Signup source / list
- Tags / segments
- Email domain (gmail, yahoo, hotmail, corporate)
**Purchase / LTV data — Klaviyo only.** The cogny-mcp-proxy currently exposes purchase data for Klaviyo (via `list_events` filtered to the "Placed Order" metric, summing the `value` field per profile). Mailchimp, Rule, and Get a Newsletter in this proxy are **engagement-only** — they do not expose:
- Total spend / LTV
- Order count
- AOV
- Last order date
**Per-ESP tool adapter:**
| ESP | Subscriber list | Purchase history | Suppression write | |-----|-----------------|------------------|-------------------| | Klaviyo | `list_profiles` (+ `get_profile` for detail) | `list_events` with `metric="Placed Order"` — use `value` field per profile for LTV | `unsubscribe_profiles` | | Mailchimp | `tool_list_members` (filter `status=subscribed`) | **Not available** | `tool_update_member` (status=unsubscribed) | | Rule | `tool_list_subscribers` | **Not available** | `tool_update_subscriber` / `tool_list_suppressions` | | Get a Newsletter | `tool_list_contacts` | **Not available** | `tool_delete_contact` or `tool_update_contact` |
3. Segment into tiers
**If Klaviyo (has purchase data):** cross-cut by **engagement recency** × **historical value**:
| Tier | Criteria | Tone | Offer | |------|----------|------|-------| | **A — High value dormant** | Dormant + LTV ≥ top quartile OR past purchaser | Personal, apologetic, premium | Strong (20% off, free shipping, exclusive access). This is real money. | | **B — Medium value dormant** | Dormant + some past engagement or 1 purchase | Warm, value-forward | Moderate (10–15% off, bundle, content) | | **C — Low engagement dormant** | Dormant + never purchased + low engagement history | Direct, honest | Last-chance offer or content-only | | **D — Suppression candidates** | Deep dormant + no purchase + no recent engagement | Final email only | "We're removing you unless..." |
**If Mailchimp / Rule / Get a Newsletter (engagement-only):** tier by **engagement depth** instead. No purchase data is available from the proxy for these ESPs — LTV-based tiering falls back to:
| Tier | Criteria | Tone | Offer | |------|----------|------|-------| | **A — Deep engaged dormant** | Dormant now, but historically high open+click rate (top quartile of clicks) | Personal, "we miss you" | Strong offer or exclusive content | | **B — Casual dormant** | Dormant, moderate historical engagement | Warm, value-forward | Modest offer | | **C — Low engagement dormant** | Dormant, few lifetime opens/clicks | Direct, honest | Content-only or re-opt-in ask | | **D — Suppression candidates** | Deep dormant, minimal lifetime engagement | Final email only | Goodbye |
Revenue estimates in the output should be omitted for engagement-only ESPs, or marked `estimated_impact_usd: null` on findings with a note that the user can pair with their own LTV data to size the opportunity.
Output the tier sizes before drafting:
Winback candidates: <total>
├─ Tier A (high-value dormant): <count> subscribers (est. revenue: $<X>)
├─ Tier B (medium): <count>
├─ Tier C (low engagement): <count>
└─ Tier D (suppression): <count> ← do not keep sending to these
**Revenue estimate for Tier A/B:** `count × historical AOV × expected reactivation rate` (use 3-5% for Tier A, 1-2% for Tier B).
4. Draft a 3-email winback series per tier
For each tier (A, B, C), generate 3 emails with cadence:
- **Email 1** — day 0, soft reopener ("we noticed")
- **Email 2** — day 4, value + offer
- **Email 3** — day 8, last-chance / decision
Tone by tier:
**Tier A (high-value):**
- E1: Personal note, reference last purchase by name if available. No offer yet.
- E2: Show what they're missing — new products in their category, or customer stories
- E3: Strongest offer, explicit decision framing ("if we're not a fit anymore, we'll respe
Read more
name: winback-engine description: Find dormant subscribers, segment by historical value, draft personalized winback emails per tier, and identify suppression candidates version: "1.0.0" author: Cogny AI requires: cogny-mcp platforms: [klaviyo, mailchimp, rule, get-a-newsletter] user-invocable: true argument-hint: "[aggressive|standard|conservative]" allowed-tools: # Cogny Cloud (aggregated) namespace - mcp__cogny__klaviyo__* - mcp__cogny__mailchimp__* - mcp__cogny__rule__* - mcp__cogny__get_a_newsletter__* - mcp__cogny__create_finding - mcp__cogny__write_context_node # Cogny Solo / Lite (per-ESP direct) namespace - mcp__klaviyo__* - mcp__mailchimp__* - mcp__rule__* - mcp__get_a_newsletter__* - Bash - Read - Write
Winback Engine
Turn dormant subscribers back into customers. This skill scans your connected ESP for inactive subscribers, segments them by historical value, drafts a personalized winback series per tier, and flags who you should suppress before they tank your deliverability.
**Requires:** Cogny MCP + a connected ESP. [Sign up](https://cogny.com)
The output is a complete, ready-to-run winback campaign — not a report.
Usage
`/winback-engine` — standard mode (60-day dormancy threshold) `/winback-engine aggressive` — 30-day threshold (acts earlier, bigger list) `/winback-engine conservative` — 90-day threshold (only chronic dormants)
Prerequisites Check
Detect connected ESP (same pattern as subject-line-lab). If none, prompt user to connect at cogny.com.
Steps
1. Define dormancy thresholds
| Mode | Dormant | Deep dormant | Suppress candidate | |------|---------|--------------|-------------------| | aggressive | 30+ days no open | 90+ days no open | 180+ days no open/click, no purchase | | standard | 60+ days | 180+ days | 365+ days no engagement | | conservative | 90+ days | 270+ days | 540+ days |
2. Pull subscriber data
From the connected ESP, pull every active subscriber with:
- Subscribe date
- Last open date + last click date (take max as last_engaged)
- Total historical opens / clicks
- Signup source / list
- Tags / segments
- Email domain (gmail, yahoo, hotmail, corporate)
**Purchase / LTV data — Klaviyo only.** The cogny-mcp-proxy currently exposes purchase data for Klaviyo (via `list_events` filtered to the "Placed Order" metric, summing the `value` field per profile). Mailchimp, Rule, and Get a Newsletter in this proxy are **engagement-only** — they do not expose:
- Total spend / LTV
- Order count
- AOV
- Last order date
**Per-ESP tool adapter:**
| ESP | Subscriber list | Purchase history | Suppression write | |-----|-----------------|------------------|-------------------| | Klaviyo | `list_profiles` (+ `get_profile` for detail) | `list_events` with `metric="Placed Order"` — use `value` field per profile for LTV | `unsubscribe_profiles` | | Mailchimp | `tool_list_members` (filter `status=subscribed`) | **Not available** | `tool_update_member` (status=unsubscribed) | | Rule | `tool_list_subscribers` | **Not available** | `tool_update_subscriber` / `tool_list_suppressions` | | Get a Newsletter | `tool_list_contacts` | **Not available** | `tool_delete_contact` or `tool_update_contact` |
3. Segment into tiers
**If Klaviyo (has purchase data):** cross-cut by **engagement recency** × **historical value**:
| Tier | Criteria | Tone | Offer | |------|----------|------|-------| | **A — High value dormant** | Dormant + LTV ≥ top quartile OR past purchaser | Personal, apologetic, premium | Strong (20% off, free shipping, exclusive access). This is real money. | | **B — Medium value dormant** | Dormant + some past engagement or 1 purchase | Warm, value-forward | Moderate (10–15% off, bundle, content) | | **C — Low engagement dormant** | Dormant + never purchased + low engagement history | Direct, honest | Last-chance offer or content-only | | **D — Suppression candidates** | Deep dormant + no purchase + no recent engagement | Final email only | "We're removing you unless..." |
**If Mailchimp / Rule / Get a Newsletter (engagement-only):** tier by **engagement depth** instead. No purchase data is available from the proxy for these ESPs — LTV-based tiering falls back to:
| Tier | Criteria | Tone | Offer | |------|----------|------|-------| | **A — Deep engaged dormant** | Dormant now, but historically high open+click rate (top quartile of clicks) | Personal, "we miss you" | Strong offer or exclusive content | | **B — Casual dormant** | Dormant, moderate historical engagement | Warm, value-forward | Modest offer | | **C — Low engagement dormant** | Dormant, few lifetime opens/clicks | Direct, honest | Content-only or re-opt-in ask | | **D — Suppression candidates** | Deep dormant, minimal lifetime engagement | Final email only | Goodbye |
Revenue estimates in the output should be omitted for engagement-only ESPs, or marked `estimated_impact_usd: null` on findings with a note that the user can pair with their own LTV data to size the opportunity.
Output the tier sizes before drafting:
Winback candidates: <total> ├─ Tier A (high-value dormant): <count> subscribers (est. revenue: $<X>) ├─ Tier B (medium): <count> ├─ Tier C (low engagement): <count> └─ Tier D (suppression): <count> ← do not keep sending to these
**Revenue estimate for Tier A/B:** `count × historical AOV × expected reactivation rate` (use 3-5% for Tier A, 1-2% for Tier B).
4. Draft a 3-email winback series per tier
For each tier (A, B, C), generate 3 emails with cadence:
- **Email 1** — day 0, soft reopener ("we noticed")
- **Email 2** — day 4, value + offer
- **Email 3** — day 8, last-chance / decision
Tone by tier:
**Tier A (high-value):**
- E1: Personal note, reference last purchase by name if available. No offer yet.
- E2: Show what they're missing — new products in their category, or customer stories
- E3: Strongest offer, explicit decision framing ("if we're not a fit anymore, we'll respe
AI marketing skills for Claude Code, Cursor, Windsurf, and other AI coding tools. Audit SEO, analyze ads, research competitors, qualify leads — all from your terminal. Free skills need no account. Premium skills connect your real data for $9/mo.
Repo: cognyai/claude-code-marketing-skills
Other skills on claude-code-marketing-skills.
brand-kit
Build a portable brand-kit.json for the user's product — colors, typography, voice — that other skills (video, ad creative, landing page) can consume. Multiple…
cogny
Run Cogny marketing analysis tasks — fetch scheduled tasks, analyze ad accounts via MCP, report findings
community-pulse
Weekly read on Discord community health — joins, active channels, top contributors, themes, and unanswered questions
conversion-debug
Conversion Tracking Debugger — diagnose discrepancies across GTM, GA4, Google Ads & Meta Pixel with live API access, BigQuery validation queries, and…

