# Activation errors

> Every message activation can refuse with, what it means, and the exact fix — searchable by the text Hodoflow showed you.

Activation checks the saved version in a fixed order and stops at the first
problem, naming it. Fix that one, press **Activate** again, and the next
problem — if there is one — appears.

Search this page for the exact words you saw.

## Nothing is wrong yet, but the button is greyed out

The **Activate** button gates on what your browser can see before the server is
asked. Hover it for the reason.

| Tooltip | Fix |
|---|---|
| *Save the workflow before activating* | The workflow has never been saved. Press **Save**. |
| *Save changes before activating* | Activation runs against what is stored. Press **Save**. |
| *Fix invalid nodes before activating* | One or more steps are incomplete. The count is in the toolbar; hover it for their names. |
| *Add at least one trigger before activating* | Add a trigger, or save the workflow as a subflow. |
| *Add at least one step before activating* | A trigger alone is not a workflow. |
| *Connect every step to the flow. Some have no incoming path* | A step shows **No parent step**. Draw an arrow into it or delete it. |
| *Some steps refer to a step that no longer reaches them* | A name was left behind by a rename or a deleted arrow. The step names it on its card. |
| *Some steps read a field off a step that returns a list of records* | See [A step reads a field off a list](#a-step-reads-a-field-off-a-list) below. |
| *Re-sample stale sources before activating* | A source changed since it was last sampled. Use **Re-sample** in the banner. |

## Data schema is stale

> Data schema is stale. Resample sources and refresh mappings before activating
> this workflow.

A step's configuration changed after its output was last sampled, so the fields
your mappings rely on may no longer be the fields it produces.

**Fix:** a banner on the canvas lists each drifted source with its own
**Re-sample** button. Press it, check the mappings that used those fields, then
save. See [Configure and test a
step](/help/workflows/configure-and-test-steps).

## A workflow must have at least one trigger

> A workflow must have at least one trigger (or be saved as a subflow).

Nothing would ever start this workflow.

**Fix:** add a trigger from the wizard — select the canvas background and use
the trigger wizard, or create the workflow again choosing a trigger. If the
workflow is meant to be called by another workflow instead, make it a subflow:
subflows are exempt from this check. See [Choose a
trigger](/help/workflows/choose-a-trigger).

## A workflow must have at least one step

> A workflow must have at least one step before it can be activated.

There is a trigger and nothing for it to run.

**Fix:** add a step from the palette. See [Add and connect
steps](/help/workflows/add-and-connect-steps).

## A step is not fully configured

> The "Fetch rate" step is not fully configured: URL is required.

The named step is missing something its type requires. The text after the colon
is the specific reason:

| Reason | Fix |
|---|---|
| `URL is required` | The HTTP Request step has no URL. |
| `HTTP method is required` | Pick `GET`, `POST`, `PUT`, `PATCH`, or `DELETE`. |
| `at least one branch is required` | A Conditional step has no branches. |
| `every branch needs a condition and a label` | One of its branches is missing its condition or its name. |
| `delay must be at least 1 second` | A Delay step is set to zero. |
| `filter condition is required` | A Filter List step has no condition. |
| `add at least one field mapping` | A Data Transform step has no mapped output field. Open it, press **Edit mappings**, and connect at least one field. |
| `pick a subflow workflow` | A Subflow step has no target workflow selected. |
| `per-item iteration needs an items_from path` | **Run once per item** is on but no list was chosen under **For each item in**. |
| `iteration mode must be "whole" or "per_item"` | The step's iteration mode was set to something unrecognised. Re-pick it in the **Iteration** section. |
| `item_concurrency must be a whole number between 1 and 25` | Fix the concurrency value under **Iteration → Advanced**. |
| `item_delay_ms must be a whole number between 0 and 60000` | Fix the per-item delay. The ceiling is 60 seconds. |
| `max_items must be a whole number of at least 1` | Fix or clear the **Max items** ceiling. |

## A step has no data mappings configured

> The "Save order" step has no data mappings configured.

A **Map to Data Model** step has a data model but no fields mapped onto it.

**Fix:** select the step, press the **Map to** button, and map at least the
required fields. See [Persist workflow
data](/help/data-dashboards/persisting-data).

## The data model has no primary key field

> The "Save order" step's data model has no primary key field. Add one before
> activating.

Records need something to group them by, and the target data model has no field
marked as its primary key.

**Fix:** open **Warehouse**, pick the data model, and mark one `string` or
`integer` field as **Primary Key**. A model can have only one, and the
designation cannot be changed once the model holds data — so on a model with
records, create a new model instead. See [Define a data
model](/help/data-dashboards/data-models).

## A step is missing its primary key field

> The "Save order" step is missing primary key field: order_id.

The data model's primary key exists but nothing maps to it.

**Fix:** open the mapping panel and map that field. It is the one row with a
**PK** badge.

## The steps must be connected to the trigger

> The workflow's steps must be connected to its trigger.

There is a trigger, and no step is wired to it, so a firing trigger would have
nothing to run.

**Fix:** draw an arrow from the trigger node to your first step.

## The workflow has a circular dependency

> The workflow has a circular dependency (Fetch → Enrich → Fetch). Steps can't
> wait on each other in a loop.

The named steps wait on each other, so none of them could ever start.

**Fix:** the message lists the cycle in order. Delete one arrow in that loop.
The canvas also blocks drawing a cycle: while you drag a connection, every step
that would create one outlines in red.

## Every step must connect to the trigger or another step

> Every step must connect to the trigger or another step. Disconnected: Notify
> ops.

The named steps are unreachable. Nothing leads to them, so they could never
run.

**Fix:** draw an arrow into each named step, or delete it. On the canvas these
show **No parent step** and count toward the toolbar's **invalid nodes**.

Disconnected legacy error handler definitions stay idle until connected. New
fault paths are ordinary canvas steps and must be connected to their source.

## A step reads a field off a list

> The "Append row" step refers to discord_read_channel_messages.content, but
> discord_read_channel_messages returns a list of records — run this step once
> per item, or reference the whole list as
> discord_read_channel_messages.data.

The step above hands down **a list of records**, not one, so `content` is a
field of each record rather than of the step. Written flat it resolves to
nothing, every run, and the run still reports success — which is why this is
refused up front rather than left to be discovered later.

**Fix:** decide which of the two you meant.

- **One record at a time** — open the step, set **Mode** to *Run once per
  item*, choose the list under **For each item in**, and change the reference
  to `item.content`. The step then runs once for every record. On the canvas it
  gains a **per item** badge.
- **The whole list** — reference `discord_read_channel_messages.data`, which is
  the list itself. Useful for a count, or for sending the lot in one request.

A step that hands down a list carries a **list** badge on the canvas, so which
producers this applies to is visible without opening anything. See [Use fields
from an earlier step](/help/workflows/map-upstream-fields).

A step whose output has never been tested or bound is not checked at all, so
this cannot refuse a workflow over something nobody has established.

## Deprecated compensation connections

> Remove or convert the deprecated compensation connections before running this workflow.

An existing draft still contains a legacy **Compensate** connection. These
connections did not implement rollback, and cannot run as error handlers
without an explicit change.

**Fix:** review each connection and convert it to **On error** or remove it.
Choose **Fail workflow** after the cleanup step when the run must remain failed.
See [On error paths](/help/workflows/error-and-compensation).

## A fault path has a missing source

An **On error** connection names a source step that no longer exists.

**Fix:** reconnect to an existing source or remove the missing connection.
Shared recovery steps, mixed normal and fault inputs, and rejoins into the main
flow are all supported as long as the graph has no cycles.

## A step uses error context outside a fault path

> Error context is only available along an On error path.

No **On error** path can reach the named step, so it cannot receive a failure
context.

**Fix:** connect the step to a fault path or use ordinary upstream step outputs.
At a join reached by either a normal or fault path, error context is optional.

## A step runs a subflow that is not active

> The "Refund" step runs the "Issue refund" subflow, which is not active.
> Activate it first.

A workflow runs the *active* version of the subflow it points at, so a subflow
nobody has activated has nothing for the step to run.

**Fix:** open the subflow and activate it, then activate this workflow. Once it
is active it stays available: a subflow an active workflow runs cannot be
deactivated, and no version of it can be deleted while anything points at it.
Publishing a new version of a subflow and activating that swaps it into every
workflow that runs it — no step has to be repointed.

## A step runs a subflow that no longer exists

> The "Refund" step runs a subflow that no longer exists. Pick another one.

The step points at a workflow that has since been deleted.

**Fix:** select the step and pick a subflow from the list. Only active subflows
appear there.

## Active workflows limit reached

> Active workflows limit reached (3 of 3 in use). Contact support@hodoflow.com
> to raise your plan's limits.

Activation would exceed your plan's cap on simultaneously active workflows.
Nothing is wrong with the workflow itself.

**Fix:** deactivate a workflow you are no longer using, or contact support to
raise the limit. Current usage is on **Settings → Organization**.

## Could not change activation state

The fallback message, shown when the refusal carried no more specific text.
Reload the builder and try once more; if it repeats, the workflow may have been
changed by someone else in the meantime.

## Related

- [Save, version, and activate](/help/workflows/save-version-activate)
- [Recover a failed run](/help/run-troubleshoot/recover-a-failed-run) for
  failures after activation, which are a different thing entirely.
