Remotion · Troubleshooting

How to Fix "A delayRender Was Called but Not Cleared" in Remotion

This error means something in your composition is waiting for an async operation that never signals it's done — and the fix is finding which one.

This error fires when delayRender() is called — usually to pause rendering while audio data loads, a font finishes loading, or an async fetch completes — but the matching continueRender() never gets called within the timeout window (25 seconds by default).

The most common cause: an error path that skips continueRender

This usually isn't a timing problem — it's a logic bug. A typical pattern that causes it:

const [handle] = useState(() => delayRender()); useEffect(() => { fetchData().then((data) => { setData(data); continueRender(handle); }); // if fetchData() rejects, continueRender is never called }, []);

If the promise rejects instead of resolving — a network error, a bad URL, anything — continueRender never runs, and Remotion waits the full timeout before failing. Add a .catch() that still calls continueRender (even if the data didn't load successfully) so the render doesn't hang on every error path.

Increasing the timeout (when the wait is legitimate)

If the operation genuinely needs more than 25 seconds — a large file download, a slow external API — increase the timeout instead of treating it as a bug:

delayRender("waiting for large asset", { timeoutInMilliseconds: 60000 })

The optional label string is worth adding regardless — it shows up in the timeout error message, which makes it immediately obvious which delayRender call is the one stuck, instead of having to search your whole codebase for every instance.

Checking for the actual culprit in a larger project

In a composition with several components each calling delayRender independently, the timeout error alone doesn't say which one is stuck unless you've labeled them. Add a label to every delayRender call in the project — the five minutes this takes will save much longer debugging sessions later.

Skip the debugging

Async loading logic is exactly the kind of structural code that's easy to get subtly wrong once and then copy the same mistake into every new video. A locked template only has to get it right one time.

See the templates

Common questions

What's the default delayRender timeout?+
25 seconds (25000ms) as of the current Remotion version — check your specific version's docs, as defaults can change between releases.
Can I have multiple delayRender calls in one component?+
Yes, but each needs its own handle and its own matching continueRender call — mixing them up is a common source of this exact bug.
Does this only happen during rendering, or in preview too?+
It can happen in both, since delayRender is part of Remotion's core rendering lifecycle, not a render-only feature.