Skip to main content

The Complete Node & Result Payload

The Complete node is how your workflow tells Circus it finished successfully and hands back what it produced. It belongs at the very end of the success branch, and using it correctly matters more than almost any other node — because misusing it will get your still-running workflow killed.

What it does

Place Complete as the last node of the happy path. It sends a result_payload — an opaque, plugin-specific JSON object the node does not validate — to the platform's /complete endpoint. The platform hands that payload to the plugin's result handler, lets the plugin persist whatever it stores, and advances the workspace to its next status.

Two things worth internalising:

  • Completing marks the execution completed on the platform, but it does not stop your n8n workflow — the workflow simply ends gracefully after the node returns.
  • The result_payload is where all your outputs go. Structure it however your plugin expects, for example:
{
"outputs": [
{ "output_type": "text", "content": "Generated script content..." },
{ "output_type": "media", "content": "https://storage.example.com/video.mp4" }
]
}

Call it once, and ship everything together

This is the rule that trips people up. Complete is called only once, at the end. The moment you call it, the platform considers the execution finished — and if your workflow is still running, the background reconciler will notice the mismatch and stop the execution on n8n.

The practical consequence: every artifact a workflow produces must be sent together, in the single result_payload — never one at a time as they're generated. If you complete after your first output and keep working, the platform has already closed the run out from under you. Gather everything, then complete once.

Don't stack it with Terminate

Because Complete ends the happy path, you never pair it with a Terminate node:

  • Terminate is for error branches only — the last node on a failure path.
  • Never place a Terminate after a Complete. The run is already finished; a trailing Terminate is at best redundant and at worst harmful.

If the /complete call itself fails, lean on n8n's built-in Retry On Fail for a transient hiccup; the node reports the error and, where a retry isn't coming, terminates so the execution doesn't hang in running forever. But on the normal success path the shape is simple: one Complete node, all artifacts, done.