Product Development

Changelog vs. release notes: Examples, a template, and what the differences are

Jared DeLuca

November 6, 2026

Customer-Centric Product Development

NPS, CSAT & Survey Design

Roadmap & Release Communication

Product Launches

NPS, CSAT & Survey Design

TL;DR

  • A changelog is a dated, versioned list of notable changes to a product, with the newest entry first.
  • Most changelogs sort entries into six types: Added, Changed, Deprecated, Removed, Fixed and Security.
  • A changelog isn't your git log. Commits are written for whoever reviews the code. A changelog is written for whoever has to live with the change.
  • The changelogs that stay useful are the ones with an owner and a habit: entries get written when the change merges, not on release day.
  • A copy-paste CHANGELOG.md template and a hosted-changelog entry template are below.

What is a changelog?

A changelog is a record of the notable changes made to a product, listed newest first, where each entry has a version number and a release date. It tells anyone who depends on your software what changed, when, and whether they need to do anything about it.

In an open-source project, the changelog is usually a file called CHANGELOG.md at the root of the repo, and the .md extension renders as formatted text on platforms like GitHub and GitLab, sometimes mirrored on the repo's GitHub Releases page. In a SaaS product, it's more often a public changelog hosted on your own domain at /changelog. Same job, different address.

Keep a Changelog, the convention most developers point to, calls it "a curated, chronologically ordered list of notable changes for each version of a project." The important word there is curated. A changelog is more than just a list; it's edited communication for users and internal teams. Nobody should have to read every commit to find out that an endpoint was renamed.

What goes in a changelog entry

A good changelog entry has five parts:

  1. Version number. Most teams use semantic versioning: MAJOR.MINOR.PATCH. Bump MAJOR for breaking changes, MINOR for new backward-compatible features and PATCH for backward-compatible bug fixes. Hosted SaaS changelogs often skip version numbers and use the date instead.
  2. Release date, written as YYYY-MM-DD (ISO 8601), so there's no argument about whether 03/04 means March or April.
  3. Change type. Keep a Changelog defines six, and these categories help group updates clearly for readers:‍
    - Added: new features‍
    - Changed: changes to existing functionality
    - Deprecated
    : features that will be removed soon
    - Removed
    : features that are now gone
    - Fixed
    : bug fixes
    -Security
    : fixes for vulnerabilities
  1. A one-line description written from the reader's side: what they can now do, or what will break.
  2. Links to the docs, the pull request or the issue, for anyone who wants the detail. They can also point to additional resources such as docs or tutorials when readers need more guidance.

Many changelogs also keep an Unreleased section at the top. Changes collect there as they merge, and on release day you rename the heading to the new version. Once published, put the latest version first; 27.9% of GitHub repositories contain a CHANGELOG.md file, so familiar conventions are worth following.

Changelog vs. git log: why you can't just publish your commits

This is the most common question in developer threads, and the answer is no. Keep a Changelog states the reason in its header: "Don't let your friends dump git logs into changelogs."

Commit messages are written for code review. Systems like Git generate version history automatically, but that raw history is not a changelog. They're full of noise like "fix typo," "WIP" and "address PR comments," and they describe how something changed instead of what it means for the reader. Ten commits might add up to one changelog line. One commit might need three lines because it changed three things users rely on.

The fix isn't to skip commits. It's to use version control for the complete code history and publish a curated reader-facing summary for everyone else. It's to give them enough structure that a tool can draft the changelog, and then have a person edit the draft. More on that in how to keep a changelog up to date.

Changelog vs. release notes

Short version: the changelog is the complete record, and release notes are the highlights.

A changelog lists every notable change, by version, for the people who need precision: developers, admins, integration partners and your support team. Release notes pick the few changes customers care about and explain what people can now do, usually with visuals that help the target audience grasp major features and new features faster.

Changelog vs. release notes: same release, two jobs.
Aspect Changelog Release notes
ReaderDevelopers, admins, integration partners, supportCustomers and the teams who talk to them
ScopeEvery notable changeThe few changes that matter most
Organized byVersion and date, newest firstTheme or impact
TonePrecise and tersePlain, benefit-led
FormatStructured list, often MarkdownShort narrative with visuals
Lives inCHANGELOG.md, GitHub Releases, a /changelog pageIn-app, email, blog, product updates page
Answers“What changed, and do I need to act?”“What can I do now that I couldn’t before?”

Most teams need both, and the changelog comes first because the release notes are pulled from it. For writing the customer-facing side, see our release notes examples and template.

6 changelog examples worth copying

Three of these are open-source changelogs that live in a repo. Three are hosted changelogs for SaaS products. Between them, they show several changelog formats and can serve as an example set to compare before choosing the best changelog format for your readers.

