Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@
},
{
"name": "renewal-timeline",
"version": "0.2.0",
"description": "Turn a customer's renewal emails into a Whimsical timeline board and a renewal write-up: every offer, the pricing table, NRR and open items.",
"version": "0.2.1",
"description": "Turn a customer, client or contract renewal into a Whimsical timeline: every offer and counter-offer from your emails or CRM, a pricing table, and a renewal summary with NRR and open items.",
"source": "./",
"strict": false,
"skills": ["./skills/renewal-timeline"],
Expand All @@ -53,7 +53,7 @@
"homepage": "https://github.com/WhimsicalCode/skills/blob/main/docs/renewal-timeline.md",
"repository": "https://github.com/WhimsicalCode/skills",
"license": "MIT",
"keywords": ["renewals", "customer-success", "sales", "timeline", "whimsical", "mcp"],
"keywords": ["renewals", "contract-renewal", "customer-renewal", "subscription", "negotiation", "customer-success", "account-management", "sales", "crm", "nrr", "timeline", "whimsical", "mcp"],
"category": "productivity"
}
]
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Codex, GitHub Copilot, Gemini CLI and other agents that read skills.
| Skill | What it does | Try |
| --- | --- | --- |
| [App Wireframe](docs/app-wireframe.md) | Turns any app into editable lo-fi wireframes: name an app to pull its screens from Mobbin, or bring your own screenshots. [See 20 example boards](https://whimsical.com/templates/wireframes). | `Make wireframes of Airbnb` |
| [Renewal Timeline](docs/renewal-timeline.md) | Turns a customer's renewal emails into a timeline of every offer and counter-offer, with a pricing table, and writes the renewal summary: terms, NRR, usage, open items. | `Build the renewal timeline for Initech` |
| [Renewal Timeline](docs/renewal-timeline.md) | Turns the emails behind a customer or contract renewal into a timeline of every offer and counter-offer, with a pricing table, and writes the renewal summary: terms, NRR, usage, open items. | `Build the renewal timeline for Initech` |

These skills are new, and mostly written with coding agents. If something breaks in your
setup, please [open an issue](https://github.com/WhimsicalCode/skills/issues/new/choose).
Expand Down
51 changes: 42 additions & 9 deletions docs/renewal-timeline.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Renewal Timeline

Turn a customer's renewal emails into a timeline in [Whimsical](https://whimsical.com), and a
renewal write-up to go with it.
Turn the emails behind a customer, client or contract renewal into a timeline in
[Whimsical](https://whimsical.com), and a renewal summary to go with it.

```text
Build the renewal timeline for Initech
Expand All @@ -10,10 +10,26 @@ Build the renewal timeline for Initech
Your agent reads the renewal threads in your email or CRM and lays out every step on a board:
your side on the left, the customer's on the right, each offer and counter-offer with its
price, the contract expiry date, and what's still open. A pricing table at the top shows how
the negotiation moved, with the agreed terms highlighted. The write-up covers the deal terms,
the negotiation moved, with the agreed terms highlighted. The summary covers the deal terms,
NRR, usage if you have the numbers, and the open items.

![Example timeline: a fictional Initech renewal](renewal-timeline.png)
![A renewal timeline on a Whimsical board: a fictional Initech contract renewal, with the pricing table on top and every offer and counter-offer below](renewal-timeline.png)

## Who it's for

It's for B2B renewals: a subscription, license or service agreement coming up for renewal,
where you and your customer go back and forth on seats, price and terms before signing.
Account executives, customer success and account managers, and deal desks use it to see
where a renewal stands before a call, or to hand an account over to someone new.

The renewal in the screenshot is made up, but typical: 22 steps over three months, from the
kickoff call through a security review and seven price proposals to the countersigned order
form. That was dozens of emails spread over several threads. The board fits it on one
page.

It works with seat-based SaaS pricing, flat fees, monthly retainers and one-off project fees.
It's not meant for renewals you handle as a buyer, or for domain names, licenses and
subscriptions that renew on their own.

## What you'll get

Expand All @@ -27,7 +43,7 @@ A new board called `<Customer> <Year> Renewal Timeline`:
- **The deadline**: the contract's expiry date sits on the timeline at its date, so a late
signature shows up as one.

And a write-up in chat: the new terms, NRR and the change in revenue, usage against what's
And a renewal summary in chat: the new terms, NRR and the change in revenue, usage against what's
billed, what the customer said versus what the numbers show, the negotiation step by step,
and the open items.

Expand All @@ -53,7 +69,7 @@ with other agents or tools. If something breaks, please
does Claude's sandbox; on a Mac that doesn't, the first run offers to install Apple's
command line tools.

Usage numbers are optional. If you have them (an admin dashboard, a BI tool), the write-up
Usage numbers are optional. If you have them (an admin dashboard, a BI tool), the summary
uses them; it never guesses.

## Install
Expand Down Expand Up @@ -132,7 +148,7 @@ Whimsical tools and `python3` for the session keeps it moving.
```text
email / CRM / pasted thread ─► events.json ─► build_board.py ─► Whimsical board
usage numbers (optional) ─┘ │
└──────────► renewal write-up
└──────────► renewal summary
```

1. The agent finds the customer's renewal threads and reads the full messages, not
Expand All @@ -147,14 +163,31 @@ Whimsical tools and `python3` for the session keeps it moving.
prints the exact Whimsical calls, and the agent passes them on as they are, so a board
comes out the same every time.
4. The agent checks a snapshot of the board, then writes the summary from the same file, so
the board and the write-up agree.
the board and the summary agree.

To update a board, the script asks for a short read of it (about ten objects), adds only the
new steps, and moves the expiry date and the end of the timeline.

`build_board.py` uses only Python's standard library and never touches the network: the agent
talks to Whimsical and hands the results to the script.

## Questions

**Does it work if our pricing isn't per seat?** Yes. Each offer needs a total; seats and a
price per seat are optional. Tiered prices, flat fees, monthly retainers and project fees
all fit, and the pricing table labels the amounts to match.

**Can it show a downsell or churn risk, not only an expansion?** Yes. The summary gives the
change in revenue and NRR either way, and when the customer cuts seats it sets what they
said next to the usage numbers, if you have them.

**Does it change anything in our CRM or send emails?** No. It only reads your email and CRM.
The one thing it writes is the Whimsical board.

**Can several people work on the same renewal?** The board is a normal Whimsical board, so
your team can comment on it and share it. Updates work best when they come from the same
`renewals/<Customer>/` folder, since `events.json` there is what the next update builds on.

## Privacy

The skill doesn't collect anything. It only reads your email and CRM, and never sends a
Expand All @@ -171,7 +204,7 @@ skills/renewal-timeline/
references/
event-schema.md the events.json format
board-layout.md what the board looks like, element by element
summary-template.md the write-up's structure
summary-template.md the summary's structure
scripts/
build_board.py checks events.json, writes the Whimsical calls
examples/ a small example and a full deal, both fictional
Expand Down
2 changes: 1 addition & 1 deletion skills/renewal-timeline/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: renewal-timeline
description: Build or update a visual renewal timeline for a B2B customer from their email or CRM history, plus a renewal write-up (deal terms, NRR, usage, seat reduction, negotiation path, open items). Works with whatever email or CRM tool is connected (Front, Gmail, Outlook, HubSpot, Salesforce, and others), a pasted thread, or a prepared events.json. Use whenever the user mentions a renewal timeline, renewal flowchart, renewal board, a renewal summary or write-up for a named customer, "look at the emails and update the board", or shares a link to an existing renewal timeline board, even if they don't say "skill" or "timeline".
description: Build or update a timeline of a B2B customer, client or contract renewal on a Whimsical board, from the renewal emails or CRM history, and write the renewal summary: deal terms, every offer and counter-offer, NRR, seat or license usage, downsell or expansion, and open items such as a missing PO or signature. For subscription, license and service agreement renewals between a company and its customer, not domain, visa or passport renewals. Works with whatever email or CRM tool is connected (Gmail, Outlook, Front, HubSpot, Salesforce and others), a pasted thread, or a prepared events.json. Use when the user asks for a renewal timeline, renewal board, renewal summary or recap, a contract or deal negotiation timeline for a named customer, says "look at the emails and update the board", or shares a link to a renewal timeline board, even if they don't say "skill" or "timeline".
---

# Renewal Timeline
Expand Down
Loading