Shipping and supporting

How to write release notes

Release notes serve four audiences with one ship: customers, support, executives, and the on-call developer. Write each for its reader.
steps
8
named failure modes
5
definition-of-done criteria
6

How to write release notes, in one paragraph

Release notes are four artefacts produced from one shipped change: a customer note, a support pack, an executive one-pager and an on-call entry, plus the rollout plan and comms that schedule them. Together they are the ship kit, and they are written before the release date is set rather than after it lands. Good ones trace back to the epic and its share of the outcome's currency target, and claim nothing the passing tests and demonstrated journeys support. Bad ones are a changelog dump forwarded to four inboxes and read carefully by none of them.

That is the procedure. The call is where it meets your delivery structure.

Talk it through

What these are. The delivery operating model our engagements install alongside client teams: the method underneath the agentic work rather than the agentic work itself, published in full and free to use. It is written for the person running a quarter, not for a buyer, so if you are evaluating us, read the five priced engagements or the case studies instead.

When to use this

Every time a done story, or in an AI-native team a done outcome ticket, has been reviewed and product-approved and is about to be given a release date. Write the ship kit as part of scheduling the release, not as a tidy-up after it.

Time to run it once
About three hours, for all four artefacts
What you need
  • An evidence folder holding the commit range, the passing test run and screenshots
  • The delivery tracker

If you do not have those in place, the call is a good place to work out what comes first.

Talk it through
On this page
8 steps

Step by step

Each step is deep-linkable, so you can send a colleague the one that is in dispute.

  1. 1

    Build the evidence folder before you write

    Twenty minutes, one folder, no prose yet.

    Walk up the chain from the ticket: story, epic, outcome, currency target, and copy out the epic's planned share, which the executive note needs exactly. Then collect the commit range, the passing test run, the acceptance criteria or key user journeys with evidence they were demonstrated, screenshots of the new state, the flag name and its default, any migration and whether it reverses, and the rollback procedure with the date it was last run against a real environment. A missing piece is a readiness problem, not a writing problem, and cheaper to find now than at 3am.

  2. 2

    Write the customer note in the customer's words

    Eighty words, three parts: one sentence on what changed, two or three lines on what to do differently, and where to find it.

    First read the last five support tickets touching this workflow and steal the words customers use, because they will not be the feature name your team argued over. Strip ticket IDs, service names, internal team names and anything about the pipeline that built it. If the change sits near a workflow people are protective of, name what has not changed, because that is the fear the note has to answer. If the change is invisible to users, write no note and record that decision on the ticket.

  3. 3

    Write the support pack as answers, not narrative

    Build a four-column table: the symptom in the customer's words, the one-line answer, the ready-to-send macro, and when it escalates.

    Three rows minimum, covering the questions this change will generate, not the ones you wish it would. Add who is affected and who is not, by plan or cohort, and the limitations you shipped on purpose. Then the two lines that save the most time: what a ticket must contain before it returns to the team, and the signal that means stop widening the rollout. Support gets this 48 hours before the first cohort, not on the morning. Hearing about a release from a customer costs more goodwill than the release earned.

  4. 4

    Write the executive one-pager against the number

    One page, four lines: the epic, the outcome it rolls up to, the epic's planned currency share, and what shipped in plain English.

    Then the honest part, in three more: the evidence that exists today, the value expected and through what mechanism, and the date of the next monthly outcome validation, when this number first gets tested. Add a line reading realised value to date, nil. Do not claim delivered value. The epic sits in value monitoring until validation confirms the number or someone closes it saying the value did not land. Reporting a shipped feature as banked value is the one sentence that breaks the loop.

  5. 5

    Write the on-call entry for a tired stranger

    This is the developer changelog in the ship kit.

    Its reader was not involved, is half asleep, and has a pager going off. Name the commit range, the flag and its current default, any migration and whether it reverses, new configuration and secrets, changed dependencies, and the two dashboards or alerts most likely to move. Then the line that matters: the exact rollback step, how long it takes to bite, and whether it has ever been run against a real environment. If rollback means a forward fix because a migration is destructive, put that in the first two lines. Finish with blast radius: which cohorts, which regions, which downstream services.

  6. 6

    Attach the rollout plan and comms schedule

    The notes are useless until someone has agreed when each lands.

    Write the cohorts as percentages with dates: who gets it first, how long you hold before widening, and the named metric and threshold that must hold at each step, so widening is a check rather than a mood. Then the comms: who sends the customer note and when, who briefs support, who posts internally, and whether anything goes to a public changelog. A person's name against every line, never a team name. Hold one cohort at the old behaviour until the seven-day live monitoring check closes, so you keep a clean comparison group for when the number is questioned.

  7. 7

    Draft with AI, then verify claim by claim

    This is one of the places AI earns its keep.

    Hand a model the diff, the ticket, the test output and the demonstrated journeys, and ask for all four artefacts in one pass, each written for its own reader, marking anything it inferred rather than read. Then go line by line and strike every factual claim you cannot point at a specific file in the evidence folder. Models write confident notes about behaviour nobody implemented, and a model reporting that it has finished is not evidence that it has. Product approves the customer note and the one-pager; whoever presses release signs the on-call entry.

  8. 8

    Publish, link back, hand into live monitoring

    Attach all four artefacts to the ticket so the chain holds: anyone opening it reaches the notes, the epic, the outcome and the number behind it. Publish on the schedule, in the order you wrote. Then hand the customer note and the support pack into live monitoring, because for seven days they are what you triage against: the FAQ gets extended as real questions arrive, the macro gets corrected where it was wrong, and the continue, watch or rollback call is made against thresholds you already agreed rather than invented under pressure. When live monitoring closes, the epic stays in value monitoring until outcome validation reports.

