River
Y CombinatorBacked by Y Combinator

Free template

Release Notes and Changelog Template

The customer email, in-app message and changelog entry for a release, plus sheets that rank changes by how many customers they reach and schedule every notice.

Free download · No account needed

What you get

Pack of 6 files: 4 documents, 2 spreadsheets

Release Notes and Changelog Template
  • Writing a User-visible StatementDocument
  • Release Notes by AudienceDocument
  • In-app AnnouncementDocument
  • Changelog EntryDocument
  • Change RegisterSpreadsheet
  • Publication CalendarSpreadsheet

How to write release notes and a changelog

Release notes tell customers what changed in your product and what it means for them, in an email, an in-app message or an app store listing. A changelog is the complete record behind them: every notable change, grouped by type and dated, newest first. Good release notes select from that record. They lead with the changes most customers will notice, describe each as something the reader can now do, and announce anything that needs action separately, ahead of time.

Write from what customers can see, not from the ticket list. A ticket list records what the team did; release notes record what changed for the reader.

A woman writing on one of a grid of colored sticky notes on a dark office wall
Sort what shipped by what customers will notice before you write anything. Photo: Vitaly Gariev on Unsplash

Sort the release by what customers can see

Collect everything that shipped since the last release, including changes that went out without a ticket. Then ask one question of each change: if nobody announced it, would a customer notice anything different?

  • Yes: something new exists, or something familiar now behaves differently.
  • Indirect: internal work with an effect customers can see or measure, such as faster updates.
  • No: dependency upgrades, refactors, tests and internal tooling. Leave these out, except security fixes, which belong in the changelog.

Give the indirect changes the most attention. Nobody files a customer-facing ticket for a queue rewrite, yet one that cuts update times from 15 minutes to 90 seconds may be the biggest change in the release.

Don't paste in the commit log, or cover the invisible work with a "various improvements" line. Keep a Changelog, a changelog convention created by Olivier Lacan, says commit logs make bad changelogs because they're full of noise1, from merge commits to obscure titles.

Write each change as what readers can now do

Rewrite each visible change as one sentence about the reader: what they can do now that they couldn't before. Use the present tense and your customers' words, with no ticket numbers or internal component names. When something is renamed, give both names, since people search for the old one.

From ticket title to release note

Merged asRelease note
Persist filter state to localStorageThe shipment list keeps your filters when you come back to it.
Replace polling ingest with event stream consumerTracking updates arrive within 90 seconds instead of up to 15 minutes.
Fix timezone offset on delivery timestamps for AEST accountsDelivery times show in the right time zone for Australian accounts.

Illustrative rows from the sample release in the template.

A speed or reliability claim needs its before and after. If the work began with a product requirements document, its success metric usually names the number worth quoting.

Phrases that tell readers nothing

"Fixed an issue where," "various bug fixes and improvements," "improved performance" with no number, and "we're excited to announce." Say what now works, or leave the change out.

Rank changes by how many customers notice them

Give each change a reach figure: how many accounts will notice it, as a count and a share of your customer base. Take it from plan entitlements, feature flag exposure or the number of accounts that use the screen involved. If you can't get a real number, write unknown rather than guessing.

Then sort by it. A feature built for enterprise accounts might reach 3% of customers, while an unglamorous speed fix reaches all of them. Because reach is a number, it settles the running order without anyone having to win an argument.

Make exceptions by hand and keep the figures visible. A change that reaches few accounts but unblocks a renewal earns its own note to that segment, and a cosmetic tweak everyone sees can sit lower.

Give action-required changes their own notice

Pull out every change that requires customers to do something: a removed endpoint, a renamed export column, a changed default. Each one gets its own message, sent before the release and only to the accounts affected, with the deadline in the first line. Inside a release note, it reaches mostly people it doesn't apply to and gets buried for the ones it does.

ExampleA dedicated notice for a breaking changeAn illustrative example written for this guide. The freight company and its numbers are made up.

Subject: Your CSV exports change on October 14

