What the description looked like on the watch page
A description that should have been a paragraph, a blank line and a hashtag line rendered as one paragraph with \n\n sitting in the middle of it in plain text. It was cosmetic, but it appeared on every video that had gone through that upload node.
The field that caused it
The upload node's description field was built like this (references simplified):
={{ $json.description }}\n\n{{ $json.tags.split(', ').slice(0, 4).map(t => '#' + t.replace(/\s+/g, '')).join(' ') }}
It reads naturally: description, blank line, hashtags. The \n\n is sitting between two {{ }} blocks, which is the problem.
A two-line experiment
On a scratch workflow I put both forms into a Set node and looked at the output:
={{ 'desc' }}\n\n{{ 'tags' }} -> desc\n\ntags (backslash, n, backslash, n)
={{ 'desc' + '\n\n' + 'tags' }} -> desc, a blank line, tags
In the first form the \n\n is template text. n8n substitutes the braces and leaves everything else exactly as typed. In the second it is a string literal inside JavaScript, where \n means a newline.
The fix, and the backfill
The live node now builds the whole description as a single expression:
={{ $('Limit to 1 Video').item.json.description + '\n\n' + $('Limit to 1 Video').item.json.tags.split(', ').slice(0, 4).map(t => '#' + t.replace(/\s+/g, '')).join(' ') }}
Fixing the node only helps future uploads. The 16 affected videos were rewritten through the YouTube API's videos.update, replacing the literal sequences in the description with real newlines and leaving the other fields as they were. Then all 18 were read back to confirm none still contained a literal backslash-n.
The habit
Anywhere an n8n field mixes expressions with text that contains \n, put the whole value in one expression. And after any change to how text is published, read one published item back from the platform instead of trusting the execution log. The log records that the upload happened, not what the platform stored.
n8n Automation Hub