Pinned data is worth clearing regardless, but there is a second cause with the same symptom and a completely different fix, and it is the one that had me stuck for two days.
The upload is being blocked by Cloudflare’s WAF in front of the portal, before it reaches n8n at all. Liz on the n8n creators team confirmed the mechanism to me on 4 September: the portal sits behind Cloudflare’s WAF, which inspects the uploaded JSON and the description and can block the request with a 403. The portal reports that as “no response, failed to fetch”, which reads exactly like a network blip you should retry. It is not. Retrying identical content fails identically, forever.
You do not need dev knowledge for this one. You need to find and replace specific characters. I found which ones by uploading ten variants of the same workflow, changing one thing at a time:
Arrow functions. Anything of the form x => x.name. Replace with function (x) { return x.name; }
Backtick template literals. Replace with ordinary quotes and + concatenation.
Optional chaining, the ?. operator. Replace with an explicit if (a && a.b) test.
Emojis.
Two things that cost me time and are easy to miss:
It is not only Code nodes. The description field and STICKY NOTE text go through the same inspection. An emoji in a sticky note is enough on its own, and nobody thinks to look there.
The workflow runs perfectly with all of those constructs. Nothing is wrong with your automation. This is purely about getting past the upload, so the rewrite is cosmetic and you can keep the original for your own instance.
The practical version without any dev work: export the workflow JSON, open it in a plain text editor, and use find for => then for the backtick character then for ?. Fix what turns up, re-export, re-upload.
One more thing, because it misled me too: your earlier template being accepted tells you very little. A single added expression is enough to trip it, and the rules are not published.