On October 14, the CSV export column Est. Delivery becomes ETA. If anything you run imports this file by column name, update it before then. An example of the new file is attached.

  • Deadline first. The date is in the subject line and the first sentence.
  • Only the accounts affected. It goes to the 210 accounts that import the file, five days before the release.

Match the notice to the work involved. GitHub, for example, supports each version of its REST API for 24 months2 after a newer one is released, and promises advance notice of breaking changes. Track who has moved before the deadline, and follow up with each account that hasn't rather than sending another broadcast.

The change still goes in the changelog, with its date in the line, so anyone arriving late learns the deadline. Keep a Changelog is blunt about it: "If you do nothing else, list deprecations, removals, and any breaking changes1 in your changelog." For an API, update your API documentation in the same release.

Write release notes for each channel

Now cut the ranked list for each channel. Every version reuses the same sentences, shortened rather than rewritten, so no two channels describe one change differently.

One release, three cuts

ChannelWhat goes inRule
Customer emailThe three to five changes with the widest reachThe subject line names the biggest change, not the version
In-app messageUp to three changes the reader can use from that screenShown where the feature is, with no version number
ChangelogEvery change a customer could noticeNewest first, dated and grouped by type

Name the change in the email's subject line. Nielsen Norman Group's research on newsletter emails found that readers prefer subject lines that describe the content3 over ones that give the newsletter's name or date. It advises putting the key words first and keeping the subject line to 40 characters, so "Tracking now updates within 90 seconds" beats "Release 24.9 is here."

In-app messages work best in context. Nielsen Norman Group's Page Laubheimer classes a list of changes shown at launch as a push revelation4: information out of context that interrupts people trying to do something else. Show each item where the feature lives, make it easy to dismiss, and link the full changelog for later.

Mobile apps add a fourth cut: the app store listing. Apple's App Review Guidelines require apps to clearly describe new features and product changes5 in their What's New text. Only simple bug fixes, security updates and performance improvements may rely on a generic description. Google Play allows release notes of up to 500 characters per language6 and says not to use them for promotion.

Keep the changelog complete

The changelog is the complete record: every change a customer could notice, plus security fixes. Keep a Changelog recommends the latest version first and a date on every release1, with changes grouped as Added, Changed, Deprecated, Removed, Fixed or Security. It also asks you to say whether your version numbers follow Semantic Versioning7.

Before you publish

  • Every change has been checked for whether customers can see it
  • Each note says what the reader can now do, with numbers for speed claims
  • The list is ordered by reach, with unknowns marked
  • Action-required changes went out earlier, each with a deadline
  • The email, in-app message and changelog use the same wording
  • The changelog entry is dated, and the other two link to it

The template at the top of this page works through each step for a sample release. If all you have is a list of commits, turn your commits into a first draft, then run it through the checklist above. If one change deserves a campaign of its own, plan it with the product launch plan template.

How to use this template

Use the files as they are, or open them in River. River asks for the change set in whatever form you have it, such as merged pull requests, a Jira or Linear export or a spreadsheet, plus your account counts. It marks which changes customers can see and rewrites each as something they can now do. Then it ranks them by how many accounts will notice and pulls out anything that needs its own notice before the release.

If all you have is a list of ticket titles, River works from it and says plainly that infrastructure changes are hard to judge from titles alone. That is where the biggest news in a release often hides.

  1. Download it or open it in River

    Download the four Word documents and two CSV sheets, filled in for a sample release, or open them in River.

  2. Sort what shipped

    In the Change Register, mark whether customers can see each change (yes, indirect or no), or send River the change set to sort.

  3. Rank, then write the notes

    Add each change's reach, then write the email, in-app message and changelog entry, or ask River to draft them.

  4. Schedule every notice

    Date each message in the Publication Calendar and track every deadline until all affected accounts have moved.

What's in the template

The release, sorted by who will noticeChange Register, Publication Calendar, and the customer note cut from them.
Release Notes and Changelog Template
RiverChange Register