Bring a real piece of work to the call and we will walk it through these.

Talk it through
Worked example

A worked example: Ledgerly, an invented invoicing product

The outcome is cut days sales outstanding from 47 to 38, with a currency target of £1.2m in recovered working capital over two quarters. The Q3 roadmap carries an epic, automated payment reminders, with a planned share of £400k. The story shipping on Tuesday is the reminder schedule editor, behind the flag reminders_v2, default off. Customer note, 71 words: You can now set your own reminder schedule. Until today, Ledgerly chased an unpaid invoice once, seven days after the due date. Go to Settings, then Reminders, to choose up to three chase points and edit the wording of each. Your existing invoices keep the single reminder until you change it, so nothing new goes to a customer without you deciding it should. Support pack: three symptoms with an answer and a macro each (why did my customer get two reminders, can I turn this off, why can I not edit the template), a line that legacy-plan accounts do not see the setting and must not be promised it, and one escalation rule, that any report of a reminder sent against a paid invoice comes straight back to the team as a P1 and stops the rollout. Executive one-pager: epic automated payment reminders, outcome DSO 47 to 38, planned share £400k, shipped so that customers can set their own chase schedule. Evidence today, 14 acceptance tests passing and three key journeys demonstrated. Expected value comes from invoices being chased earlier and more than once, and is first tested at outcome validation on 3 October. Realised value to date, nil. On-call entry: commits a41f2c to 9be013, flag reminders_v2 default off, one additive migration creating reminder_schedule, reversible, no new secrets, new dependency on the scheduler queue. Watch reminder_send_rate and invoice_webhook_errors. Rollback, set reminders_v2 to off in the flag console, effective within 60 seconds, no deploy needed, migration can stay in place, last run for real in staging on 22 September. Rollout and comms: 5% internal accounts on Tuesday (Priya), 25% on Thursday if reminder_send_rate stays within 10% of baseline and no P1 has been raised (Priya), 60% the following Tuesday (Priya), with a 10% cohort held at the old behaviour until live monitoring closes on 6 October. Customer note in-app on Thursday (Dan), support pack to the team on Monday (Dan), public changelog at the 60% step (Dan).

Yours will look different. Thirty minutes is enough to see how.

Talk it through
Failure modes

