n8n logon8n Automation Hub
Debugging notes

My n8n Telegram Alert Failed on "Can't Find End of the Entity" — This Time From a Leftover HTML Tag

Debugging notes · n8n workflow · September 5, 2026

A Telegram alert node in a video-render watchdog started failing with the same "can't parse entities" 400 error as a different workflow — but the cause here was a leftover <b> tag in the message text with no parse mode explicitly set, not a stray character from an LLM.

Workflow at a glance
  1. Workflow: WF - Geld Verstehen Creator (PLtR80ic3N4rAGaR), node "Telegram - Render Failed" — fires when a MoneyPrinterTurbo render doesn't finish after several retries
  2. Error: Telegram API 400 Bad Request: can't parse entities: Can't find end of the entity starting at byte offset 83
  3. Cause: the alert text still had an <b>...</b> tag left over from an earlier version of the message, and the node's additionalFields.parseMode was left unset
  4. A sibling node in the same workflow ("Telegram - Queue Exhausted") has the identical latent setup — HTML-looking tags, no explicit parse mode — and simply hasn't hit a message shape that breaks it yet
  5. Fix already live on the failing node by the time this was checked: the tag was removed and parseMode set to "none" explicitly
  6. Verified by reading the node's current live configuration via the n8n API, not by re-triggering a failure
Diagram of the Geld Verstehen Creator watchdog chain with the Telegram alert node highlighted where the entity-parse error occurred

Node diagram reconstructed from the live workflow via the n8n API.

The same Telegram error, a different mistake

This n8n instance already has one article about a Telegram sendMessage node failing with can't parse entities — that one came from a Markdown parse mode choking on a stray character an LLM had generated in a caption. This is the same error class, on an unrelated workflow, from a genuinely different mistake: a message template that still had an HTML <b> tag in it, paired with a node that had never had its parse mode explicitly set.

The node is Telegram - Render Failed inside WF - Geld Verstehen Creator, a watchdog step that fires when a MoneyPrinterTurbo video render doesn't finish after a set number of retries. It's not customer-facing — it's an internal alert to a personal Telegram chat — which is exactly the kind of low-visibility node where a broken alert can sit unnoticed for a while, because the only symptom is that the alert itself never arrives.

What the error actually pointed at

Telegram's Bot API returned 400: can't parse entities: Can't find end of the entity starting at byte offset 83. That error means Telegram tried to interpret the message text as formatted content — HTML or Markdown entities like <b>, *bold*, _italic_ — and found a tag or marker it couldn't close. Byte offset 83 landed inside a <b> that opened a bolded warning line but had no matching close before the message ended awkwardly for Telegram's parser.

The n8n Telegram node's additionalFields.parseMode controls how the outgoing text is interpreted: HTML, Markdown, or none. When it's left unset, the node still sends a default parse mode to the Telegram API rather than sending raw text — so any angle brackets or Markdown-looking characters in the message get interpreted whether or not that was the intent. This node's text was written with an HTML tag for emphasis but without ever setting parseMode to HTML to match — a mismatch between what the text assumed and what the node was configured to do.

Fixed by removing the ambiguity, not by picking the "right" parse mode

The live node configuration, read fresh via the n8n API, shows the fix that's already in place: the <b> tag is gone from the message text entirely, and additionalFields.parseMode is now explicitly set to "none". Rather than fixing the mismatch by setting parseMode to HTML and keeping the tag, the simpler direction was taken — an internal alert message doesn't need bold text badly enough to carry the risk of a future edit reintroducing an unescaped character that breaks parsing again.

That's a meaningfully different fix than the other Telegram article on this site, where the resolution was to set parseMode: "none" on a message whose formatting was accidental (an LLM's stray character), not the point of the message. Here, the formatting was intentional at some point but got orphaned when the text was edited, and the safer call was to drop it.

The sibling node that hasn't broken yet

The same workflow has a second Telegram node, Telegram - Queue Exhausted, that fires when a content topic queue runs dry. Its text still contains an HTML <b> tag, and its parseMode is also unset — the identical latent setup that broke the render-failed alert. It hasn't errored, most likely because its fixed message text happens not to contain any character that trips up whatever default parsing n8n applies when parseMode is left blank. That's not a guarantee it stays safe; it's simply a message that hasn't yet hit the specific shape that causes a parse failure. Left as-is for now, since fixing a node that isn't actually failing wasn't part of this check — worth revisiting if it ever throws the same error.

What confirmed it

There's no way to force this exact historical error on demand without deliberately breaking the node again, so the confirmation here is a direct read of the live node configuration via the n8n API: no <b> tag in the text, parseMode: "none" present in additionalFields. The workflow is confirmed still active: true.

A scheduled n8n workflow that occasionally just... doesn't run, with no error you can find afterward?

I harden n8n workflows against exactly this kind of silent, transient-API skipped cycle.