Change Register

Illustrative rows for a fictional freight visibility platform, Foldbridge. Release 24.9: 143 merged pull requests, 2,180 accounts.

TicketTitle as mergedSeenWhat the user can now doReachAct
PLAT-2841Replace polling ingest with event stream consumerIndirectTracking updates arrive within 90 seconds instead of up to 15 minutes100%
2,180
No
WEB-1190Persist filter state to localStorageYesThe shipment list keeps your filters when you come back to it94%
2,050
No
WEB-1204Add ETA confidence band to shipment detailYesEvery ETA shows how confident it is, so you know which to chase88%
1,918
No
RPT-0442Scheduled report deliveryYesReports can email themselves on a schedule76%
1,656
No
API-0771Add cursor pagination to /shipmentsYesAccounts above 10,000 records can page through all of them12%
262
No
EXP-0155Rename Est. Delivery column to ETA in CSV exportYesThe CSV column Est. Delivery is now ETA. Imports by column name break10%
210
14 Oct
API-0688Remove v1 shipment endpointsYesThe v1 shipment endpoints are switched off. v2 shipped March 20254%
88
1 Nov
SEC-0310SAML SSO with SCIM provisioningYesSingle sign-on with automatic provisioning and deprovisioning3%
64
No
WEB-1177Fix timezone offset on delivery timestamps for AEST accountsYesDelivery times display in the right timezone for Australian accounts2%
41
No
PLAT-2799Upgrade Postgres driver to 15.4No---
WEB-1188Refactor ShipmentCard into three componentsNo---
QA-0233Add Playwright coverage for the booking flowNo---

12 observable, 131 not. Of the 12: five reach above 75%, three between 10% and 75%, four below 10%, and two need the customer to act. The top row is the whole argument for the Seen column: it was logged as internal infrastructure, it has the highest reach in the release, and a note written from the ticket list omits it.

RiverThe Cut

The same release, cut three ways

Three documents, three different cut rules, one set of statements. Nothing gets rewritten between them, only compressed.

ChangeReachCustomer emailIn-appChangelogWhy
Tracking latency100%LeadYesYesHighest reach in the release and the subject line
ETA confidence band88%YesYesYesVisible on the screen the announcement appears on
Filters persist94%YesYesYesNobody asked for it and everybody notices it
Scheduled reports76%YesCutYesNo route to reporting from the shipment list, so the impression is wasted
Cursor pagination12%CutCutYesBelow the email threshold. The people who need it read changelogs
SSO and SCIM3%CutCutYes64 accounts got their own email. 2,116 did not need a paragraph to skip
CSV column rename10%CutBannerYesAction required. Own email on 2 Oct, banner to 210 accounts, deadline in the changelog line
v1 endpoints removed4%CutCutFirstBreaking. Third notice since March 2025, and it leads the changelog
AEST timezone fix2%CutCutYes41 accounts, and every one of them filed a ticket about it
TOTALS-4 items3 items12 itemsSubject line names the change, not the version

Scheduled reports is the row worth staring at. It is in the email and out of the in-app message purely because of placement, which looks inconsistent and is correct: an announcement the reader cannot act on from where they are standing teaches them to dismiss the next one.

RiverPublication Calendar

Publication Calendar

Every artifact the register implies, dated, owned, and tracked to done. The deadline rows carry migration progress.

DateChannelArtifactAccountsOwnerStatus
2 OctDedicated emailCSV column rename notice210SupportSent 09:00
2 OctDedicated emailv1 removal, third notice88PlatformSent 09:00
7 OctChangelog24.9 entry, all 12 changesPublicProductPublished 08:00
7 OctCustomer emailRelease note, 4 changes2,180ProductSent 10:00
7 OctIn-appAnnouncement, 3 changes2,180ProductLive 10:05
7 OctIn-app bannerCSV rename, action required210SupportLive to 14 Oct
9 OctSupport macroCSV rename response template-SupportPublished
14 OctDeadlineCSV column rename takes effect210Support12 of 210 not migrated
16 OctSales enablementTalk track, ETA confidence band-Product MarketingNot started
21 OctWebinar24.9 walkthrough340Customer SuccessScheduled
1 NovDeadlinev1 endpoints switched off88Platform61 of 88 migrated

