How to Structure, Write, and Ship Release Notes for a Developer Platform


You wake up at 3am to a PagerDuty alert. A critical downstream integration is failing. You check the logs. A vendor you rely on shipped a new API version yesterday. They sent an email with a link to a release note that says: "We've updated the user object to support our new identity model."
That is a bad release note. And you are now the one paying for it.
A bad release note for a UI feature annoys users who have to find where the button moved. A bad release note for a breaking API change breaks production systems. The stakes are different, the audience is different, and the format should be different. Most teams do not treat it that way. They use the same generic template they use for UI updates, paste it into a Confluence page, and call it done. If you are searching for how to structure release notes for a developer platform, you are probably in one of three situations: you are launching a new platform and do not have a system yet, you inherited a mess and need to fix it, or you are getting complaints from customers that the current notes are useless. All three are fixable.
Who Is Actually Reading This Thing?

Developer platforms typically serve at least three distinct reader types, and they want completely different things from the same document.
API consumers need contract-level precision. They want to know which endpoints changed, which fields were added or removed, and whether their existing integration will still work after the upgrade. DevOps engineers need deployment implications: does this change require a config update, a new environment variable, or a migration script before the service can restart? End-user developers, the ones building on top of your platform, mostly want a quick answer to a single question: does my integration still work?
If you write one monolithic block of text, none of these people will read it. The structure of the notes has to do the segmentation work for them.
Stripe does this well. Their developer changelog separates API and SDK changes from platform updates, and includes a dedicated section for technical details that readers can expand if they want more context. The top-level entry is scannable in thirty seconds; the technical detail is there for the engineers who need it. Twilio uses a similar tiered approach, separating major deprecation announcements from minor SDK updates so that the signal-to-noise ratio stays manageable for developers who check the changelog regularly. The reason this works is simple: it respects the reader's time. A product manager can scan the top for new features. An engineer can jump straight to the breaking changes. Nobody has to read everything to find what they need.
The Line Between Useful and Useless
There is a version of developer release notes that is too shallow to be useful and a version that belongs in the API reference instead. The useful version lives in between.
A release note entry for a developer platform should answer three questions: What changed in behavior? What do I need to update in my code? What is the migration path? If it does not answer all three for any breaking change, it is not done.
The distinction between breaking changes, additive changes, and bug fixes matters more than most teams realize. Breaking changes are changes that can potentially break an integration: removing an endpoint, renaming a parameter, changing the type of a response field, making a previously optional parameter required. Additive changes are changes that should not break anything: adding an optional parameter, adding a new endpoint, adding a response field. Bug fixes are corrections to existing behavior. These three categories should never be mixed in the same section. Mixing them is the most common structural failure in API changelogs, and it is the thing that erodes developer trust fastest. If a developer has to read through three paragraphs of new features to find out whether something broke, they will stop reading your release notes and start testing against production instead. That is worse for everyone.
The depth question has a practical answer: put the structural change in the release note, and link to the full spec in the API reference. Show before-and-after request examples for breaking changes. Do not paste the entire endpoint spec inline. The release note is for triage and migration planning. The reference docs are for implementation. A developer doing a quick impact assessment should not have to click away to see what changed; a developer doing the actual migration should not have to work from a release note that is already out of date because the spec changed after it was published.

