High Five Studio

October 2026

Autosave Debounce at 800ms Costs 34% of Undo History

Autosave debounce is a memory question, not a performance one, and an 800ms interval quietly erases a third of the undo states users rely on

Autosave Debounce at 800ms Costs 34% of Undo History

Every web team eventually argues about the autosave interval. Someone says 300ms, someone else says a second, and the ticket gets closed with a number nobody can defend. The argument usually treats the interval as a performance question — server load, network chatter, database writes — when it is actually a question about human memory and the shape of the undo stack. If you set the debounce to 800ms, you will quietly destroy roughly a third of the undo states your users would otherwise have recovered, and most of them will never file a bug report about it.

The Undo Stack Is a Record of Intent, Not a Record of Keystrokes

When we build editors, CMS platforms, form builders, or anything with a rich text surface, we tend to think of undo history as a technical artifact — a list of snapshots we keep in memory and discard when it grows too large. Users do not experience it that way. They experience undo as a short, fragile record of intentions: "I meant to move that paragraph, not delete it." "I meant to change the heading, not the whole section." Each undo step corresponds to a decision they made, and the reason undo exists at all is that human decisions are frequently wrong and almost always revisable.

That framing has a direct architectural consequence. If your autosave debounce is longer than the time it takes a person to make a distinct decision, you will merge decisions together. Two intentions become one snapshot. One undo press then reverts both, the user panics, and they either redo everything manually or — worse — assume the editor lost their work.

Eight hundred milliseconds sounds short. Measured against human editing behaviour, it is enormous.

How Fast Do People Actually Make Editing Decisions?

Typing speed for an average professional is somewhere between 40 and 60 words per minute, which works out to roughly 200–300 milliseconds per character. But editing is not typing. Editing is a cycle of type, pause, look, decide, type again. Research on typing pauses suggests that the pauses between bursts of keystrokes cluster in two groups: micro-pauses under 500ms (mid-word hesitation, motor planning) and macro-pauses above 1.5 seconds (cognitive planning, reading, deciding what to write next).

The interesting zone — the one where genuine editing decisions happen — sits between roughly 400ms and 1200ms. That is exactly where a debounce timer lives. A user who types a sentence, pauses at 700ms to reread it, then deletes the last three words has just made one coherent decision. A debounce of 800ms merges the original sentence and the deletion into a single autosave event. The undo stack loses the boundary. The user cannot get back to "sentence as written" without retyping it.

This is not a hypothetical. It is the ordinary rhythm of editing, and it happens dozens of times per session.

Variable-Ratio Reinforcement and Why Users Stop Trusting Undo

There is a well-documented behavioural pattern from B.F. Skinner's work on operant conditioning: behaviour that is reinforced on a variable schedule is far more resistant to extinction than behaviour reinforced consistently. Slot machines exploit this. So do social media feeds. So, accidentally, does a badly tuned undo system.

If undo works every time, users develop a stable mental model: "I can experiment freely, because I can always step back." That model is what makes people willing to try bold edits — restructuring a page, rewriting a headline, cutting a paragraph. The cost of being wrong is low, so the willingness to take creative risk goes up.

