A paying customer’s site went dark right after they renewed. The renewal itself went through fine. The domain that should have come back online with it never did.

One payment path with no restore step

The renewal had run through a payment path that never had the domain-restore step wired into it. Every other payment path on the account restored a removed domain automatically once the account came current again. This one had simply never been connected to that logic. We added the missing step that same evening, and the customer’s site was back up within hours.

The window looked like the same bug

While we were in that code, something else stood out. Automatic restoration only ran if the domain had been removed within a set window, something like a month. Past that window, the renewal did nothing, silently. The account was left with a paid-up plan and no domain. It looked like the same bug in a different spot: a customer could renew, believe everything was fine, and never know their site was still down.

So we wrote a fix that removed the window entirely. Reconnect the domain on renewal no matter how long it had been off, and tell the relevant team how long it had sat, as a heads-up. That went onto the same branch that same night, queued behind the missing-step fix.

Why removing the window was wrong

Less than two days later, before any of it reached production, we looked again at the reasoning behind dropping the window, and it did not hold up. A domain that has sat disconnected for months carries a risk the short-window case does not: the underlying registration may have lapsed at the registrar. Automatically re-pointing a live site’s DNS at a domain nobody has confirmed is still registered would not fix anything. It would add a new way to fail, one that takes longer to notice.

The window had been right all along. What was broken was that going past it produced total silence. Our overcorrection had sat on the branch for those two days, and the only thing that stopped it was that nothing had shipped yet.

Keeping the window, making it loud

The window came back, unchanged. What changed is what happens when a renewal hits it. Instead of returning nothing, the system now sends the domains team a notice with:

  • the account
  • the domain
  • the date it was removed
  • how long it has been off
  • a direct link to check the domain’s live registration status
  • one plain sentence on why it was not restored automatically

That sentence covers each reason the restore can be skipped: the age window, a domain permanently retired by staff, or the name having been reassigned to a different account since. Every one of those cases used to fail the same silent way. Now they all produce the same kind of message, built from one shared block, so whoever reads it finds the same facts in the same order.

What the safeguard was actually protecting

A safeguard that gets in a customer’s way is not automatically the bug. The question is whether the thing it guards against is real. Here it was: a stale domain removal can mean a lapsed registration, and a person needs to check that before DNS points back at it. The bug was that the safeguard, once triggered, told no one. Removing it would have silenced the complaint and created a worse failure. Keeping it and making it loud fixed both.

So when a safeguard blocks a customer action, find out what it protects against before you take it out. If the risk is real, keep it, and make sure every trigger sends the responsible team a notice naming the account, the domain and the reason. Silence is what to look for.