Back to blog
Review workflow · · 7 min read

How to improve PR reviews and reduce the number of stale PRs

Stale PRs are not a discipline problem — they're a visibility problem. Here's how to fix the review culture on your team with Slack, SLAs, smaller diffs, and a little public recognition.

Open your team's pull request queue right now. How many of those PRs are older than a week? How many are older than a month? How many have one comment from one person and have been quietly drifting since a Tuesday two sprints ago?

Every engineering team has a stale PR problem. Most of them think the fix is a discipline problem — "people just need to review more." It almost never is. Stale PRs are a visibility problem, a culture problem, and a workflow problem, in that order. Here's how to actually fix them.

Why PRs go stale

A PR doesn't go stale because reviewers are lazy. It goes stale because of a chain of small frictions that each individually look reasonable:

  • The author opened it and forgot to ping anyone
  • The reviewer saw the email, marked it read, and moved on to something on fire
  • The diff was 1,400 lines, and nobody had a clear hour to give it
  • The notification got buried under thirty others in GitHub's inbox
  • It sat for three days, the author started a new branch, and the original PR slipped from active memory

None of those steps involve anyone doing the wrong thing. They involve a workflow that assumes everyone will independently remember everything. That assumption fails the moment a team grows beyond three or four engineers.

Step 1: Make the queue visible

The single highest-leverage change you can make is also the most boring: make the state of the review queue impossible to ignore.

GitHub will happily show you a list of PRs on a page nobody opens. What you actually want is the queue surfaced in the place your team already lives — usually Slack — at a cadence that gets attention before things rot. A weekly digest of stale PRs in your team channel does more for review culture than a quarter of all-hands speeches about "shipping faster."

Public visibility flips the dynamic. A stale PR is no longer something an individual reviewer forgot about. It is something the team can see. And the moment everyone can see it, somebody picks it up. Not because they were shamed into it — because they remembered it existed.

Step 2: Bring the review to Slack, not the other way around

Asking engineers to context-switch from Slack into GitHub to check on review state is asking them to lose ten minutes of focus to a habit that doesn't reward them. So they don't do it. So PRs sit.

The fix is to invert the flow. Notifications come to Slack, not the other way around. When a PR is opened, the right channel sees it. When a PR has been waiting too long, the channel hears about it. When someone leaves a review, the author gets pinged directly.

The engineer never has to remember to check. The queue checks itself, and surfaces only when there's something a human should do about it. That's the entire trick.

Step 3: Set an explicit review SLA

Most teams have an implicit review norm and no shared understanding of what it is. One engineer thinks "I'll get to it tomorrow" is fine. Another thinks 24 hours is already too slow. The author of the PR has no idea which model anyone else is operating on.

Write it down. Three sentences, pinned in the channel:

Every PR gets a first response within one business day. A "first response" is a review, a question, or a clear "I can't get to this until Thursday." Silence is not a response.

Then measure adherence. Not to punish anyone — to find out where the system is failing. If half the team is hitting the SLA and half isn't, it's not a discipline problem. It's a load problem, and you have data to redistribute the work.

Step 4: Smaller PRs, faster reviews

A 1,500-line PR is not a code review. It is a homework assignment that a busy engineer will quietly defer. The math is honest: a reviewer who has thirty minutes before a meeting can review three 200-line PRs but cannot review one 1,500-line PR. So the small ones get reviewed and the big one rots.

The cultural shift is to treat PR size as a property of good engineering, not an afterthought:

  • Split refactors from feature work. Always.
  • Land scaffolding before logic. Land logic before polish.
  • If a PR can be split into two PRs that each make sense on their own, it should be
  • The author's job isn't done when the code works — it's done when the diff is reviewable

Teams that internalize this get review turnaround times measured in hours instead of days. Stale PRs become rare for a structural reason: no PR sits around long enough to go stale.

Step 5: Involve the whole team, not the same two reviewers

Every team has a carry reviewer. The engineer whose name appears on 60% of approvals, who knows every corner of the codebase, who quietly keeps the queue moving. When they take a week off, the queue stalls. When they leave, the team discovers what they had been doing.

A healthy review culture spreads the load. That doesn't mean every PR needs every engineer's eyes — it means the distribution of who reviews what should be visible and roughly balanced over time. Once you can see the distribution, you can rotate ownership, pair junior engineers on harder reviews, and stop relying on one person's heroics.

A nice side effect: juniors who participate in review learn the codebase faster than juniors who only write code. Review is where the context lives.

Step 6: Celebrate reviewers, not just authors

Walk into almost any engineering org and look at who gets recognized. The author of the feature that shipped. The engineer who closed the big ticket. The PR that hit main on Friday afternoon. Nobody mentions the reviewer who spent ninety minutes finding the subtle bug in that PR before it shipped — and that's exactly why the carry reviewer eventually burns out and stops doing the work.

Review work is invisible by default. You have to deliberately make it visible. Leaderboards help. Badges help. A weekly Slack message that names the top reviewers this week helps more than you'd expect. It is not about gamification for its own sake — it is about returning credit to a part of the job that has been quietly uncredited for a decade.

Once review work is recognized, more people do it. Once more people do it, the carry reviewer stops being a single point of failure. Once that happens, your stale PR count drops without anyone having to be told to "review more."

Putting it together

The six moves stack:

  1. Make the queue visible where the team already works
  2. Bring notifications into Slack instead of expecting engineers to go fetch them
  3. Write down a review SLA and measure it
  4. Push the team toward smaller, reviewable PRs
  5. Spread review load across the whole team, not just the heroes
  6. Recognize review work publicly so people keep doing it

None of these are technical breakthroughs. They are cultural defaults that any team can adopt in a week. The reason most teams don't is the same reason most stale PRs stay stale: nobody has the time to set up the visibility, so the visibility never happens, so the problem stays invisible.

A shortcut

CodeChamp is built around exactly this loop. Live leaderboards of who is reviewing what across your team. Weekly Slack digests that surface stale PRs and celebrate top reviewers. Badges for depth, speed, and consistency, so the carry reviewer finally gets credit. PR-open and review notifications in the Slack channels you already live in, so engineers never have to remember to check.

Setup is a couple of minutes. The cultural shift it kicks off lasts much longer.

Closing

Stale PRs are not a sign that your team doesn't care. They are a sign that the system surrounding review work is silent by default. Make it loud, make it shared, make it credited — and the queue takes care of itself.

Make stale PRs impossible to miss.

CodeChamp surfaces your team's review queue in Slack, celebrates the reviewers doing the heavy lifting, and turns review activity into a live leaderboard. Two minutes to set up.

Sign in with GitHub