Back to Blog
Engineering

The $100 Saturday Panic Call: A Visual Bug Post-Mortem

Atanas Ivanov·June 3, 2025·8 min read

Saturday, 2:47 PM

Your phone buzzes. It's a Slack message from your project manager: "Client is FURIOUS. Checkout page is broken. How did this get through?"

You open the client's site on your phone. The checkout button is there, but it's white text on a white background. Completely invisible. Users have been trying to buy for the last 18 hours and can't find the button.

The Timeline

Thursday, 4:30 PM — A junior developer pushes a PR that refactors the button component styles. The change looks clean: moving from inline styles to CSS modules. All tests pass. Lint is green. The PR gets two approvals.

Thursday, 5:15 PM — The PR merges to main. CI/CD deploys to production. No errors in the logs.

Friday — Sentry dashboard: zero alerts. Server health: nominal. Nobody notices anything wrong because technically nothing _is_ wrong. The app works perfectly. Every API call succeeds. Every database query returns the right data.

Saturday, 8:00 AM — The client's marketing team launches a weekend flash sale. Traffic spikes 3x. Conversion drops to zero. Nobody can find the checkout button.

Saturday, 2:47 PM — The panic call.

The Root Cause

The CSS refactor changed the button's color from an explicit color: #7C3AED to inheriting from a parent class. On the developer's machine, the parent class resolved correctly. In production, a different CSS load order meant the button inherited color: white from a higher-level reset.

No JavaScript error. No console warning. No failed network request. Just a button that was technically rendered but visually invisible.

What Should Have Happened

If the PR had included automatic screenshot comparison, the reviewer would have seen this:

  • Before: Purple button, clearly visible against the white card background
  • After: White rectangle where the button should be, no visible text

The diff would have been flagged instantly. A 30-second CSS fix in the PR. No weekend panic. No lost sales. No damaged client relationship.

The Math

Let's tally the actual cost of this bug:

ItemCost
Lost sales (18 hours × $0 conversion)~$12,000
Emergency developer time (Saturday rate)~$800
PM + client management time~$400
Post-mortem meeting (6 people × 1 hour)~$600
Client trust damagePriceless

Total: ~$13,800 for a bug that would have been a 30-second fix in the PR.

Never Again

After this incident, the team implemented visual regression testing with Vizipy. Every PR now automatically:

  • Screenshots all critical user flows
  • Compares against the main branch baseline
  • Posts a visual diff directly in the GitHub PR
  • Blocks merge if unexpected visual changes are detected

The next time someone refactors button styles, the screenshot diff catches it before it ever leaves the PR. The $100 Saturday call becomes a $1 Tuesday fix.


*Don't wait for your own Saturday panic call. Set up Vizipy in 5 minutes and catch visual bugs at PR time.*

Catch visual bugs before they ship

Vizipy runs on every PR, generates before/after screenshots, and posts visual diffs right in GitHub.