Where this goes wrong

  1. 01

    One note relabelled four times.

    The customer note gets a technical paragraph pasted on the end and goes to everyone. It happens because writing one thing is quicker, and it fails because a note aimed at four readers is read carefully by none of them.

  2. 02

    The changelog dump.

    Ticket titles and commit messages pasted straight into a customer note. Ticket titles are written for the team that raised the work and describe the work, not the change in the customer's day.

  3. 03

    Reporting shipped as delivered.

    An executive note that presents the epic's planned share as money earned kills outcome validation before it runs, because nobody re-examines a number already reported as banked.

  4. 04

    Writing the notes after the release.

    By then the person who knows the blast radius is on something else, and the on-call entry gets reconstructed from the diff by whoever is free, at the moment it is least useful.

  5. 05

    A rollback line nobody has ever run.

    Revert the deploy is not a procedure when the migration is destructive or the flag was deleted in the same release. If the step has never been executed against a real environment, the note says so in those words.

Definition of done

Done means

  • All four artefacts exist, each names its audience, and all four are attached to the ticket before the release date is agreed.
  • Someone outside the team read the customer note and could say what changed and what to do next, and it contains no ticket IDs, service names or internal team names.
  • Support has the pack at least 48 hours before the first cohort, with one answer, one macro and one escalation rule per user-visible change.
  • The on-call entry names the flag and its default, the rollback step, how long it takes to take effect, whether it has been run for real, the blast radius, and the two dashboards to watch.
  • The executive one-pager states the epic's planned currency share and the date of the next outcome validation, and records realised value to date as nil.
  • Every line of the rollout plan and comms schedule carries a person's name and a date, with one cohort held back until the seven-day live monitoring check closes.

If you recognise one of those already happening, that is a good call to have.

Talk it through
If your team is AI-native

An AI-augmented team writes the ship kit per story. An AI-native team has no stories, so it comes off the outcome ticket, and the evidence is what that ticket already demanded: the test requirements passing and the key user journeys demonstrated working. That makes drafting easier and verification harder. Nobody typed the code, so no one carries the blast radius in their head, and the on-call entry has to be derived from the diff and the migration files, then read line by line by whoever will be paged. Ask the model to mark every claim it inferred rather than read, and delete those first.

The two delivery modes, side by side →

Which mode your team is actually in is the first thing we establish on a call.

Talk it through
The subject behind the procedure

Where this sits in a programme

The procedure is the same whatever you are building. These cover what it runs into when the thing being built is agentic.

If you want this run inside a programme rather than read, that is the conversation.

Talk it through
book a call

Want help installing this?

These guides are free and you owe us nothing for using them. If you would rather have operators install the operating model alongside your teams and stay until it sticks, that is what our engagements do.

most start with a fixed-price AI Readiness Audit · £44,000 · 4 weeks · working prototypes

// pick a slot · cal.com/tenhaw/professional-servicesLIVE CALENDAR

Calendar not loading? Open it on cal.com or email hello@tenhaw.com.

Questions

Who writes the release notes, product or engineering?

Whoever shipped the change drafts all four, with a model doing the first pass. Product approves the customer note and the executive one-pager, and whoever presses release signs the on-call entry. One drafter, two approvers, no committee. Tenhaw runs the same split on client engagements, where the agentic lead owns delivery and decision rights inside the client's own management structure and the client owns all code, documentation and work product from day one. If the drafter is not on the rota, someone who is reads and countersigns the on-call entry before the release date is confirmed, because that is the artefact they will be woken up by.

What if the change is invisible to customers?

Then there is no customer note, and saying so is the correct output. Write no customer note required on the ticket so the absence is a recorded decision rather than an oversight. You still owe the on-call entry, because invisible changes are the ones that page people, and support still gets two lines if anything they can see in an admin tool, an export or a log has moved.

Can we auto-generate the notes from commit messages?

