Concatenate Text
The tiny node that glues your whole workflow together
- STRING
Concatenate Text (StringConcatenate) is the most boring node you'll use all week, and that's exactly why it ends up in half your workflows. It takes two strings, puts a delimiter between them, and hands back one string. That's it. But "glue two strings together" is the single most common operation in prompt automation, and ComfyUI core finally has a clean node for it instead of you doing it by hand.
Reach for it whenever you're assembling a prompt out of parts instead of typing one. Classic pattern: a base subject prompt, plus a style phrase you swap out per run, plus a quality suffix - each generated or edited independently, all joined before they hit the CLIP Text Encode. Or a dynamic filename prefix built from a date string and a folder name. Or an LLM's output plus a fixed instruction ("now upscale this"). Anything where "the text is A, then B" is the whole job.
How it works
There's no cleverness here - mechanically it's a Python join with your delimiter: delimiter.join((string_a, string_b)). That means the delimiter goes between the two strings, not after the last one, and an empty delimiter just smushes them together. Worth internalizing the behavior, because it's the source of most confusion with the node: the delimiter is exactly what you'd type between the parts - ", " for comma-separated tags, " " for prose, "\n" for a line break.
The one structural limit: it takes exactly two strings. StringConcatenate is a binary node. To join three parts you chain two of these (part A+B, then result+C), or - the better answer for more than two - use the sibling Format Text (StringFormat), which is Python's str.format and handles any number of slots in one node. For simple two-part joins, this node is the one to reach for.
The inputs that matter
- string_a / string_b - the two pieces. Both are multiline, which is convenient and also a footgun: a multiline box can quietly carry a trailing newline, and you'll wonder where the line break came from.
- delimiter - single-line, defaults to empty. Set it to
", "," ","\n", or anything else you need between the parts.
Output is one STRING, ready to feed a positive prompt, a Save Text node, a filename prefix, or the next string node down the chain. That's the whole interface.
Common issues
The classic beginner moment: you connect two prompts, run, and the result is "catdog" because you left the delimiter empty. Decide on it explicitly. Second most common: forgetting the whitespace - "cat,", "dog" gives you "cat,,dog" or "cat, dog" depending on where you put it. Third: people try to wire three things into a two-slot node and get confused; remember to chain or switch to StringFormat.
Also note the naming collision you'll hit while searching: core ships several text-join-adjacent nodes, and the older dataset-family ones (Add Text Prefix, Add Text Suffix, Merge Text Lists) are all marked DEPRECATED - this node, plus StringFormat, is the replacement the core team wants you on. If a downloaded workflow drags in an old node with "(DEPRECATED)" in its name, swapping in Concatenate Text is usually a one-for-one fix.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| string_a | STRING | — | |
| string_b | STRING | — | |
| delimiter | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |