Pricing and billing
Renewal increase notice builder
Turn an old price and a new one into a customer-ready notice that names the exact dollar and percentage change, whichever way it moved.
Free, no accountIn your browser
The product, plan or seat count on the renewal, named the way the customer knows it.
What this bills at today, before the change.
What it will bill at from the effective date.
Left blank, the notice says the change lands at the next renewal instead of naming a day.
Result
$18.00 → $21.00 a month
Up by $3.00 (16.7%).
- Info
$21.00 is $3.00 more than $18.00
The renewal is going up by $3.00, which is 16.7% of the current price. The paragraph below states both figures the way a customer-facing notice needs to: the old price, the new price, and what changed between them.
The price of Microsoft 365 Business Standard is going up at your next renewal, from $18.00 to $21.00 per month - an increase of $3.00 (16.7%). The new price applies automatically from that date; no action is needed on your part.
The change
- Current price
- $18.00
- New price
- $21.00
- Difference
- $3.00
- Percentage
- 16.7%
- Billing period
- Monthly
Customer notice
The price of Microsoft 365 Business Standard is going up at your next renewal, from $18.00 to $21.00 per month - an increase of $3.00 (16.7%). The new price applies automatically from that date; no action is needed on your part.
- This drafts a paragraph from the two prices typed in. It has no view of the contract behind the renewal, so it cannot say whether the notice period it gives is long enough, or whether the wording meets what that contract actually requires.
- The effective date is whatever was typed, not a date checked against a vendor or registry record: nothing here confirms the renewal really falls on that day.
- It drafts text only. It does not send anything, store anything, or know who the customer is - the paragraph still has to be pasted somewhere and sent by a person.
What this is
Writing a renewal price increase notice from scratch means doing the arithmetic in your head while also trying to sound like a person: this page does the arithmetic first, then hands back a paragraph that states the old price, the new one, and the gap between them in the customer’s own figures.
A renewal notice is only as trustworthy as the two numbers inside it. This tool runs the old and new price through the same difference-and-percentage arithmetic the rest of this family uses, then drops the result straight into a paragraph, so the dollar figure and the percentage in the notice are always the figures just computed, never a number typed twice and allowed to drift apart.
It pairs with two events ResellerHQ already emits. `domain.renewed`, which the webhooks guide lists as "A domain was renewed", fires the moment a renewal actually bills - the latest point a notice like this one should already be sitting in the customer’s inbox. `price_list.updated`, listed there as "A price list changed; changed names the settings that moved and customerIds the customers on it", fires earlier, when the price itself is set, which is when the two figures below are known and the notice can actually be written.
Working out the right notice period is a separate question from wording the notice itself - Pricing what you resell: cost, markup and margin (/blog/pricing-what-you-resell-cost-markup-and-margin) covers the former by linking to the guide on markup and price lists, then hands the wording to this builder once the timing is settled.
How to read the result
Read the facts block as the figures to check before sending anything: the current price, the new one, the difference, and the percentage, worked out the same way for an increase or a decrease. The paragraph underneath is the notice itself, ready to paste into an email or a ticket.
If no effective date is entered, the notice says the change lands "at your next renewal" rather than naming a day it cannot confirm. Adding the date swaps that phrase for the day itself, so only enter one you have actually checked against the account.
Common mistakes
What goes wrong most often, and how to tell.
- Sending the notice after the renewal has already billedA notice that arrives the same week as the charge reads as an apology rather than a warning, and plenty of agreements require a minimum number of days’ notice before a price change takes effect. This page has no idea what that minimum is for any given contract - it only drafts the wording, not the timing.
- Quoting the percentage without the dollar figure, or the other way roundA customer weighing a renewal reacts differently to "12% more" than to "$2.40 more a month", even when the two describe the same change, so the notice states both together rather than picking the one that sounds smaller.
- Treating a drafted paragraph as a substitute for what the contract requiresSome agreements require a specific notice period, a specific channel, or specific wording before a renewal price can move at all. This tool only turns two prices into a paragraph; checking that the wording and the timing satisfy the actual agreement is still a step a person has to take.
Questions
What people ask about this tool.
- That depends entirely on the agreement behind the renewal, and this page has no view of it: some contracts set a minimum number of days, some set none at all. Check the actual terms before relying on the notice alone to cover you.
- Percentage change divides the dollar difference by the old price, and there is no meaningful percentage of zero, so the field is left blank rather than showing a number with no honest meaning behind it. The dollar figure is still shown on its own.
- No. It only drafts the paragraph from the prices entered. Pasting it into an email, a support ticket, or wherever the notice actually needs to be sent is still a step a person does, and nothing here stores or transmits anything.
- The notice is still built, worded as a decrease rather than an increase: it names the same old price, new price and percentage, just with "coming down" in place of "going up". A price drop still gets a usable notice rather than being treated as the wrong kind of input.
Use it from the API
The same check, as one request.