The two deadline rows are why this sheet exists. Twelve accounts are four days from a format change they have not made, and twenty-seven are still calling an endpoint that disappears on 1 November. Neither fact appears in a release note, a ticket queue or a changelog, and both of them turn into support volume on a date somebody already chose.

  • Writing a User-visible StatementThe method: deciding what customers can see, wording each change, and the phrases to avoid.
  • Release Notes by AudienceThe customer email, in-app message and changelog for one release, with the rule for each.
  • In-app AnnouncementThe in-product message, plus a banner shown only to accounts that must act before a deadline.
  • Changelog EntryThe dated changelog for the sample release, grouped by type, with removals first and ticket references kept.
  • Change Register sheetOne row per change: its title as merged, whether customers can see it, its release note line, reach and deadline.
  • Publication Calendar sheetEvery notice, email and deadline for the release, with its audience, owner, status and migration progress.

Common questions

What should release notes include?

Release notes should include the changes customers will notice, each written as what they can now do, ordered by how many customers each one reaches. Say where to find each change and link to the full changelog for the rest. Leave internal work out, and send anything that requires customer action as its own notice before the release.

Do I need both release notes and a changelog?

Usually, yes. Release notes are a short selection for most customers, sent by email or shown in the product. The changelog is the complete record that admins, developers and support teams check when they need to know exactly what changed. Because the notes link to the changelog, you can cut them hard without losing anything.

How many changes should a release email cover?

A customer release email should usually cover three to five changes. Choose the ones with the widest reach, give each a short heading, a sentence or two and where to find it, then link to the changelog for everything else. An email listing 25 changes reads like a changelog with a subject line.

How far ahead should I announce a breaking change?

Announce a breaking change early enough that the slowest affected customer can finish the work before the deadline. Send a dedicated notice to those accounts before the release, with the deadline in its first line, then follow up with each account that hasn't moved. For comparison, GitHub supports each REST API version for 24 months after a newer one ships.

How often should I send release notes?

Send release notes whenever customers can notice something new, and group small changes rather than emailing each one. If you ship continuously, update the changelog as each change lands and send one email every week or two with the changes most customers will notice.

Is this release notes template free?

Yes. Download the four Word documents and two CSV sheets with no signup. They come filled in with a made-up release for a freight software company, so you can see how each part works before replacing it with your own. Edit with AI opens the same files in a free River workspace.

What does Edit with AI do?

It opens the template in a free River workspace, where River asks for the change set and your account counts. It sorts out which changes customers can see, ranks them by how many accounts will notice and separates anything customers must act on. When you ask, it drafts the email, in-app message and changelog entry. Nothing reaches customers until you send it.

Sources

  1. keepachangelog.com. “Keep a Changelog.” keepachangelog.com (opens in a new tab)

  2. GitHub Docs. “API Versions.” docs.github.com (opens in a new tab)

  3. Nielsen Norman Group. “Email Subject Lines: 5 Tips to Attract Readers.” nngroup.com (opens in a new tab)

  4. Nielsen Norman Group. “Onboarding Tutorials vs. Contextual Help.” nngroup.com (opens in a new tab)

  5. Apple Developer. “App Review Guidelines.” developer.apple.com (opens in a new tab)

  6. Google Play Console Help. “Prepare and roll out a release.” support.google.com (opens in a new tab)

  7. Semantic Versioning. “Semantic Versioning 2.0.0.” semver.org (opens in a new tab)

Written by

Chandler Supple

Co-founder & CEO, River

Chandler has spent the last six years working in AI, building tools for millions of users and Fortune 100 companies. In 2025, he co-founded River to build a new kind of operating system for AI agents.

Reviewed by

Brian Joseff, Co-founder, River