1. Tailwind CSS: Keep a Changelog, followed to the letter

Tailwind's CHANGELOG.md opens by saying it's based on Keep a Changelog and Semantic Versioning, and then it actually follows both. An Unreleased section sits on top (on a quiet day it just says "Nothing yet!"). Each version has an ISO date and Added, Fixed, Changed or Deprecated headings, and every line links to its pull request.

Steal this: the discipline. If you maintain a library or SDK, this is what developers expect to find, and Tailwind shows the format holds up across hundreds of releases.

2. React: one changelog, many packages

React ships several packages from one repo, and its CHANGELOG.md is organized to match. Each version opens with the headline features and notable changes. Then an "All Changes" section breaks everything down by package: React, React DOM, React Server Components and so on. Most lines credit the contributor by GitHub handle and link the pull request.

Steal this: group by component when your product has several. Someone who only uses one package can skip straight to it.

3. Next.js: the changelog lives on GitHub Releases

Next.js publishes its changes on GitHub Releases instead of in a file. Each release lists Core Changes and Misc Changes as one-line bullets that link to pull requests, then thanks every contributor in a Credits section. Stable releases are marked Latest, and canary builds are marked Pre-release, so nobody mistakes one for the other.

Steal this: if your team already tags releases on GitHub, the Releases page can be your changelog. Use bullet points to make complex changes easier to scan, and separate stable from pre-release so people know which notes apply to them.

4. Supabase: breaking changes in the label, not the fine print

Supabase's changelog is one reverse-chronological feed. Every entry has a date and a type label: Breaking Change, New Feature, Improvement, Bug Fix, Deprecation or Policy. Breaking changes often say so in the title too, as in "Breaking Change: Supabase CLI v3 is local by default…" The breaking-change entries also spell out who's affected, what happens if you do nothing, and the migration steps.

Steal this: make the change type the first thing a reader sees, and give breaking changes a fixed structure. "Who is affected" and "What happens if you take no action" answer the two questions every integrator has.

5. PostHog: every entry has a team and a product area

PostHog's changelog groups entries by week, with a count at the top of each ("23 legendary updates"). Each entry names the team that shipped it, such as Client Libraries or Data Modeling, and readers can filter by category or by team. The whole thing is also available as RSS and as Markdown.

Steal this: say who shipped it. Naming the team tells readers where to send questions, and it gives the teams a reason to keep their entries accurate.

6. Appcues: per-feature entries plus a monthly roundup

Yes, we're including ourselves. The Appcues changelog is a simple changelog with filters, tagging each entry by type (new, improved, fixed) and by product area (Analytics, AI, Integrations and others). An in app widget or notification badge can help users discover the latest version of new updates without leaving the product. Each entry has a GIF and links to the docs. Once a month, a roundup entry like "What's new and better in Appcues: September 2026" collects smaller improvements in one place, but packing too much into one post is less useful than regular, smaller changelog updates.

Steal this: two levels in one feed. Bigger changes get their own entry, and the small ones get collected into a regular roundup.

Changelog template and changelog format

CHANGELOG.md
# Changelog

All notable changes to this project are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added
- 

### Fixed
- 

## [2.1.0] - 2026-11-06

