The month I lost a day of customer data at $40K MRR: a data-loss diary (2026)
In 2026, the fastest way to lose your biggest customer is a backup you never tested. A composite founder diary about the night a botched production migration erased roughly 22 hours of customer data at $40K MRR, when the newer backup had been failing silently for months and the freshest clean copy was almost a day old. It covers what was lost, the email that had to go out, the agency that churned, and the restore-drill and point-in-time-recovery changes that cut the recovery point objective from about a day to five minutes.

In this story
“I found out my backups did not work at the exact moment I needed them to. That is the only time anyone ever finds out.”
I crossed $40K MRR on a Thursday. I remember because I took a screenshot of the dashboard, sent it to my partner, and let myself feel, for about an hour, like the hard part was behind me.
The next night I deleted a day of my customers' data. Not all of it. Just one day. It turned out one day was more than enough to lose my biggest account and teach me the single most expensive lesson of the whole journey: a backup you have never restored is not a backup. It is a hope.
This is a composite diary. The MRR figures are self-reported and lightly rounded, and the founder is a blend of a few people I have interviewed who lived through the same kind of night. The sequence is exact, because it happens more than anyone admits.
The four-minute migration
The feature was small. A new field on the records our customers create every day, plus a backfill to populate it for existing rows. I had run the script against staging twice. Four minutes, clean, no errors.
At around 1am, tired and a little proud, I opened a terminal to run it against production. What I did not notice was that the shell still had staging's habits and production's connection string. The backfill had a bug I had never hit on staging's tiny dataset: under a certain condition it rewrote the wrong column, and for a large slice of rows it overwrote real customer content with an empty value.
The script finished in under a minute. It reported success. I closed the laptop.
I learned what had actually happened at 8am, from a support email with a subject line I still think about: "Where did our stuff go?"
When I reached for the backup
Here is the part I had rehearsed in my head a hundred times and never once in real life.
I had backups. Of course I had backups. Nightly database dumps, running on a schedule, quietly, for over a year. I had watched them exist. I had never watched one come back.
When I went to restore, two things fell out of the sky at once. The most recent nightly dump had completed at roughly 3am the previous night, about 22 hours before the incident. And a newer, more frequent backup job I thought I had set up months earlier had been failing silently since a credential rotation. No alert. No red dot. Just a job that returned early and logged nothing anyone read.
So the freshest clean copy of my customers' data was almost a full day old.
The backups were not the problem. The problem was that I had never once tried to bring one back, so I did not know what "restore" actually cost until the meter was running.
I was living, at small scale, the exact failure that the GitLab January 31, 2017 database incident made famous. In that 2017 outage an engineer accidentally removed the primary database directory, and when the team went to recover they discovered that of their several backup and replication methods, none were reliably working. They restored from a manual snapshot taken roughly six hours earlier and permanently lost the data in between, affecting thousands of projects and comments. Five ways to recover, and the one that saved them was a copy someone happened to take by hand. I had read that post-mortem years before. I had nodded along. I had changed nothing.
The 22 hours I could not get back
I made the call at 9am: restore from the 3am-the-night-before dump, accept the loss, and stop the bleeding. The alternative was trying to reconstruct clobbered rows by hand from application logs, which would have taken days and still been wrong.
The math of it is brutal and simple. Every record my customers had created in that roughly 22-hour window was gone. Not corrupted, not degraded. Gone, because the clean copy predated it.
There is a term for the number I had never bothered to define: RPO, or recovery point objective. It is the honest answer to "how much data can this business afford to lose?" I had never answered it, so the universe answered it for me: about a day. If I had been asked out loud beforehand, I would have said "an hour, absolutely no more." The gap between the answer I would have given and the answer I actually had is the whole story.
The email I did not want to send
I sent one email to every affected account, from my own address, that morning. No legal softening. It said what broke, that it was my mistake and not theirs, exactly which window of data was lost, what I had already done, and what I could not undo. I offered the month free and, where it helped, a call.
Most people were kind. Software people especially. Several replied with some version of "we have all been there," which I did not deserve and was grateful for anyway.
One customer did not reply at all.
The customer I lost
My largest account was a small agency paying about $1,600 per month, a little over four percent of my $40K MRR and by far my biggest single logo. They used my product to hold work they did for their own clients. The data lost in that 22-hour window included a day of that work, work they had already billed, work they now had to redo and explain.
They cancelled the following week. No anger, just a short note that they needed something they could fully trust with client data, and that they understood. That sentence, "we understand," was worse than a complaint would have been.
Two smaller accounts followed them out the door over the next month, spooked by the incident email. MRR slid from $40K to about $37K. It took me almost three months to climb back over $40K, and I never did get that agency back.
What I changed, in the order it should have been done the first time
I did not add heroics. I added the boring things I had skipped.
First, I made restores routine instead of theoretical. Once a month I now spin up a throwaway database, restore the latest backup into it, and run a script that checks the data is actually there. The first drill took an afternoon and surfaced two more silent problems. An untested backup is a guess, and I had been guessing for a year.
Second, I shortened how much I could ever lose. I moved the critical data onto managed storage with continuous point-in-time recovery. On systems like Amazon RDS point-in-time recovery, transaction logs are shipped every few minutes and you restore into a brand new instance at almost any second inside the retention window (AWS docs, accessed 2026). The same incident on that setup costs you minutes of data, not a day. My RPO went from "about 24 hours, discovered live" to "about 5 minutes, on purpose."
Third, I put guardrails between me and production. Destructive and backfill scripts now run inside a transaction I have to consciously commit, require a typed confirmation of the environment name, and are never run from a shell that can silently point at prod. The 1am version of me could not be trusted, so I removed the sharp edges he could reach.
Fourth, I made failure loud. Every backup job now pages me if it does not finish, and a green check only appears after a restore has been verified, not after a dump has been written.
If you take one thing from this
Do not audit your backups. Restore one. This week, before you need to, spin up a scratch database, pull your newest backup into it, and confirm your real data is actually sitting there. You will learn more in that one hour than in a year of watching backup jobs report success. The founders who survive their worst night are not the ones with the most backups. They are the ones who found out, on a calm Tuesday of their own choosing, exactly what a restore costs.
I found out at 8am on the worst morning of my company, from a customer, in the form of a question I could not answer. Pick the Tuesday instead.
Keep reading
- The month I migrated off Firebase at $26K MRR: the other time infrastructure decided the shape of my month.
- The month my biggest integration partner 10x'd its API price at $46K MRR: what single-vendor dependency costs when the ground moves under you.
Sources
- GitLab, "Postmortem of database outage of January 31" (2017): the public write-up of an accidental production deletion where multiple backup and replication methods were found not to be working during recovery. https://about.gitlab.com/blog/2017/02/10/postmortem-of-database-outage-of-january-31/
- Amazon Web Services, "Restoring a DB instance to a specified time" (RDS point-in-time recovery documentation, accessed 2026): transaction logs uploaded every five minutes and restore to a new instance within the backup retention window. https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PIT.html
Written by
Anya PetrovaAnya Petrova writes first-person founder diaries for OperatorBook, reconstructed as composites from interviews with bootstrapped SaaS founders. She focuses on the months that do not make the highlight reel.
Frequently asked questions
Is this a real founder's diary?
It is a composite. The MRR figures are self-reported and lightly rounded, and the founder is a blend of several bootstrapped SaaS operators who lived through a data-loss incident. The sequence of events and the decisions are drawn from real accounts, and the recovery failure mirrors well-documented public incidents such as the GitLab database outage of January 31, 2017.
What actually caused the data loss?
A backfill migration script that had run cleanly against a small staging dataset was run against production late at night. A bug that never surfaced on staging caused it to overwrite a column of real customer content with empty values for a large slice of rows. The script reported success, so the problem was only discovered the next morning from a customer support email.
Why did the backups not save the data?
Two failures stacked. The most recent completed nightly backup was about 22 hours old, and a newer, more frequent backup job had been failing silently for months after a credential rotation, with no alert. The founder had never actually restored a backup, so none of this was known until the moment a restore was needed.
What is a recovery point objective (RPO)?
RPO is the honest answer to how much data a business can afford to lose in an incident, measured as a window of time. If your backups are nightly and untested, your real RPO can be close to 24 hours even if you assume it is an hour. Defining it out loud, before an incident, is what turns backups into a plan instead of a hope.
How do you prevent losing a day of data like this?
Restore a backup on a schedule instead of only writing them, so you learn what recovery actually costs on a calm day. Move critical data to storage with continuous point-in-time recovery so the worst case is minutes of loss, not a day. Put guardrails between yourself and production, such as transaction-wrapped destructive scripts and required environment confirmation. And make every backup job page you loudly when it fails.
Did the founder recover the lost data or the lost customer?
Neither. The roughly 22 hours of data was permanently gone because the clean copy predated it, and the largest account, a small agency paying about $1,600 per month, cancelled the following week. MRR slid from $40K to about $37K and took roughly three months to recover. The agency did not come back.
More stories
The month I migrated off Firebase at $26K MRR: a founder diary (2026)
The month I crossed $26K MRR, my Firebase bill jumped almost six times with no new growth. A composite founder diary on Firestore read costs, migrating the hot paths to Postgres, and why the pattern, not the tool, was the real problem.
The month my biggest integration partner 10x'd its API price at $46K MRR: a founder diary (2026)
In 2026, one four-sentence email can undo a year of growth. A composite founder diary about the month a core integration partner raised its API price roughly 10x and gutted its free tier overnight at $46K MRR, echoing the real 2023 Reddit and Twitter/X API shocks: the triage, the customer email, and the re-architecture that cut our single-vendor dependency.
The month my AppSumo lifetime deal caught up with me at $42K MRR: a founder diary (2026)
At $42K MRR I finally added up what an AppSumo lifetime deal I ran years earlier was really costing me: about 1,150 active lifetime accounts paying $0 a month while eating support and server costs. A 2026 founder diary on the long tail of a lifetime deal, and how I cleaned it up.


