Portal Community

When to Use

Configuration

No configuration required. The Continue node has zero settings. Place it inside a Loop node's body branch, typically connected from the true or false port of an IfCondition node that identifies items to skip.

How It Works

When a Continue node executes, it calls Memory.SignalContinue(), which writes a continue signal into ExecutionMemory. The enclosing Loop node monitors for this signal and responds by:

  1. Discarding any remaining body nodes for the current iteration (they do not execute).
  2. Clearing the continue signal from ExecutionMemory.
  3. Incrementing the current index.
  4. Firing the body port again for the next item (or firing done if no more items remain).

Variables set before Continue fired in the current iteration are preserved — they are not rolled back.

Output Ports

PortNotes
noneContinue has no output port. Execution continues at the Loop node, which fires its body port for the next item, or its done port if the array is exhausted. Do not connect any node directly from Continue.

Validation

Must be inside a Loop body: If Continue is executed outside of a loop context, the engine raises ERR_CONTINUE_OUTSIDE_LOOP. This is a runtime error, not a configuration warning. Always verify Continue is within a Loop body subgraph before publishing a workflow.

Break vs Continue — Quick Reference

ScenarioUseEffect
Exit the loop entirelyBreakLoop stops; done port fires; remaining items skipped.
Skip the current item onlyContinueCurrent iteration's remaining body skipped; loop advances to next item normally.

Node Policies and GuardRails

Pattern Examples

Pattern 1 — Skip Null / Invalid Items

An array from an external API may contain null entries or items missing a required field. Skip those silently and process only valid items.

Loop  [key: "processItems"]
  Items: {{ $output.fetchRecords.items }}
  ├─► body ──► IfCondition  [key: "validateItem"]
  │             Condition: {{ $var.current_item !== null &&
  │                           $var.current_item.email !== null }}
  │             ├─► false ──► Continue  (skip null or invalid items)
  │             └─► true  ──► EmailSmtp
  │                             To: {{ $var.current_item.email }}
  └─► done ──► SlackNode  (batch complete)

Pattern 2 — Idempotent Processing (Skip Already-Handled Records)

A scheduled sync loop uses a set of processed record IDs stored in a variable. Items already in the set are skipped via Continue, making the loop safe to re-run after a partial failure.

VariableAssignment (processedIds = [])
  └─► Loop  [key: "syncRecords"]
        Items: {{ $output.fetchAll.records }}
        ├─► body ──► IfCondition  [key: "alreadyDone"]
        │             Condition: {{ $var.processedIds.includes($var.current_item.id) }}
        │             ├─► true  ──► Continue   (already processed — skip)
        │             └─► false ──► HttpRequest  (POST /sync/record)
        │                             └─► VariableAssignment
        │                                   processedIds = $var.processedIds
        │                                                  .concat([$var.current_item.id])
        └─► done ──► [finalize sync]

Pattern 3 — Resilient Batch (Log Error, Continue to Next)

Call an enrichment API for each item. If the API returns an error for one item, log it and continue to the next — process as many items as possible rather than aborting the whole batch.

Loop  [key: "enrichRecords"]
  Items: {{ $json.records }}
  ├─► body ──► HttpRequest  [key: "callEnrich"]
  │             GET /enrich/{{ $var.current_item.id }}
  │             ├─► success ──► VariableAssignment
  │             │               (store enriched result, accumulate)
  │             └─► error   ──► VariableAssignment
  │                             (append error to failedItems list)
  │                               └─► Continue  (skip to next record)
  └─► done ──► IfCondition
                 Condition: {{ $var.failedItems.length > 0 }}
                 ├─► true  ──► SlackNode  (alert: N items failed enrichment)
                 └─► false ──► [all records enriched successfully]

Sample Output

Success Port

Continue produces no data output. It signals the loop engine to skip the remainder of the current iteration and advance to the next item. The loop resumes with the next item's data.

{
  "_control": "continue",
  "_iterationIndex": 3,
  "_skippedItem": { "id": "item_004", "status": "duplicate" },
  "_reason": "Item already processed — skipping"
}

Expression Reference

ExpressionDescription
{{ $output.loopNode._control }}"continue" — confirms iteration was skipped.
{{ $output.loopNode._iterationIndex }}The loop iteration index that was skipped.
{{ $output.loopNode._skippedItem }}The item data that was skipped during this iteration.