Writing a meaningful update for customers every week has been held sacred at incident.io since we started the company. We've written over 200 of them in the past 4 years, and we recently celebrated going 2 years straight without missing a single a single week đ
The numbers themselves are not the goal, but the consistency of this habit and what it represents for our customers and our team is very real, and special to me.
It's something I get asked about surprisingly often by founders and product leaders at early stage companies especially, so I thought it'd share some insights into why we do this and how over the years our team have turned writing changelogs into a simple, quick and well oiled process.
Apply some principles
I know, I know, this sounds like an overly philosophical starting point, but âHaving a changelogâ is just step one. You need to know why youâre doing it, what you care about and how youâre going to ensure it doesnât die on the vine and becomes baked into your team DNA.
Below are the three principles I put in place early on for our changelog, which havenât changed all that much through the years.
1. We write an update every week. No exceptions.
If you speak to the team here, this is likely the thing they will probably tell you I care about most when it comes to the changelog, and theyâd be absolutely right.
We published the first update the week after we launched, and the goal has been to ship at least one a week ever since. Our changelog represents the thousands of hours of effort everyone here has put into our product, the value weâre delivering to our customers. We frequently start off the week by asking the question, what will customers be able to do by Friday, that they cannot do today? Changelogs are a great way to see if we achieved that!
Especially as an early stage startup, it felt really important to Stephen, Chris and I when we started out, that when we were telling potential customers, âWeâre small, but you should bet on us, we ship super quickly and listen to feedbackâ we have a track record to prove it. 4 years later, this feels no less important.
Sometimes (less so these days!) we have a week where it feels like there was nothing âbigâ. My default answer is simple: then we just talk about the small things, and perhaps itâs time for some reflection on why that is and if weâre ok with it. It still goes out. No exceptions.
A few times i the early days, one of us would ponder âdo we even have enough to justify a changelog this week?â but usually with some light prompting, and a dig through Linear and GitHub, weâd realize weâd actually shipped quite a lot, we just forgot about it amidst in the chaos.
So far, weâve never had a week where we had nothing to share. I hope you never do either. After all, if nobody has shipped any value to customers all week, what the hell have we been doing?
2. It must be written by a human
Itâs not long before, especially with smaller updates, it becomes tempting to copy and paste a list of tickets, or âauto-generateâ a summary of updates for the week. Especially as an engineer, the âlong listâ starts to feel a lot like the commit logs or technical changelogs weâre all used to.
It sometimes feels like the sort of thing you could automate somehow. Fight the urge! It isnât, and it shouldnât be.
Writing it and manually reviewing everything that goes into it is a part of the process it forces you to think hard about how you would frame the value of the change to the customer, vs often tickets or bugs being more clearly âwhat to fixâ.
3. We scope updates to last week only
This includes âbig thingsâ like new features and announcements, as well as small things like visual improvements and bug fixes. We start with âeverythingâ by default and then remove anything thatâs sensitive (i.e., a customer-specific change), or highly specific and technical (i.e., infra or config changes).
Weâve got to the point where we ship so many changes now (thousands a month!) that we also tend to omit some smaller technical or visual fixes that are harder to describe or donât make sense without a lot of context.
We try not to roll things over to the next weekâs changelog. Each week should snapshot one particular week of progress.
Some weeks weâll have a ton of things to cover and we canât fit it all in without it feeling overly lengthly, weâll write what we call a âbonus changelogâ. Bonus changelog weeks are, inevitably, pretty awesome ones đŞ
Start Simple
When we started, everything was deliberately very manual. I explored the idea of changelog sites, fancy products tools but in the end, I literally copied and pasted our blog codebase, renamed it and called it the changelog.
We'd create one markdown file each week, pick a âbig thingâ and then write up all the smaller tickets weâd shipped that week, by reviewing a filtered view in Linear for everything that had been closed the previous week.
This lasted for years. Eventually though, we moved our blog to a CMS and brought this along with it.
Sweat the small stuff
Every week, we have a bot which pulls a list of issues from Linear that were completed in the past week, and it tags the people who were assigned. We group them by who shipped the change, essentially giving everyone a clear âmini todo listâ.
Everyone responds in the thread with an articulation of their change that they think would make most sense for customers. If they donât think any of their issues warrants adding to the changelog, they just say that.
Weâre explicit either way, which helps the person writing the changelog to know once everyone has taken a look, then they're good to go. We also add relevant emoji indicators, such as:
- đ New feature!
- đ Â Polished a rough edge
- đˇââď¸Â Investment / something non-customer-facing
- đ Fixed a bug
Since our changelog is often written by an engineers who have a tonne of context, this is also a great way to remind ourselves that the goal is not to write these smaller updates in the same way weâd write a commit message, issue summary, or something more technical intended for internal audiences.
Instead, we try and make our changelog updates as customer centric and user-friendly as we can, focussing on what users can do now that they couldnât before, and how weâd explain this to a customer if we were speaking face-to-face (which we often are!).
Here are a few examples:
Before đ¤ | After ⨠|
---|---|
Improve cache expiry approach for public status page updates | Weâve sped up the time it takes from when you publishing a status page update, to when itâs visible on your public page |
Allow setting boolean or numeric values in catalog importer | The catalog importer now handles boolean and numeric values correctly, rather than treating them as strings. |
Make workflow expressions work well with Microsoft Teams | You can now create workflow expressions that reference Microsoft Teams Channels, so you can send messages to them. |
A lot of this was inspired by our experiences at Monzo, where everyone underwent an onboarding session called âWriting Slightly Betterlyâ with Harry Ashbridge. Their tone of voice guide captures a lot of great principles. Weâve also written about how this has influenced our product copywriting, too.
Keep process light
We draft all our changelogs in a big Notion database, before copying them over to our website. This gives us a chance to review them, add comments and share internally first.
We handle everything in a single channel internally. Unsurprisingly, this is simply called #changelogs.
Where we know whatâs likely to ship in advance, weâll propose titles / topics and have authors lined up in advance, so folks know that theyâll be owning the changelog for a given week.
This also ensures we can spot early on in the case any weeks look a bit light, or weâve accidentally pencilled someone to post while theyâre on holiday.
Otherwise, the overall process is incredibly simple, very much by design.
It looks like this (I pretty much just copied this over from the internal Notion page):
- Draft the content of the changelog in the Notion Database
- By 10am Tuesday, tag someone from design to help create a good hero image and revie any product screenshots. Default to whoever was involved in designing the âbig âthingâ for this week
- (Optional) Get an initial review from the team in #changelogs while itâs in a draft state
- Move the post into our CMS. Shoutout to the folks at Sanity, who power this â big fans!
- Share the post preview in #changelog for a final review. We have a rota of Product Managers for this (powered by our on-call schedule <> Slack sync functionality.
- Check the social cards look good via socialsharepreview.com
- Hit publish!
To help avoid any last minute rush, we also have an automated Slack reminder in our #changelogs channel to ensure weâll have any design assets / images ready in time.
Track it, at least for fun!
Iâm a data nerd, so naturally I have a nerdy little spreadsheet where I track everything and record out all the changelogs we publish by week, along with how delayed it was and whether we included bonus changelogs, too.
For the first few years, we grew super fast and we did have a few weeks where we were super busy and just forgot, but back in 2022 we got serious about it, wrote up a little process and never looked back!
If youâre interested, Iâve made a copy of the spreadsheet here with all itâs crazy formulas and formatting ready to go for those who want to start their own.
I also wrote a little script that pulls the RSS feed for the changelog to make updating it easier, so it only takes a few seconds. If youâre technically inclined, itâs probably fairly easy to adapt to your own changelog if you have one.
curl https://incident.io/changelog.xml | xq | jq -r '.rss.channel.item | map({title,link,description, pubDate} | .pubDate |= gsub(" GMT";"") | .pubDate |= strptime("%a, %d %b %Y %H:%M:%S") | .pubDate |= mktime | .pubDate |= todate | .pubDate |= fromdateiso8601 | .pubDate |= strftime("%Y-%m-%d")) | sort_by(.pubDate) | reverse | .[] | [.title, .link, .pubDate, .description] | @tsv' | pbcop
Close the loop with customers
We do a large proportion of our customer support in Slack. We started out by subscribing every channel to our changelog's RSS feed so each week, when we published, all customers got a post in their channel.
Over time, we realized every week was a little noisy for some, so we moved to writing less frequent "Customer Changelogs" covering a few weeks at a time, as well as referencing more general company updates like SEV0, the conference we ran earlier this year.
Weâve created some automation so that any emoji reactions or replies to changelog posts in customer channels get piped into #changelogs-pulse and itâs always fun getting the dopamine hit from hundreds of customers reacting and getting excited for the latest updates â¤ď¸
We also found that whilst we were generally good at remembering to circle back with customers who gave feedback, we sometimes missed a few and we had no reliable way to also let their Account Exec and Customer Success manager know, putting them on the backfoot.
We now tag all customers against issues in Linear with labels, and automatically connect this with our customer CRM so we can send super tailored messages when a change ships, like the one reported by the Netflix team below. Itâs pretty awesome and means our Product and Commercial teams are always in lock-step on what weâre shipping for our customers!
Just start!
This is one of the pieces of advice Iâve given over the years to early stage founders looking for tips on getting their teams shipping quickly and keeping up momentum each week. Itâs an incredible motivator and an easy way to hold yourself and your team to account with colleagues and customers alike.
I often find companies are already doing something similar internally in all-hands, or perhaps weekly updates in Slack. Making it public just takes things up a notch and really tests whether youâre proud of the work and if customers think itâs as good as you do.
Good luck
Whatever your changelog situation or aspirations, I hope some of the above was helpful and perhaps prompts some productive conversations in your team.
For my part, Iâm extremely proud of our team for keeping this up for so long. We haven't dropped the ball once for over 2 years and we've written 57 changelogs this year alone, meaning we'll potentially end with close to 70 - the most we've ever published in a year.
With only 7 to go for the rest of the year, we plan to make them count! đŞ