You can generate a draft, and you should. What you cannot do is publish it unread. Tenhaw drafts the same way on client work and then verifies every claim by hand against an engineering standard it publishes as open source, 72 rules with RFC 2119 severities on GitHub. Commit messages describe the work, not the change in the customer's day, and they carry service names and ticket IDs that have no business in a customer note. Treat generated text as a first pass to be verified against the evidence folder, and expect to rewrite the customer note almost entirely, because that reader sits furthest from the diff.

Is this proportionate for a hotfix at 2am?

Write the on-call entry first and four lines is enough: what changed, the flag, the rollback, the blast radius. The rest follows within one working day. Do not skip the executive line if the fix changes what the epic is expected to be worth, and do not skip the support pack if a customer might notice, because a hotfix support has not been briefed on generates the same tickets a planned release does, at a worse moment.

Should release notes be written before or after the release goes out?

Before, as part of scheduling the release, not as a tidy-up after it lands. Write the ship kit when a change has been reviewed and product-approved and is about to get a release date, because that is when the person who knows the blast radius is still on the work. Written afterwards, the on-call entry gets reconstructed from the diff by whoever is free, at exactly the moment it is least useful. Budget about three hours for all four artefacts, starting with twenty minutes building an evidence folder: the commit range, the passing test run, screenshots, the flag and the rollback procedure. A missing piece is a readiness problem, and far cheaper to find now than at 3am.

What should customer-facing release notes say?

About eighty words in three parts: one sentence on what changed, two or three lines on what to do differently, and where to find it. Write it in the customer's words, and the quickest way to find those is to read the last five support tickets touching this workflow and borrow the language customers actually use, which is rarely the feature name your team argued over. Strip ticket IDs, service names, internal team names and anything about the pipeline that built it. And if the change sits near a workflow people are protective of, name what has not changed, because that is the fear the note has to answer.

What does the support team need before a new feature is released?

A support pack, at least 48 hours before the first cohort, never on the morning of the release. The useful shape is a table rather than a narrative: the symptom in the customer's words, the one-line answer, a ready-to-send macro, and when it escalates, with three rows minimum covering the questions the change will actually generate. Add who is affected and who is not, by plan or cohort, the limitations you shipped on purpose, what a ticket must contain before it comes back to the team, and the signal that means stop widening the rollout. Hearing about a release from a customer costs support more goodwill than the release earned.

What goes in the developer changelog for a release?

The commit range, the feature flag and its current default, any migration and whether it reverses, new configuration and secrets, changed dependencies, and the two dashboards or alerts most likely to move. Write it for a tired stranger. The reader is a developer who was not involved in the change, is half asleep, and has a pager going off. Then the line that matters most: the exact rollback step, how long it takes to bite, and whether it has ever been run against a real environment. If rollback really means a forward fix because a migration is destructive, that fact belongs in the first two lines, not the last. Finish with the blast radius: which cohorts, regions and downstream services.

Should we report a shipped feature as delivered value?

No. A shipped feature is a claim about work, not about money, and reporting the epic's planned share as banked value kills outcome validation before it runs, because nobody re-examines a number already reported as earned. Tenhaw reports value monthly on its own engagements against the numbers agreed with the client, and a month that moves none of them is reported as a failed month. So the executive one-pager states the epic, the outcome, the planned currency share and what shipped, then the evidence that exists today, the mechanism the value should arrive through, the date of the next monthly outcome validation, and a line reading realised value to date, nil. The epic stays in value monitoring until validation settles it.

What is a ship kit in The Tenhaw Way?

The ship kit is everything The Tenhaw Way requires before a release date is agreed: a customer note, a support pack, an executive one-pager and an on-call entry, plus the rollout plan and comms schedule naming who sends each and when, a person's name against every line. Tenhaw publishes The Tenhaw Way in full, seventeen how-to guides included, free to adopt without hiring anyone. The kit exists because one note relabelled four times gets read carefully by nobody, so each artefact is written for its own reader. All four attach to the ticket so the chain holds back to the epic, the outcome and its currency target, and the customer note and support pack then hand into the seven-day live monitoring window.

What do release notes say when only some customers get the feature?

