What if release day didn’t have to be the worst day of the sprint?
Release days can be hectic, especially for a fully remote team in charge of documenting 120+ data products. I redesigned my team’s release communication system, reducing prep time by 40% and creating a process anyone on the team could facilitate.
Role: Took ownership of release operations after manager departure; coordinated across writers and release management
Scope: API releases every 3 to 5 weeks, fully remote team documenting 120+ data products
Timeline: 1 to 2 months to full implementation (September 2024)
My manager had recently departed the team and passed on the duty of shepherding release days to me. I had looked over her shoulder plenty of times and she had prepared me well.
Yet release days were hectic and stressful. Multiple writers had to coordinate documentation and swagger model updates, along with release notes, announcements, and translations in a single day. Small mistakes kept recurring, especially in deprecations, because there was no review gate before release day.
This wasn’t a skill issue. My team was highly capable, but we had a half-baked process, no shared artifacts, and no way to onboard someone new into the release shepherd role without tribal knowledge.
Three layers, designed after observing the first few releases and talking to every writer one-on-one.
Pre-release checkpoints. I conducted two go/no-go meetings: one with writers 3 to 4 days out, one with release management 1 to 2 days out. The second meeting specifically targeted the recurring deprecation errors.
Standardized templates. I created templates for release notes and individual announcements. Writers could focus on what’s in the release, not the formatting.
Sequenced release-day messaging on Slack. I created a reusable boilerplate message to send out on release day. Every step was numbered, and every step was owned. I included steps that explicitly outline when to communicate and how, and who to contact when things go wrong.
This was the artifact that made the biggest immediate difference. The before/after tells the story better than I can describe it.
Before — the old release message:
Happy release day! Sending out order of operations and reminders:
- Data Products
@Writer A — API 1, API 2, API 3
@Writer B — API 4, API 5Reminders: Mark strings for translation for guides + announcements. Do not mark strings for models and references. Merge and push your changes to mainline but do not publish.
Tables and comms
@Release shepherd — deprecations table, reminders, models table, release notes (in that order)Publish mainline
This message assumed everyone already knew the full process. It compressed critical sequencing into shorthand. It didn’t tell writers when to communicate status, didn’t clarify what “do not publish” meant in context, and buried the translation instructions as an afterthought.
After — the redesigned release message:
@channel
Hi team, here are the order of operations for release today. Please read carefully, communicate frequently with your teammates in this channel, and ask any clarifying questions if needed!
Writers push data product release items and doc changes into mainline. Items include: model, reference, use case guide, and the model in the repository. Basically, everything except for announcements.
@Writer A: API 1
@Writer B: API 2, API 3
@Writer C: API 4, API 5, API 6Reminder: Push to mainline, but do not publish.
Communicate in this channel on the status of your products when you have merged them. Use the @channel or @here tag, so everyone is in the loop.
Push models, deprecations tables, and release notes to mainline and communicate in channel (owner: @release shepherd)
Publish mainline (owner: @designated publisher)
When mainline is finished publishing, writers publish their individual data product announcements and deprecation reminders in the publishing platform dashboard.
Writers mark translation strings for all items that they have published on the platform, except for the models and references. Contact @release shepherd for questions about how to do this, or if you need access to the translation tool and need assistance.
As release day progressed, team members would update the thread with their status, and I’d edit the original message to add green checkmarks next to completed steps. The message became a live dashboard — everyone could glance at it and know exactly where we stood without asking.
The problem wasn’t that the team didn’t know how to release. The problem was that the process lived in one person’s head, and when that person left, the team had to reconstruct it under pressure every cycle. I built communication infrastructure that made the process legible and repeatable.
After implementing the new process in September 2024:
I’d ship an imperfect first draft before my first release as shepherd, not after a few cycles of observation. I learned a lot from watching the process break, but the team absorbed that pain in the meantime.
I’d also build in a lightweight retrospective after every release, not just when something goes wrong. The go/no-go meetings caught errors before they shipped, but a 10-minute post-release check-in would have surfaced the smaller friction points that didn’t rise to “significant issue” but still slowed people down.