All posts

deployment-safety

Why Friday Deploys Are Risky (and What to Do Instead)

Friday deploys are risky because weekend response capacity drops, not because the code is worse. Here is when the risk is real and what to do about it.

Cody Flynn··7 min read

Friday deploys are risky because the cost of a failed deploy rises sharply over the weekend, not because code written on Friday is any worse. Detection slows down, response capacity drops to a lone on-call engineer, and a bug that would be a 20-minute rollback on Tuesday becomes a Saturday incident with nobody around to help. Whether that risk justifies a ban depends almost entirely on how quickly your team detects and reverses a bad change.

Why are Friday deploys considered risky?

The risk in a Friday deploy is asymmetric response capacity. The deploy itself is no more likely to fail on a Friday than on a Wednesday. What changes is everything that happens after it fails.

Consider the actual failure path. A deploy goes out at 4pm Friday. It passes smoke tests, and the team goes home. The bug it introduced is latent: it only triggers under a load pattern that shows up Saturday morning, or it slowly corrupts a cache, or it breaks a weekly batch job that runs Sunday night. By the time an alert fires, the engineer who wrote the change is unreachable, the on-call responder has never seen the code, and the context that would make this a fast fix has scattered across the weekend.

Three things degrade at once:

  • Detection. Fewer engineers are watching dashboards, using the product internally, or triaging user reports. Latent failures sit longer before anyone notices.
  • Diagnosis. The person who shipped the change is often not the person who gets paged. Weekend responders start from zero context.
  • Repair. Fixing forward needs a reviewer and a working knowledge of the change. Both are scarce on a Saturday. Even rolling back is slower when the responder has to first figure out which of Friday's deploys is the culprit.

None of this is about engineering discipline. A team with excellent tests and careful review still has less weekend capacity than weekday capacity. The question is how much that gap costs you when something slips through.

Is "never deploy on Friday" good advice or a meme?

It is a blunt heuristic that encodes a real risk, and treating it as an iron law is a mistake in both directions. The strongest critique comes from Charity Majors' well-known essay arguing that Friday deploy freezes treat the symptom instead of the disease. Her point stands: if deploying frightens your team, the problem is your deploy pipeline, and refusing to ship one day a week does nothing to fix it. Batching Friday's changes into a bigger Monday deploy can make things actively worse, because larger changesets are harder to diagnose when they fail.

The DORA research backs the underlying claim. Teams with small, frequent deploys and low change failure rates recover from bad changes in minutes. For a team like that, Friday is just another day, and a ban costs a full 20 percent of the week's deploy capacity for near-zero risk reduction.

But most teams are not that team. If your rollback takes 45 minutes, your alerts have gaps, or a bad deploy has ever ruined a weekend, then the asymmetry described above is real for you today. Pretending otherwise because elite teams deploy on Fridays is cargo culting in reverse. The honest position: a Friday cutoff is a reasonable interim control for teams whose recovery is slow, and a crutch worth removing as recovery gets fast.

Should you ban Friday deploys entirely?

A blanket ban is usually the wrong shape, because Friday deploy risk is not uniform. A one-line copy change behind a feature flag carries almost none of it. A database migration at 4:30pm carries a lot. Policies that ignore this get routed around, and routed-around policies are worse than no policy, because they teach the team that rules are decorative.

Here is how the realistic options compare:

ApproachWhat it doesWhere it fits
No policyAnyone deploys anytimeTeams with fast rollback, strong alerting, low change failure rate
Informal norm ("we avoid Fridays")Social pressure, no enforcementSmall teams where everyone knows the risk profile of every change
Friday afternoon cutoffNo deploys after a set hour, enforced automaticallyMost mid-size teams; blocks the worst window, costs little
Full Friday banNo production changes all dayTeams with slow recovery, or high-stakes windows like peak season
Risk-scoped policyCutoff applies to risky changes (migrations, infra) but not low-risk onesMature teams with a shared definition of "risky"

The Friday afternoon cutoff is the pragmatic middle for most teams. Morning deploys leave a full working day of detection and repair capacity. What you are actually protecting against is the deploy that lands with no daylight left, and a 1pm or 2pm cutoff captures that without giving up the whole day.

Whatever shape you pick, the rule that matters is this: if the policy exists, enforce it automatically. An unenforced norm fails in the exact situation it exists for, the urgent change at 5pm Friday that someone convinces themselves is safe. This is the same reason announced freezes fail while enforced ones hold: a policy that depends on individual judgment at the worst moment is a suggestion.

What should you do instead of just banning Fridays?

Reduce the blast radius of any single deploy, and time the risky ones for when your team can respond. Concretely:

Ship risky changes early in the week. Migrations, dependency upgrades, infra changes, and anything touching auth or payments go out Monday through Wednesday, when a latent failure surfaces while the whole team is around. This costs nothing and captures most of the benefit of a ban.

Put changes behind flags and roll out gradually. A feature flag turns "roll back the deploy" into "flip the flag," which a weekend responder can do in seconds without understanding the change. Progressive rollouts (1 percent, 10 percent, 100 percent) cap the number of users a latent bug can reach before someone notices.

Measure your real recovery time. Time an actual rollback, not the theoretical one. If reverting a bad change takes under ten minutes end to end, Friday deploys are much less scary and you can loosen the policy. If it takes an hour, that number is the thing to fix, and the cutoff stays until it is fixed.

Make the cutoff a schedule, not a vibe. A recurring enforced window, for example every Friday from 1pm through Monday 6am, applies automatically, shows up on the calendar, and lifts itself on time. Recurring freeze windows cover how to structure these, including timezone handling for distributed teams.

Keep a real override path. Some Friday deploys should happen: security patches, fixes for active incidents, reverts. If overriding the cutoff means finding an admin to disable branch protection, people will either pre-escalate everything or bypass the control entirely. A structured override with a second approver and an audit record keeps the exception honest. The emergency deploys during a freeze post covers what that path looks like.

How do you enforce a Friday cutoff on GitHub?

GitHub gives you the primitives: required status checks block merges, and deployment protection rules gate environment deploys. What it lacks natively is scheduling. Branch protection has no concept of "fail this check after 1pm on Fridays," so teams end up with a cron job flipping settings, or a human toggling protection on and off, which reintroduces the manual failure mode the policy was meant to remove. The how to block merges post walks through the underlying mechanics.

This scheduling gap is what NoShip exists to fill. You define a recurring window (every Friday 1pm through Monday 6am), scope it to the repos and environments where the risk lives, and NoShip fails the required status check during the window and passes it outside it. Emergency changes go through a dual-approval override with a full audit trail, and the app requests no access to your code. The concepts guide covers how windows, rules, and checks fit together.

The practical answer

Treat "no Friday deploys" as a statement about your recovery speed, not a law of nature. If your team detects bad changes in minutes and rolls back in one click, deploy on Friday and enjoy the extra capacity. If it does not, an enforced Friday afternoon cutoff with a clean override path is a cheap control that protects your weekends while you do the harder work of making deploys boring. The teams that get this wrong are the ones that pick a policy based on what elite teams do, or on what a meme says, instead of on how long their last bad deploy actually took to fix.

Keep reading