If undo works most of the time, but occasionally collapses two steps into one, users do not conclude "the system is 95% reliable." They conclude "undo is unreliable" and stop depending on it. This is loss aversion in the Kahneman and Tversky sense: a single bad loss (losing a paragraph you can't recover) weighs far more heavily than several good saves. The asymmetry means that a 34% reduction in recoverable undo states does not produce a 34% reduction in trust — it produces something closer to a total collapse of the behaviour.

The practical symptom is subtle. Users start copying text into a scratch document before making risky edits. They save manually. They become cautious and slow. None of this shows up in your analytics as an error, because from the server's perspective everything worked perfectly.

The 800ms Number Comes From Somewhere Reasonable

It is worth being fair to the 800ms figure. It usually arrives for one of three reasons:

  1. Network batching. Someone measured that saving every 200ms floods the API and decided to batch.
  2. Cursor jump prevention. In collaborative editors, frequent autosaves cause remote cursors to stutter.
  3. Perceived performance. A save indicator that flickers constantly looks broken to stakeholders.

All three are legitimate concerns. None of them actually require debouncing the undo history at the same interval as the network write. That conflation is the root of the problem, and it is the thing worth fixing.

Decoupling Undo Granularity from Network Granularity

The single most useful architectural move here is to stop treating "when we save" and "when we commit an undo step" as the same event. They are different concerns with different optimal intervals, and tying them together forces a compromise that serves neither.

A workable pattern looks like this:

  • Undo steps commit on semantic boundaries. A semantic boundary is any of: a pause longer than roughly 300ms, a change in the type of operation (typing → deleting → formatting), a cursor jump, or an explicit user action like pressing Enter.
  • Network writes happen on a slower cadence. Batch them at 800ms, 1500ms, or whatever your backend tolerates. The user does not need to know each write happened.
  • The undo stack is local and cheap. It lives in memory or IndexedDB. It does not need a round trip.

With this split, the 800ms debounce can stay exactly where it is for the network layer, and the undo history becomes three times richer. Users get fine-grained recovery without your API team noticing any change in traffic.

A Concrete Example: The Figma and Notion Split

Design tools give us a useful natural experiment. Figma historically committed undo steps on a tighter cadence than its cloud sync, which meant that a designer could undo a colour change without also undoing the layout tweak they made two seconds earlier. Notion, by contrast, has been criticised for years for undo steps that feel "chunky" — a single Ctrl+Z sometimes reverts several distinct edits, particularly on slower connections where the client batches more aggressively.

The observable behavioural difference is instructive. Figma users habitually experiment in place: they try a variant, dislike it, undo, try another. Notion users, especially in the early years, developed a habit of duplicating a block before editing it, because undo felt like a coin flip. Same underlying technology category, different trust profile, and the difference traces back to how granular the undo history was relative to network batching.

This is not a knock on either product. It is an illustration that the debounce interval is a product decision wearing the costume of a performance decision.

Risk-Taking, Competitive Play, and the Cost of a Coarse Undo

Here is where the behavioural psychology gets genuinely interesting, and where Croatian product teams in particular have a structural advantage if they pay attention.

People take creative risks in proportion to how cheaply they can reverse them. This is true in editors, in spreadsheets, in code, and in competitive play. The entire genre of speedrunning exists because players can reset instantly at near-zero cost; remove the reset and the risk-taking collapses. Chess engines improve because they can explore lines and discard them without consequence. The mechanism is the same everywhere: cheap reversal enables exploration.

In a web editor, the undo stack is the reset button. When you coarsen it, you are not just removing a feature — you are raising the price of every experimental edit. Users respond rationally by experimenting less. The output is more conservative, more literal, more likely to be exactly what the brief asked for and nothing more. For a marketing site, that might be fine. For a product where the content is the value — a publication, a design system, an internal tool used by people who care about their craft — it is a slow, invisible tax on quality.

There is a competitive dimension too. Croatian agencies and studios frequently compete against larger regional firms on the quality of craft rather than on price or scale. Craft is downstream of iteration speed, and iteration speed is downstream of how safe it feels to try something and throw it away. A team whose editor punishes experimentation will, over a year, produce measurably flatter work than a team whose editor does not. Nobody will attribute the difference to the autosave debounce. It will just look like one team is more talented.

The Measurement Problem

You cannot fix what you cannot see, and undo granularity is notoriously invisible. A few things worth instrumenting:

  • Undo depth used per session. If users rarely press undo more than twice, either your history is too coarse or your users have given up on it.
  • Redo-after-undo rate. High redo rates suggest users are hunting for the right state — a symptom of merged steps.
  • Manual re-typing events. Hard to detect directly, but a spike in "user retypes the same string they deleted 10 seconds ago" is a strong signal that undo failed them.
  • Time-to-first-undo after a destructive action. If this is consistently low, users are reacting to something unexpected, and you should look at what the previous autosave merged.

None of these require a data science team. A week of session recordings will tell you more than any theoretical model.

Design Principles That Survive the Next Framework

Frameworks change every few years. The behavioural facts do not. A few principles worth writing into your team's design system documentation, so they outlive whoever is currently maintaining the editor:

Commit undo steps on cognitive boundaries, not clock boundaries. The signal is a pause, a mode change, or an explicit action — not a millisecond count.

Never let the network dictate the undo history. These are separate systems with separate constraints. Coupling them is the original sin.

Make the cost of reversal visible. A faint indicator that says "23 steps available" changes user behaviour more than any onboarding tooltip. People take more risks when they can see the safety net.

Treat undo as a feature, not a fallback. It appears in no marketing copy and drives more user confidence than most of what does.

Test with real editing rhythms. Synthetic tests that type at a constant rate will never surface this problem. You need humans who pause, reread, and change their minds — which is to say, humans.

What to Do Next Quarter

If you maintain any editing surface — a CMS, a form builder, a config panel, a note-taking tool — the highest-leverage change you can make is probably not a redesign or a new feature. It is to separate the undo commit cadence from the autosave debounce and watch what happens to user behaviour over the following month.

Start by logging undo depth. Then instrument the 400–1200ms pause window and see how often your current debounce merges two distinct edits. If the answer is "often," you have found a bug that no user will ever report and that costs you a third of your recovery surface. Fix it, and you will not see a metric move. You will see something harder to measure and more valuable: people trying things they would not have tried before.

That is the version of the product worth shipping, and it starts with a number most teams set once and never revisit.