What the Cleanup Process Should Actually Do
Most teams generate draft notes from commit messages or Jira tickets, then a human cleans them up. The problem is that nobody has defined what "cleaning up" actually means, so it ends up being a light copy-edit that does not fix the underlying problem.
A commit message like "Fix incorrect total price calculation in shopping cart" is a good commit message. It is not a good release note. The commit message describes what changed in the code. The release note needs to describe what changed for the consumer of the API. Those are different things. The human writer needs to translate engineer-speak into a clear impact statement, add context that only someone who understands customer pain points would know, and link to the relevant docs. That is the actual job. It is not copy-editing; it is translation.
The cleanup process should also catch the cases where the automated diff is technically accurate but practically useless. A tool like oasdiff can flag every way an API modification can break an existing client. That is genuinely useful for surfacing the structural changes. But a human still needs to write the migration paths, decide whether the reasoning behind a breaking change is worth including, and catch the cases where a commit tagged as an internal change actually has customer impact. As one technical writer put it, a developer might tag a change as a chore, indicating no production impact, but after looking at the code, the change is significant and would impact customers. If you rely on the developer's tag, you miss it.
This is where structured automation helps. You want a system that pulls structured data from the engineering workflow (commit metadata, ticket status, linked docs) so the human writer focuses on clarity and context, not data collection. The detection and the explanation are separate jobs. Automation handles the detection. A human handles the explanation.
How to Tell People Something Is Going Away
Vague timelines create support load and customer frustration. "We plan to remove this soon" is not a timeline. It is a threat with no deadline.
GitHub announces breaking changes at least three months before making changes to their GraphQL schema, giving integrators time to make the necessary updates. AWS provides a phased deprecation schedule that distinguishes between when a resource enters maintenance mode, when it stops receiving updates, and when it reaches end-of-support entirely. The pattern is the same in both cases: a specific date, a specific scope, and a clear migration path. Not "we will remove this eventually."
If the timeline is uncertain, say that. But give a floor. "This endpoint is deprecated and will be removed no earlier than Q3 2026" gives an engineering manager the information they need to schedule the migration sprint. "We will remove this endpoint eventually" gives them nothing except a reason to procrastinate until something breaks.
There is also a protocol-level mechanism worth knowing about. The Sunset HTTP header, defined in RFC 8594, signals the date after which a URI is expected to become unresponsive. The Deprecation header, standardized in RFC 9745, signals that a resource is deprecated and optionally carries the date deprecation took effect. Pairing them gives consumers both the current status and the removal deadline in every API response. Developers who are not reading your changelog still get the signal at runtime. Your release note should document the same information in prose, but encoding it in the response headers closes the gap for integrators who only notice something is wrong when their monitoring fires.
The Part That Costs You Developer Trust
There are a handful of patterns that reliably erode developer trust, and they are worth naming directly.
Vague language is the most common. "Improved performance" tells a developer nothing. "Reduced API response time by 35% for large datasets" tells them something they can act on. The difference is not just clarity; it is credibility. Vague language signals that the person writing the release notes does not know what actually changed, or does not think the reader deserves to know. Developers notice.
Burying breaking changes is the second. Breaking changes go first. Always. Developers scan for risk. If a breaking change is in the middle of a long list of new features, it will be missed. When it is missed, integrations break. When integrations break, you get support tickets. When you get enough support tickets, you get a reputation for shipping breaking changes without warning, even if the warning was technically there.
Using release notes as a marketing channel is the third. "We are thrilled to announce an exciting new feature that will transform how you build on our platform" is not a release note. It is a press release. Developers read release notes to assess risk and plan work. They do not read them to be inspired. The moment a release note sounds like a product announcement, developers stop reading it as a technical reference and start skimming it for the parts that actually matter. You have trained them to ignore you.
Distribution matters too. Developer release notes need to reach people where they already are. An RSS feed for the changelog page, webhook notifications for API changes, in-dashboard notifications for breaking changes, and email digests for major releases. The distinction between push and pull is important: breaking changes require push (email, Slack, dashboard alert), because you cannot assume developers are checking the changelog on the day you ship. New features can be pull (changelog page, RSS), because developers who want to know about new capabilities will seek them out. Twilio offers an RSS feed for their changelog. Slack does the same for their developer changelog. The pattern is worth copying.
The Internal Workflow Most Teams Skip
Most teams struggle with the handoff between engineering and whoever writes the release notes. The process usually looks like this: someone asks an engineer what changed, the engineer sends a Slack message or a Jira ticket, the writer tries to turn that into a release note, and the result is either too shallow (because the writer did not have enough context) or too technical (because the writer copied the engineer's language without translating it).
The fix is to build a process where engineers provide structured raw input (PR description, Jira ticket, internal notes) and a technical writer or product manager translates it into customer-facing language. The key word is structured. If the input is a Slack message, the writer is doing data collection and translation at the same time. If the input is a structured PR template with fields for "customer impact," "migration path," and "linked docs," the writer can focus on translation.
The table below shows what a structured handoff looks like compared to an unstructured one, and why it matters for the output quality:
| Input Type | What the Writer Gets | What the Writer Has to Do | Output Quality |
|---|---|---|---|
| Slack message | "Fixed the auth bug from last sprint" | Track down the PR, read the code, infer the customer impact | Shallow or inaccurate |
| Jira ticket (unstructured) | Internal ticket with engineering notes | Translate technical language, identify customer impact, find linked docs | Variable — depends on ticket quality |
| Structured PR template | Customer impact, migration path, linked docs, change type | Translate and polish | Consistent and accurate |
| Automated extraction + human review | Structural diff, draft entry, flagged edge cases | Add context, write migration path, approve | Consistent, accurate, and scalable |
If your release notes currently take four hours per release because you are manually tracking changes across Jira, GitHub, and Slack, that is a workflow problem, not a writing problem. Doc Holiday generates release notes directly from engineering workflows, pulling the structural changes from the code and drafting the initial documentation, then providing the interface for a senior writer to review, add context, and approve. It is the difference between a writer who spends four hours collecting data and one who spends forty minutes making it clear.