### Added
- Export reports as CSV from the Reports page. (#482)

### Changed
- Search results now sort by relevance by default. Sort by date is still available in the dropdown. (#477)

### Deprecated
- The `v1/users/list` endpoint. Use `v2/users` instead. It will be removed in 3.0.0.

### Fixed
- Dashboard charts no longer freeze when the date range is longer than one year. (#471)

### Security
- Upgraded the session library to patch a token-reuse vulnerability.

## [2.0.0] - 2026-10-02

### Removed
- **Breaking:** Removed support for API keys passed in query strings. Send them in the `Authorization` header.

[Unreleased]: https://github.com/your-org/your-repo/compare/v2.1.0...HEAD
[2.1.0]: https://github.com/your-org/your-repo/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/your-org/your-repo/releases/tag/v2.0.0

Hosted changelog entry template (for a SaaS /changelog page)

Changelog entry template
## [Plain-language title: what someone can now do]
**Date:** 2026-11-06 · **Type:** New | Improved | Fixed | Deprecated | Breaking · **Area:** [product area] · **Team:** [who shipped it]

[One or two sentences: what changed and who it affects.]

- [Detail or limit worth knowing]
- [Anything users need to do, and by when]

[Screenshot or GIF]

[Docs link] · [Pull request or issue, if public]

How to keep a changelog up to date

Most changelogs don't die because the format was wrong. They die because nobody owned them, and three months later someone tries to rebuild a quarter of changes from memory. A few changelog best practices prevent that.

Give it an owner

Someone needs to be accountable for the changelog shipping with every release. In open-source projects, that's usually the maintainer who cuts the release. In SaaS teams, it's often a product manager, a product ops lead or whoever runs the release process, coordinating updates for customers as well as internal teams. The owner doesn't write every entry. They make sure entries exist and read well before they go out, even when product teams supply the raw details and the owner reviews the final wording.

Write the entry with the change, not on release day

The cheapest moment to write a changelog line is when the pull request merges, while the author still remembers why it mattered; writing as changes merge keeps users updated more reliably than waiting for release day. Common ways to make that the default:

  • An Unreleased section. Contributors add a line under Unreleased in the same pull request as the change. On release day, the owner renames the heading and edits.
  • A checklist item. Add "Changelog entry added (or not needed)" to your pull request template, so skipping it is a decision instead of an accident.
  • Changeset files. Tools like Changesets have each pull request include a small file describing the change. At release time, the tool bumps the versions and writes the changelog from those files, and automated changelog generation saves time for teams that ship frequently. It's built for monorepos with many packages.

Let commits draft it, then edit

If your team writes commits in the Conventional Commits format, the commit type maps straight onto semantic versioning: fix: is a PATCH, feat: is a MINOR, and a ! after the type (as in feat!:) marks a breaking change and a MAJOR bump. Release tools can read those types to pick the next version number and draft the changelog for a product or software release.

Treat that draft as a first pass. The right tool reduces manual cleanup, especially for teams that ship continuously. Cut the internal-only changes, merge related lines, rewrite anything that only makes sense to whoever wrote the code, and move breaking changes to the top.

Pick a cadence and keep it

Publish with every release, or on a fixed schedule if you ship continuously, so you can share updates in one central place on a regular cadence. Weekly and monthly roundups both work. A changelog that goes quiet for a quarter and then dumps 40 items at once tells readers to stop checking; regular changelog updates keep customers informed and strengthen user engagement and trust.

Pull release notes from it

Once the changelog is reliable, writing release notes gets much faster: pick the two or three entries customers will care about, adapt them from the changelog for your target audience, and rewrite them around what people can now do. Link the release notes back to the changelog for anyone who wants the full list, and distribute them across multiple channels so users updated in-app or by email are more likely to see them. Our release notes guide covers that side, including why your changelog now has AI readers as well as human ones.

How to write changelog entries people can use: best practices

  • Write for the person who has to deal with the change. A good changelog uses plain language for the person affected, not internal wording. "Fixed a race condition in the session handler" helps your engineers. "Fixed: some users were logged out after switching tabs" helps everyone else. When you can, write the second and link to the first.
  • Put breaking changes where nobody can miss them. Label them, list them first within the version, and say exactly what to do: the new endpoint, the deadline, the migration guide.
  • Give every change its own line and its own link. One line per change makes the changelog easy to search and easy for support, docs, and users to point people to, which can improve feature adoption.
  • Leave out what nobody outside the team would notice. Refactors, dependency bumps with no visible effect and internal tooling changes don't belong in the changelog.
  • Be consistent. Use the same change types, date format and heading structure every time, so readers learn where to look. A consistent format is one of the core best practices for a useful changelog format.

Getting deprecations and breaking changes in front of the people they affect

Here's the uncomfortable part about changelogs: the people who most need an entry are often the least likely to read it. The admin whose integration still calls an endpoint you're retiring isn't checking your changelog every week. They find out when it breaks.

That's the part Appcues handles. Your changelog stays the source of truth: the public changelog remains the canonical record, while in-product messages handle visibility. Appcues takes the entries that require action and shows them, inside your product, to the specific people they affect:

  • Only the people who need it. Target by role, plan, account or behavior. The admin who still uses the old endpoint sees a Banner with the deadline and the migration guide, and everyone else is left alone. Direct notification works best for major features or urgent changes.
  • At the moment it's relevant. A Pin next to a redesigned setting, or an in app widget that keeps a running "what's new" list one click away, helps users discover less-urgent new updates without interrupting them.
  • With proof it worked. Experience analytics show who saw the message and who acted on it. You'll know which accounts still haven't migrated before the deadline, not after.

Your changelog records what changed. Appcues makes sure the people it affects find out in time, which supports trust and product adoption. See how it works.

FAQs

What is the standard changelog format?
What should a CHANGELOG.md file include?
Should a changelog include every commit?
Can you generate a changelog automatically?
Where should a changelog live?
How often should you update a changelog?

Stay connected with Appcues

Sign up for Quickcues and get our monthly updates!