Price increase rollout
Model the churn a price increase can survive before picking a number, tier clients by value, and stage notices. A free skill drafts each, waiting for your yes.
“The day I lost my last client, I sat in my home office staring at my empty calendar.”
The problem
A price increase sent as one flat email to the whole client list is how owner-sellers lose clients they didn't need to lose. This system runs the break-even math before any number is picked, tiers the roster so the right client gets the right notice, and stages the rollout in batches so a bad signal can be caught before it hits everyone.

Key takeaways
- The Federal Reserve Bank of Richmond's Economic Brief 23-16 (Gholami and Trachter, May 2023) found that a 1 percent price change can raise annual customer turnover from 14 percent to 21 percent. Run the churn math before you pick a number.
- Break-even retention = 1 / (1 + increase percent). Run that math for two or three candidate percentages before committing to one.
- Tier the full client roster by tenure, revenue, satisfaction, and referral value before drafting a single notice. Skipping a client here means they get the wrong template in the next step.
- Set the new public price for new customers before any existing client sees a notice. An existing client who later notices the new public price sees proof the increase applies to everyone.
- Send to the smallest, lowest-risk tier first and wait for replies and cancellations before the next batch goes out.
- Log every rollout's actual churn against the break-even prediction, so the next increase starts from data instead of a guess.
Frontmatter
- name
- price-increase-rollout
- description
- Runs a phased price-increase system that models break-even churn before a number is picked, tiers the roster, stages notice and delivery, and logs outcomes so every future increase reuses the same system. Use when an owner-seller needs to raise prices, fears a hike will cost clients, or already sent a flat increase and is watching clients leave. Triggers include "I need to raise my prices", "how do I tell clients prices are going up", "I raised prices and now I'm losing clients", "price increase letter", "worried a rate hike will cost me my client list", "how much can I raise prices without losing everyone".
Price increase rollout
This skill runs a price increase as a staged system instead of a single blast email. Invoke it the moment a user says they are planning a price increase, are stuck on what number to pick, need a notice drafted, or already sent a flat increase to the whole list on the same day and are now losing clients.
The bundle carries the parts this system needs: references/breakeven-calculator.md
(the retention math and a ready table), references/segmentation-rubric.md (how
to tier the roster before drafting anything), references/roster-log-schema.md
(the schema for the one living roster log this system starts, extends, and
re-opens every cycle), references/notice-templates.md (the test-group email,
the standard email, the value-tied email, and the high-value personal-delivery
script), references/cadence-timeline.md (the audit-to-sustain timeline with
day counts), scripts/breakeven.js (a small calculator that turns a
price-increase percentage into the retention rate needed to break even), and
examples/worked-example.md (two worked examples on an invented roster, using
sourced stats, run through this system end to end). Read the referenced file
before the step that calls for it; do not draft from memory what a bundle file
already supplies.
Phase 1: Build the system once, before any number is picked
- When the user raises the topic of a price increase for the first time, do not
let them name a percentage yet. Read
references/breakeven-calculator.mdand compute the break-even retention rate for two or three candidate percentages usingretention_needed = 1 / (1 + increase_percent), or runscripts/breakeven.jswith each candidate percentage as input. Show the user the retention rate each candidate requires before they commit to a number. Cite the source stat while doing this: Federal Reserve Bank of Richmond, Economic Brief 23-16 (Gholami and Trachter, May 2023), found that a 1 percent price change can raise annual customer turnover from 14 percent to 21 percent, so even a small increase carries a real, measurable churn cost that the break-even math has to price in before any number is picked. - Ask the user to pull every active contract or statement of work and check it
for a price-lock clause, a renewal date, and any contractual notice
requirement. Start the roster log (
references/roster-log-schema.md) with each client's contract type, renewal date, and required notice period. This log feeds segmentation in the next step and must exist before any draft goes out, because a price lock means the owner cannot send that client the increase until it expires. - Read
references/segmentation-rubric.mdand tier the full client roster by tenure, revenue value, satisfaction or relationship strength, and referral-likelihood, logging the scores in the same roster log. Every client lands in exactly one tier. Do not skip a client because they seem easy to read: every client gets scored, because the tier decides which template they get in Phase 2. - Read
references/notice-templates.mdonce, end to end, so the right template is recognized when a tier calls for it in Phase 2: the test-group email for the test group, the standard email for a standard-tier client with no named cost driver, the value-tied email for a standard-tier client where one exists, and the personal-delivery script for the top tier. Do not draft a notice from scratch; select and fill the matching template. - Set the new public, new-customer price first, before any existing-client notice goes out. An existing client who later notices the new public price sees proof that the increase applies to everyone, which backs up what the notice already says. If the user has not already changed the public price, flag this as a blocking step before Phase 2 starts.
Phase 2: Run one price increase, start to finish
- Read
references/cadence-timeline.mdand build the user's actual rollout calendar from it: a small test group first, then the staged full rollout, with day counts scaled to contract size (30 days as a floor for month-to-month or small accounts, 60 to 90 days for larger retainer or annual contracts, matching the notice period logged in step 2). - For the test group (the smallest, lowest-risk tier), draft the test-group
email, template 1 in
references/notice-templates.md, filled with that tier's client names, current price, new price, and effective date pulled from the roster log. Present the draft to the user and stop. Do not send, schedule, or queue it. Wait for the user's explicit approval in this turn. - This skill never sends anything itself: approval here means the user takes the approved draft and sends it through their own email or messaging channel. Once they confirm it went out, mark that batch as sent and record the date in the roster log. Do not touch the remaining tiers yet. Ask the user to report back on replies and any cancellations from the test group before the next batch goes out.
- Read the test-group outcome the user reports. If cancellations or complaints from the test group run above what the break-even math from step 1 priced in, pause the rollout, bring the gap back to the user, and revisit the percentage or the messaging before any further batch is drafted. Never carry a test group's bad signal silently into the full rollout.
- If the test group holds, move to the remaining tiers in order of
increasing client value. For each standard-tier client, check the contract
and scope notes gathered in Phase 1: when a specific, named cost driver or
scope change applies, use the value-tied email, template 3 in
references/notice-templates.md; when none applies, use the standard email, template 2, rather than forcing the value-tied version without a real reason. Never tie either template's number to a bare percentage alone. For the top tier, use the high-value personal-delivery script, template 4. The top-tier script is written for the user (or their account lead) to deliver by call or in person, not by email; present it as a speaking script and confirm the user has a delivery method before marking that tier as handled. - For every batch in every tier, repeat the draft-present-approve-send sequence from steps 7 and 8. No batch skips the approval checkpoint, regardless of how smoothly the earlier batches went.
- Once every tier has received its notice, log the full roster's outcome in
the roster log: who accepted, who renegotiated, who left, recorded under
this cycle's rollout-record block in
references/roster-log-schema.md. This log is the input to Phase 3.
Phase 3: Sustain the system, every quarter after
- On a quarterly cadence (or whenever the user raises pricing again), do not restart from a blank page. Re-open the roster log from step 12, re-run the break-even math from step 1 against the new candidate percentage, and re-tier any client whose tenure, value, or satisfaction has changed since the last run.
- Compare the actual churn from the last rollout against the break-even rate
predicted in step 1; read
examples/worked-example.mdalongside this comparison. Both walkthroughs there show actual churn landing at or inside the break-even line, which is the calibration bar for judging whether this cycle's gap is ordinary variance or a signal worth investigating. Note the gap (if any) in the roster log so the next run's break-even estimate draws on this cycle's real result as well as the formula. - If the last rollout's churn removed meaningful revenue, fold pipeline replenishment into this same system: flag to the user that new-client acquisition for the next period needs to cover the gap, sized from the actual churn logged in step 12. Keep this flag to a single handoff line; a full acquisition push is its own workflow, handled elsewhere.
- Keep
references/cadence-timeline.mdand the roster log (references/roster-log-schema.md) as living files the user reuses every cycle; update them in place on the next price increase rather than regenerating them from scratch.
Copy-paste checklist: before any notice leaves the draft state
- Break-even retention rate computed for the chosen percentage (step 1)
- Every active contract checked for a price-lock clause or notice requirement (step 2)
- Every client assigned to exactly one segmentation tier (step 3)
- Public, new-customer price already changed (step 5)
- Template pulled fresh from
references/notice-templates.mdfor this client's exact tier - Notice period matches the contract size (30 days floor, 60 to 90 for larger retainer or annual accounts)
- Draft shown to the user and explicitly approved in this turn before any send, schedule, or queue action
Copy-paste checklist: reading a test-group result before the full rollout
- Replies and cancellations from the test group collected and reported
- Cancellation rate compared against the break-even rate from step 1
- Rollout paused and brought back to the user if the gap is meaningful
- Only proceed to the next tier once the test group's result is reviewed
Guardrails: what this agent must never do
- Never auto-send, schedule, or queue a price-increase notice. Every batch, every tier, every template fill is drafted, shown, and explicitly approved by the user in that turn before it leaves the draft state. This skill hands the user text; the user's own channel does the sending.
- Never blast the full roster in one batch. The test group always runs first, and its result is reviewed before the next tier goes out.
- Never invent a client's contract terms, renewal date, tenure, or satisfaction level. Pull every detail from the log the user supplied in Phase 1; if a detail is missing, ask for it or flag the client as not yet ready for a notice.
- Never fabricate a statistic. The only citable figures this skill uses are the
ones in
references/breakeven-calculator.mdandexamples/worked-example.md, each with its own named, dated source. If the user wants a different stat, it needs its own source before it goes in a draft. - Never let a client under a contractual price lock or an unmet notice requirement receive the increase early. Step 2's log is the gate, and skipping it breaks that gate entirely.
- Never tie the new number to a bare percentage alone in the standard or value-tied templates. State the real cost driver or scope change, and pull it only from what the user actually reports.
- Never resume a paused rollout on the old draft after a bad test-group signal. The percentage or messaging gets revisited with the user first.
Install
- Download the .skill bundle, or the raw SKILL.md above.
- Unzip the bundle into your agent's skills directory. SKILL.md sits at the top level; any reference files sit beside it.
- Point your agent at the folder. It reads SKILL.md and follows it.
What's in the bundle
The .skill download contains SKILL.md plus these files, each at its path.
references/breakeven-calculator.md3,271 chars
# Break-even calculator for a price increase
Use this before anyone names a percentage out loud. It answers one question: if you raise price by X percent, what retention rate do you need just to break even on revenue? Below that retention rate, the increase costs you money even though each remaining client pays more.
## The formula
`retention_needed = 1 / (1 + increase_percent)`
Where `increase_percent` is written as a decimal (10 percent is 0.10, not 10).
`allowable_churn = 1 - retention_needed`
Read it as: raise price 10 percent, and you can afford to lose about 9 percent of clients and still land at the same total revenue as before the increase. Lose more than that, and the increase costs you money overall, even though each remaining client pays more.
This formula measures break-even on revenue. It assumes your cost per remaining client stays flat, so it doesn't capture a profit break-even on its own. If the increase is meant to fund new costs (more support hours, a new tool, a bigger team), size the percentage against that cost first, then run this formula on top of it.
## Why the churn number is not optional
The Federal Reserve Bank of Richmond's Economic Brief 23-16 (Gholami and Trachter, May 2023) found that a 1 percent price change can raise annual customer turnover from 14 percent to 21 percent. A small bump on price moves turnover by 7 full points in that data set, a real cost even on a modest increase. Run the numbers while a percentage can still be changed, before any notice goes out.
## Candidate percentage table
| Price increase | Retention needed to break even | Allowable churn |
|---|---|---|
| 2% | 98.0% | 2.0% |
| 5% | 95.2% | 4.8% |
| 8% | 92.6% | 7.4% |
| 10% | 90.9% | 9.1% |
| 12% | 89.3% | 10.7% |
| 15% | 87.0% | 13.0% |
| 18% | 84.7% | 15.3% |
| 20% | 83.3% | 16.7% |
| 25% | 80.0% | 20.0% |
| 30% | 76.9% | 23.1% |
Use the row closest to the percentage under discussion. If the number you want is not on the table, run `scripts/breakeven.js` with that percentage as the argument.
## How to use this with a client roster
1. Pull the total number of active clients and the current average price.
2. Pick two or three candidate percentages, never just one.
3. For each candidate, read off the allowable churn from the table above.
4. Multiply allowable churn by total active clients. That is the maximum number of clients you can lose at that percentage before the increase becomes a net loss.
5. Compare that number against the clients you already suspect might leave (from the segmentation work in `references/segmentation-rubric.md`). If the suspect count is close to or above the allowable count, the percentage is too aggressive for this roster right now.
## Worked check
Say you have 40 clients at $500/month and you are weighing a 15 percent increase.
- Retention needed: 1 / 1.15 = 0.870 (87.0%)
- Allowable churn: 13.0%
- 13.0% of 40 clients = 5.2, so you can lose up to 5 clients and still come out ahead on revenue.
If your gut says more than 5 of your 40 clients will balk at 15 percent, either lower the percentage, tie it to a named cost driver (see the value-tied template in `references/notice-templates.md`), or plan to lose the margin on purpose, because the relationship is worth it.references/segmentation-rubric.md3,443 chars
# Client segmentation rubric
Tier every active client before drafting a single notice. The tier decides which template a client gets in Phase 2 and the order they are contacted in.
## Score each client on four dimensions (1 to 3 each)
| Dimension | 1 point | 2 points | 3 points |
|---|---|---|---|
| Tenure | Under 6 months | 6 months to 2 years | Over 2 years |
| Revenue value | Below your median client revenue | At your median client revenue | Top quartile of client revenue |
| Relationship strength | Transactional, little contact beyond invoices | Friendly, occasional unprompted positive feedback | Advocate: refers people, responds personally, treats you as a partner |
| Referral likelihood | Has never referred anyone | Has referred once | Has referred more than once, or is a known connector in their circle |
Total score range: 4 to 12.
## Assign the tier from the total
| Total score | Tier | What it means |
|---|---|---|
| 4 to 6 | Test group | Smallest exposure if this goes wrong. Goes first, gets the test-group email (`references/notice-templates.md`, template 1). |
| 7 to 9 | Standard | The bulk of the roster. Gets the value-tied email when a named cost driver applies, the standard email when none does (`references/notice-templates.md`, templates 3 and 2), batched after the test group holds. |
| 10 to 12 | Top tier | Highest cost if lost, highest value if kept. Gets the personal-delivery script, never a cold email. |
## Rules while scoring
- Score every active client. No one skips scoring because they "seem easy" or "seem obviously fine": a client assumed to be fine and left unscored still ends up with the wrong template later.
- Score honestly on relationship strength. A client who pays on time but never responds to anything beyond an invoice is a 1, not a 2, even if they have never complained.
- When a client sits on the boundary between two tiers (a 6 vs. a 7, a 9 vs. a 10), round down in risk: treat them as the lower tier, which gives them more notice time and a softer approach.
- Re-run this scoring every time a price increase is planned. A client's tenure and relationship strength change between cycles; do not reuse last cycle's tier without checking.
## Minimum fields to log per client
These columns are the segmentation slice of the full roster log; see
`references/roster-log-schema.md` for the complete schema, including the
contract fields and each cycle's rollout outcomes. Keep this as a simple table
or spreadsheet, one row per client:
| Client | Tenure score | Revenue score | Relationship score | Referral score | Total | Tier | Contract type | Renewal date | Required notice period (days) |
|---|---|---|---|---|---|---|---|---|---|
The last three columns come from the contract audit in Phase 1, step 2 of the main procedure, not from this rubric. Keep them in the same table so the tier and the contract constraint are visible together: a top-tier client with a 90-day notice requirement needs to enter the cadence in `references/cadence-timeline.md` earlier than a test-group client on a month-to-month agreement.
## What this feeds
- The tier decides the notice order in Phase 2 (test group first, then standard tiers in ascending value, top tier last and by a different channel).
- The tier decides the template in `references/notice-templates.md`.
- The contract-type and notice-period columns decide where each client lands on `references/cadence-timeline.md`.references/roster-log-schema.md2,546 chars
# Roster log schema
This is the one living file this system starts in Phase 1, extends through
Phase 2, and re-opens every cycle in Phase 3. Keep it as a single spreadsheet
or table, one row per client, with one block of rollout-record columns added
per cycle (add new columns for the next cycle rather than overwriting the
last one, so the trend survives across quarters).
## Identity and contract columns (started in Phase 1, step 2)
| Column | What goes here |
|---|---|
| Client | Client name or account id |
| Contract type | Month-to-month, annual retainer, fixed-term, etc. |
| Renewal date | Next contract renewal or expiry date |
| Required notice period (days) | Pulled from the contract itself |
| Price lock until | Date a price-lock clause expires, blank if none applies |
## Segmentation columns (added in Phase 1, step 3; see `references/segmentation-rubric.md`)
| Column | What goes here |
|---|---|---|
| Tenure score | 1 to 3 |
| Revenue score | 1 to 3 |
| Relationship score | 1 to 3 |
| Referral score | 1 to 3 |
| Total score | Sum of the four, 4 to 12 |
| Tier | Test group, Standard, or Top tier |
## Rollout-record columns, one block per cycle (Phase 2, step 12; Phase 3)
Label each block with the cycle it covers, for example "2026 Q1 rollout":
| Column | What goes here |
|---|---|---|
| Cycle label | e.g. "2026 Q1" |
| Increase percent | The percentage applied this cycle |
| Template used | Test-group email, Standard email, Value-tied email, or Personal-delivery script |
| Effective date | Date the new price took effect for this client |
| Sent date | Date the user confirmed the notice went out |
| Outcome | Accepted, Renegotiated, or Left |
| Notes | Anything from step 9's test-group read or step 14's churn comparison worth carrying into the next cycle |
## How each step uses this file
- Step 2 starts the Identity and contract columns for every active client.
- Step 3 fills in the Segmentation columns and assigns the Tier.
- Step 12 fills in the current cycle's Rollout-record block once every tier has a notice out.
- Step 13 re-opens this file at the start of the next cycle, re-scores the Segmentation columns for any client whose situation changed, and adds a new Rollout-record block instead of overwriting the last one.
- Step 14 reads the Outcome column against that cycle's break-even prediction and logs the gap in the Notes column.
Keep one file across cycles. Starting a fresh spreadsheet each quarter loses the trend line that makes the next break-even estimate better than a guess.references/notice-templates.md4,275 chars
# Notice templates
Four templates. Pick the one that matches the client's tier from `references/segmentation-rubric.md`. Fill every bracket before sending. Do not send with a bracket still in the text.
## 1. Test-group email
Use for the smallest, lowest-risk tier, the first batch out the door.
Subject: A price update for your account, effective [EFFECTIVE_DATE]
Hi [CLIENT_NAME],
I'm writing with advance notice on pricing. Starting [EFFECTIVE_DATE], your rate will move from [CURRENT_PRICE] to [NEW_PRICE]. That's [NOTICE_PERIOD_DAYS] days from today, so nothing changes before then.
This applies across the board as part of a planned update to how [YOUR_BUSINESS_NAME] prices its work. If the new rate is a problem for your budget, reply to this email and let's talk before the change date.
Thanks for being a client.
[YOUR_NAME]
## 2. Standard email
Use for the standard tier once the test group has held, when no specific, named cost driver or scope change applies to this client (use the value-tied email, template 3, instead whenever one does). Slightly more context than the test-group version since this batch is larger and more varied.
Subject: Your rate is changing on [EFFECTIVE_DATE]
Hi [CLIENT_NAME],
Starting [EFFECTIVE_DATE] ([NOTICE_PERIOD_DAYS] days from today), your rate moves from [CURRENT_PRICE] to [NEW_PRICE]. Nothing else about the work changes.
This is part of a pricing update across all [YOUR_BUSINESS_NAME] clients, not something specific to your account. New clients signing on today already pay the new rate.
If you want to talk it through, reply here or grab time on my calendar: [CALENDAR_LINK].
[YOUR_NAME]
## 3. Value-tied email
Use for standard-tier clients where a specific, named cost driver or scope change explains the increase. This is the default pick for the standard tier whenever a real driver exists; use the standard email (template 2) when none does. Never send a bare percentage to a client you have a real relationship with when a real reason exists; name it.
Subject: Why your rate is changing on [EFFECTIVE_DATE]
Hi [CLIENT_NAME],
Starting [EFFECTIVE_DATE], your rate moves from [CURRENT_PRICE] to [NEW_PRICE]. Here's the reason: [NAMED_COST_DRIVER_OR_SCOPE_CHANGE, for example "the scope has grown to include weekly reporting that wasn't part of the original agreement" or "the tools this work depends on raised their own prices this year"].
I wanted you to hear the reason directly rather than just see a new number on an invoice. The new rate takes effect [NOTICE_PERIOD_DAYS] days from today.
Questions or concerns, reply here.
[YOUR_NAME]
## 4. High-value personal-delivery script
Use for the top tier. This is delivered by phone or in person, by the owner or the account lead, never by cold email. Use these as talking points to adapt in the moment; reading them word for word defeats the purpose.
Opening:
"I wanted to talk to you directly about something rather than send it in an email."
The news:
"Starting [EFFECTIVE_DATE], the rate on your account is moving from [CURRENT_PRICE] to [NEW_PRICE]. I wanted you to hear that from me, not find it on an invoice."
The reason (always include one for a top-tier client):
"[NAMED_REASON, tied to cost, scope, or the value delivered over the relationship's tenure]."
The relationship anchor:
"You've been a client for [TENURE], and that matters to me."
The open door:
"If this timing is a problem, or the number is a problem, tell me now and we'll find something that works for both of us. I'd rather have that conversation than lose you over a number."
Close:
"I'll follow up in writing with the details, but I wanted you to hear it from me first."
Confirm before marking this tier as handled: the owner (or account lead) actually has a delivery method booked, a call on the calendar or an in-person meeting set, not just an intention to call "sometime."
## Before sending any of these
- Every bracket is filled. A visible bracket in a sent notice is a signal this was templated and rushed.
- The effective date matches the notice period logged for that specific client's contract, not a flat default for everyone.
- The draft has been shown to the owner and approved in the same conversation before it is sent, scheduled, or queued.references/cadence-timeline.md3,049 chars
# Cadence timeline: audit to sustain
Two tracks below. Use the small-account track as the floor (30 days) and the large-account track for retainer or annual contracts (60 to 90 days). Build the actual calendar from whichever notice period a client's contract requires (logged in the segmentation table), not from a single flat date for the whole roster.
## Small / month-to-month track (30-day floor)
| Day | Action |
|---|---|
| Day 0 to 3 | Audit contracts for price locks, renewal dates, required notice periods. Run the break-even math on 2 to 3 candidate percentages. |
| Day 3 to 5 | Segment the full roster into tiers. Set the new public, new-customer price. |
| Day 5 | Draft the test-group notice. Show the owner, get approval. |
| Day 5 to 7 | Send the test-group notice. Log the send date. |
| Day 7 to 14 | Collect test-group replies and any cancellations. Compare against the break-even allowable churn. |
| Day 14 | Decision point: hold the percentage and proceed, or pause and revisit. |
| Day 14 to 21 | Draft and send the standard-tier batches, value-tied template where a cost driver exists. |
| Day 21 to 28 | Deliver the top tier by phone or in person, using the personal-delivery script. |
| Day 28 to 30 | New rate takes effect for every client whose individual notice period has elapsed. Log final outcomes (accepted, renegotiated, left). |
## Large / retainer or annual track (60 to 90 days)
| Day | Action |
|---|---|
| Day 0 to 7 | Audit contracts (these often carry longer required notice periods; 60 or 90 days is common in annual agreements). Run the break-even math. |
| Day 7 to 14 | Segment the roster. Set the new public price. |
| Day 14 | Draft and approve the test-group notice. |
| Day 14 to 21 | Send the test-group notice. |
| Day 21 to 35 | Collect test-group signal, a longer window than the small-account track, since larger clients often take longer to respond. |
| Day 35 | Decision point. |
| Day 35 to 55 | Standard-tier batches. |
| Day 55 to 75 | Top-tier personal delivery, scheduled individually since these clients often need a real meeting, not a phone call squeezed in. |
| Day 75 to 90 | New rate takes effect per client's individual notice requirement. Log outcomes. |
## Rule for mixed rosters
Most rosters have both month-to-month and annual clients. Do not force everyone onto one track. Build one calendar with each client's row dated from their own contract's notice period (the column logged in `references/segmentation-rubric.md`), using these two tracks as the floor and ceiling; a client's own contract can land anywhere between them.
## Quarterly reuse (Phase 3)
Keep this file as a living document. On the next price increase:
1. Do not start from a blank calendar. Copy this file and re-date it from the new start date.
2. Compare the actual Day 7-to-decision-point churn from last time against the break-even number predicted for last time. Note the gap at the top of the new copy.
3. Carry forward any client whose notice period or contract changed since the last cycle.scripts/breakeven.js2,078 chars
#!/usr/bin/env node
/**
* breakeven.js
*
* Turns a price-increase percentage into the retention rate needed to
* break even on revenue, and the churn rate you can afford before the
* increase costs you money.
*
* Usage:
* node breakeven.js Prints the default reference table.
* node breakeven.js 12 Prints the result for a single 12% increase.
* node breakeven.js 5 10 15 Prints results for each percentage given.
* node breakeven.js --clients 40 15 Also shows the client-count math
* for a 40-client roster at 15%.
*
* No dependencies. No network access. No files are read or written.
*/
function breakeven(increasePercent) {
const x = increasePercent / 100;
const retentionNeeded = 1 / (1 + x);
const allowableChurn = 1 - retentionNeeded;
return { increasePercent, retentionNeeded, allowableChurn };
}
function formatPct(n) {
return (n * 100).toFixed(1) + '%';
}
function printRow(result, totalClients) {
const base = `${result.increasePercent}% increase -> retain ${formatPct(result.retentionNeeded)}, can afford to lose ${formatPct(result.allowableChurn)}`;
if (totalClients) {
const maxLost = (result.allowableChurn * totalClients).toFixed(1);
console.log(`${base} (up to ${maxLost} of ${totalClients} clients)`);
} else {
console.log(base);
}
}
function main(argv) {
let totalClients = null;
const percents = [];
for (let i = 0; i < argv.length; i++) {
const arg = argv[i];
if (arg === '--clients') {
totalClients = Number(argv[i + 1]);
i++;
continue;
}
const n = Number(arg);
if (!Number.isNaN(n) && n > 0) {
percents.push(n);
}
}
if (percents.length === 0) {
// Default reference table, matches references/breakeven-calculator.md
[2, 5, 8, 10, 12, 15, 18, 20, 25, 30].forEach((p) => {
printRow(breakeven(p), totalClients);
});
return;
}
percents.forEach((p) => {
printRow(breakeven(p), totalClients);
});
}
main(process.argv.slice(2));
examples/worked-example.md5,756 chars
# Worked example: running the system twice
Two worked examples below, not real client records. Both use invented client names and numbers on an invented roster, so this fictional roster is never confused with a real client list. The stats behind them are real and sourced: the churn research cited in step 1 of the main procedure (Federal Reserve Bank of Richmond, Economic Brief 23-16, Gholami and Trachter, May 2023) and the break-even model match `references/breakeven-calculator.md`. The 10 to 20 percent "commonly accepted annual increase" range used below matches the range given in sourced pricing guides, including Nutshell's and HoneyBook's price-increase guides (see this skill's source list); several independent guides converge on this range, though it reflects a repeated pattern across guides rather than a single rigorous study's finding. Treat this file as a template for the arithmetic and the sequence of moves. The arithmetic and sequence are what to reuse; the specific client names and numbers below are invented for illustration only.
## Walkthrough 1: a 12-client design studio, month-to-month contracts
**Starting point:** 12 clients, average $1,200/month, all month-to-month, no price-lock clauses (confirmed by the contract audit in Phase 1, step 2).
**Step 1, break-even math:** Owner is weighing 10% or 15%.
- 10%: retention needed 90.9%, allowable churn 9.1%. On 12 clients, roughly 1 client.
- 15%: retention needed 87.0%, allowable churn 13.0%. On 12 clients, roughly 1.6 clients.
Owner picks 12%, between the two, after also weighing the Richmond Fed finding that even a 1 percent price change moves annual turnover from 14 to 21 percent. At 12% the owner goes in expecting real churn risk, not a free bump.
**Step 3, segmentation:** All 12 clients scored on the four-dimension rubric. Three land in the test group (newer, lower revenue), seven in the standard tier, two in the top tier (longest tenure, most referrals).
**Step 5:** Owner updates the public price on the studio's site to the new, higher number before any existing client sees a notice.
**Phase 2, test group:** The three test-group clients get the test-group email, effective 30 days out (the month-to-month floor from `references/cadence-timeline.md`). All three reply; two say nothing beyond "got it, thanks"; one asks for a 60-day delay, which the owner grants.
**Reading the test signal:** Zero cancellations against an allowable churn of roughly 1 client at 12%. The owner proceeds.
**Standard tier:** Seven clients get the value-tied template; the named driver is a new weekly reporting step added to the service earlier in the year. One client (the smallest of the seven) cancels at the end of their notice period. That is within the allowable-churn range from step 1, so the rollout is not paused.
**Top tier:** Two clients get the personal-delivery script, delivered by phone. Both stay. One negotiates a locked rate for 12 months in exchange for a referral commitment, logged as a renegotiation, not a plain acceptance.
**Outcome logged for Phase 3:** 11 of 12 clients retained, 1 lost, against a modeled allowable loss of about 1. The actual result landed right at the model's edge, which the owner notes in the roster log as a reason to be slightly more conservative on the percentage next time.
## Walkthrough 2: a 6-person marketing agency, mixed month-to-month and annual retainers
**Starting point:** 22 clients. 14 month-to-month, 8 on annual retainers (two of which carry a 90-day notice clause found in the contract audit).
**Step 1:** Owner tests 8%, 10%, and 15%. Chooses 10% (retention needed 90.9%, allowable churn 9.1%, roughly 2 of 22 clients) after checking that this fell inside the commonly cited 10 to 20 percent range for an accepted annual increase.
**Step 2, contract audit:** The two 90-day-notice annual clients are flagged and routed onto the large-account track in `references/cadence-timeline.md`, dated separately from the other 20 clients on the small-account track.
**Step 3, segmentation:** Tiering splits roughly evenly: 8 test-group, 10 standard, 4 top-tier (the two 90-day contracts are both top-tier by revenue, which is why their longer notice period matters).
**Phase 2:** The test group of 8 holds with one cancellation (a client already flagged in the owner's notes as planning to wind down the engagement regardless of price). The standard tier of 10 gets the value-tied email, naming a cost driver (a tools and software cost increase the agency absorbed the prior year without passing it on). One more cancellation here. The top tier of 4, including the two 90-day clients, gets the personal-delivery script; the two 90-day clients each get a scheduled call rather than being squeezed into a standing weekly sync, and both stay.
**Outcome:** 20 of 22 retained, against a modeled allowable loss of about 2. The result matched the model almost exactly. Logged in the roster log as the baseline to compare the next cycle against (Phase 3, step 14 of the main procedure).
## What both walkthroughs show
- The break-even number sets a planning ceiling for how much churn the increase can absorb. Walkthrough 1 landed right at the edge of it; walkthrough 2 landed inside it. Both count as "the system worked," because both outcomes were checked against that model instead of judged by gut feeling after the fact.
- Contract notice periods change the calendar. The 90-day clients in walkthrough 2 used the same break-even formula and the same tier logic, just a longer cadence track.
- A single bad test-group signal, none appeared in either walkthrough, is always the trigger to pause the rollout and revisit the plan with the owner; the rule stands regardless of how smoothly a rollout goes.Sources
Merged from the top existing skills on the topic, with credit to every input.
Frequently asked questions
How much can I raise my prices without losing all my clients?
Run the break-even math first: retention needed = 1 / (1 + increase percent). A 10 percent increase needs roughly 91 percent of clients to stay to break even; a 20 percent increase needs roughly 83 percent. See what retention rate a number requires before you commit to it.
I already sent a flat price increase to everyone and now I'm losing clients. What do I do?
Stop sending anything else out. Log who has left and who has complained, compare that against what the break-even math says you could afford, and for everyone still active, move to the tiered rollout before another blanket notice goes out.
How do I tell clients my prices are going up without sounding like I'm apologizing?
Tie the number to something real, such as a cost driver, added scope, or a service change. State the new price, the effective date, and what's included, and skip the apologetic tone entirely.
Should I tell my biggest clients the same way I tell everyone else?
No. The highest-value tier gets a call or an in-person conversation, not an email. Everyone else can get a written notice, staged by tier.
How much notice do clients need before a price increase takes effect?
At least 30 days for month-to-month or small accounts, 60 to 90 days for larger retainer or annual contracts, plus whatever the actual contract already requires on top of that.
How often should I revisit pricing?
Quarterly, or whenever the topic comes up again. Re-run the break-even math against the new candidate number, re-tier anyone whose situation changed, and compare the last rollout's actual churn to what was predicted.