Available — part-time slots from Q4 2026 UK · Remote BST · GMT+1
All fixes
F/11 10 min read reviewed Sep 2026· Strapi 5

strapi transfer dies partway through

TL;DR

strapi transfer runs for a while and then dies, usually with an abort that looks identical no matter what actually failed. The trick is that the failure stage tells you the cause and the error string does not. Read the log for where it died: entities, links or assets. Each points at a different problem and a different fix. And before you plan around it, know that the old folklore is wrong: since 5.52.2 a transfer no longer wipes the destination.

00· Before anything

First: read the log for the stage, not the error

Every stage of a transfer can end in the same abort, so the error string is nearly useless on its own. What matters is the stage the log died in. Transfer moves entities, then links, then assets, and a failure in each is a different article's worth of cause behind one identical-looking message.

Find the last stage that made progress before the abort. Entities, links and assets each point somewhere different below.

Do not retry blindly. A transfer that dies in assets and one that dies in links need opposite fixes, and rerunning the whole thing just burns time and, on large media sets, bandwidth.

Likely causes · The order I check them

bars = diagnostic order from experience, not measured frequency

Cause 01 of 05

Assets: the WebSocket closes on large media sets

Symptom

The transfer gets through entities and links, then dies in the assets stage, on projects with a lot of media.

How to confirm

Confirm the log died in the assets stage, and that the run had been going long enough for a large media transfer to stall.

Why it happens

There is a stall detector, transfer.remote.assetIdleTimeoutMs, default 300000ms, that aborts an asset stream when it makes no forward progress. A slow or briefly stalled large-media transfer trips it.

The fix

Raise transfer.remote.assetIdleTimeoutMs, and split the run so assets move on their own: --exclude files for the first pass, then --only files for the media.

bash
# everything except media
strapi transfer --to <dest> --exclude files

# then media on its own, with a longer idle timeout
strapi transfer --to <dest> --only files

assetIdleTimeoutMs and its default are documented. Splitting the run with --exclude/--only is the practical workaround for a media set large enough to trip the detector.

06

The correction worth the whole page

The folklore is that a transfer wipes the destination. That is now wrong, and it is worth correcting loudly. Since 5.52.2 the documented behaviour is replace-and-preserve: transferred stages are replaced, omitted stages are preserved, and admin types and content-releases are always preserved. If you filter with --only or --exclude, the omitted stages survive. So the split-run fix above is safe: excluding files on the first pass does not destroy the files already at the destination.

One conclusion I draw that the docs do not state: there is no supported path from a v4 instance into a fresh v5 instance via transfer. What the docs actually say is that transfer uses strict schema matching, and that v4 to v5 is an in-place upgrade. Those support the conclusion, but they are not the same as stating it, so treat it as an inference and verify against your versions.

Common questions

Diagnosed everything and still stuck?

S/01 — Performance & Architecture Rescue.

A fixed-scope week that finds the cause and fixes what's causing it.