Say who has it and who does not, in the customer note and again in the support pack. The pack carries a line naming who is affected by plan or cohort, and support needs the negative case in writing, which in the worked example is that legacy-plan accounts cannot see the new setting and must not be promised it. Timing follows the rollout plan rather than the deploy, so the in-app note lands with the cohort that has the change and the public changelog waits until the rollout is wide enough for it to be true. The on-call entry then names the blast radius: which cohorts, which regions, which downstream services.

Our release notes are a changelog dump. What do we fix first?

Split them by reader, then run the test that settles it. Give your last note to someone outside the team and see whether they can say what changed and what to do next. If they cannot, the customer note is the first rewrite, in the words customers use rather than the ones the ticket used. The on-call entry comes next, because written after the event it gets reconstructed from the diff by whoever is free, at the moment it is least useful. Then the support pack, 48 hours before the first cohort. The executive one-pager can wait until the first three are routine. Tenhaw does this repair inside client teams, where a client engineer finished a two-week build 70% confident of running it unaided.

What should you gather before writing release notes?

Twenty minutes of collecting, before any prose. Walk up the chain from the ticket to the story, the epic, the outcome and its currency target, and copy out the epic's planned share, because the executive note needs that figure exactly. Then the commit range, the passing test run, the acceptance criteria or key user journeys with evidence they were demonstrated, screenshots of the new state, the flag name and its default, any migration and whether it reverses, and the rollback procedure with the date it was last run against a real environment. The folder is also what you verify the draft against, so strike any claim you cannot point at a file inside it.

How do you decide when to widen a release to more customers?

Decide before the release. The rollout plan carries the cohorts as percentages with dates, and the named metric and threshold that must hold at each step, so widening is a check rather than a mood. Tenhaw runs client rollouts this way on its engagements, under partner oversight from James Rooney. A plan might start at 5% internal accounts on Tuesday, widen to 25% on Thursday if the send rate the change moves stays within 10% of baseline and no P1 has been raised, then 60% the following week. Every line carries one person's name and a date, never a team name. Support also gets a written signal that means stop widening.

Why keep some customers on the old version during a rollout?

To keep a clean comparison group for when the number is questioned. Hold one cohort, say 10%, at the old behaviour until the seven-day live monitoring check closes. Without it, the only comparison you have is the same population before and after, which moves for a dozen reasons that have nothing to do with your change, and that is exactly what gets picked apart at outcome validation. The held cohort is also a cheap sanity check while the window is open. If a metric looks alarming in both groups, the cause is the week rather than the release.

What if our rollback procedure has never been run for real?

Then the on-call entry says so, in those words, and the conversation happens before the release date is agreed rather than at 3am. Revert the deploy is not a procedure when the migration is destructive or the flag was deleted in the same release. The entry names the exact rollback step, how long it takes to bite, and the date it was last run against a real environment. If rollback really means a forward fix, that belongs in the first two lines, not the last. In practice, having to write that date is what sends someone to run the step in staging first, which is the point of asking.

How do release notes change when a model wrote the code?

Drafting gets easier and verification gets harder. On Tenhaw's own AI-native builds the notes come off the outcome ticket rather than off stories, and the team reading them is two or three senior people, founder-led. An AI-native team has no stories, and the evidence is whatever that ticket already demanded, the test requirements passing and the key user journeys demonstrated working. The catch is that nobody typed the code, so no one carries the blast radius in their head. The on-call entry has to be derived from the diff and the migration files, then read line by line by whoever will be paged. Ask the model to mark every claim it inferred rather than read, and delete those first.

Are release notes finished once they have been published?

No. For seven days the customer note and the support pack are what you triage against. The FAQ gets extended as real questions arrive, the macro gets corrected where it was wrong, and the continue, watch or rollback call is made against thresholds agreed in advance rather than invented under pressure. All four artefacts stay attached to the ticket, so anyone opening it reaches the notes, the epic, the outcome and the number behind it. Tenhaw runs the same window on client engagements and deliberately leaves the FAQ, the macros and the thresholds with the client's own team, because the exit date is agreed at kickoff. The epic then sits in value monitoring until outcome validation tests the planned share.