n8n-io/n8n · warning · WorkflowActivationError
Workflow ${formatWorkflow(dbWorkflow)} has no node to start
Error message
Workflow ${formatWorkflow(dbWorkflow)} has no node to start the workflow - at least one active trigger, poll trigger, webhook trigger, or schedule trigger node is required What it means
Before activating a workflow, ActiveWorkflowManager runs validateWorkflowHasTriggerLikeNode against the workflow's nodes to ensure at least one node can start an execution (a trigger, poll trigger, webhook trigger, or schedule trigger). If no such starting node is present, the workflow would never run on its own, so activation is refused with a WorkflowActivationError at 'warning' level. Manual/exec-once execution is unaffected.
Source
Thrown at packages/cli/src/active-workflow-manager.ts:604
workflow = new Workflow({
id: dbWorkflow.id,
name: dbWorkflow.name,
nodes,
connections,
active: true,
nodeTypes: this.nodeTypes,
staticData: dbWorkflow.staticData,
settings: dbWorkflow.settings,
});
const validation = validateWorkflowHasTriggerLikeNode(
workflow.nodes,
this.nodeTypes,
STARTING_NODES,
);
if (!validation.isValid) {
throw new WorkflowActivationError(
`Workflow ${formatWorkflow(dbWorkflow)} has no node to start the workflow - at least one active trigger, poll trigger, webhook trigger, or schedule trigger node is required`,
{ level: 'warning' },
);
}
const additionalData = await WorkflowExecuteAdditionalData.getBase({
workflowId: workflow.id,
workflowSettings: dbWorkflow.settings,
});
let triggerCount = 0;
await workflow.expression.acquireIsolate();
try {
if (shouldAddWebhooks) {
added.webhooks = await this.addWebhooks(
workflow,
additionalData,
'trigger',View on GitHub (pinned to 5ac6606e81)
Solutions
- Add at least one trigger node (Schedule Trigger, Webhook, Polling Trigger, etc.) to the workflow before activating.
- Ensure the trigger node is enabled (not disabled) and its type is recognized as a trigger by n8n.
- If you only want manual execution, do not activate the workflow — run it via the Execute button or API instead.
Example fix
// before: no trigger
workflow.add(node({ type: 'Set' })).to(node({ type: 'Http' }));
// activation throws
// after
workflow.add(trigger({ type: 'Schedule Trigger' })).to(node({ type: 'Set' })); Defensive patterns
Strategy: validation
Validate before calling
import { validateWorkflowHasTriggerLikeNode, STARTING_NODES } from 'n8n-workflow';
const result = validateWorkflowHasTriggerLikeNode(workflow.nodes, nodeTypes, STARTING_NODES);
if (!result.isValid) {
throw new Error('Add a trigger node (Schedule/Webhook/Poll) before activating');
} Type guard
function hasTriggerNode(nodes: { type: string; disabled?: boolean }[]): boolean {
return nodes.some(n => isTriggerNodeType(n.type) && !n.disabled);
} Try / catch
try {
await activeWorkflowManager.add(workflowId, 'activate');
} catch (e) {
if (e instanceof WorkflowActivationError && /no node to start/.test(e.message)) {
// prompt user to add a trigger
return { status: 400, message: 'Add a trigger node before activating' };
}
throw e;
} Prevention
- Add at least one trigger node before activating a workflow.
- Keep the trigger node enabled; a disabled trigger does not count.
- Use manual execution (Execute button / API) if you do not want automatic triggering.
When it happens
Trigger: Activating a workflow whose only nodes are regular processing nodes (Set, HTTP Request, etc.) with no trigger; a workflow whose trigger node is disabled; a workflow built from a template that omitted the trigger; a workflow where the trigger node type is not in the STARTING_NODES set.
Common situations: Building a workflow and forgetting to add a trigger; disabling the only trigger then activating; importing a workflow that lost its trigger node; custom node types not registered as triggers.
Related errors
- Workflow "${workflowId}" not found.
- invalid_graph
- Seed declares two workflows named "${duplicate}". The harnes
- Failed to find workflow with ID "${workflowId}"
- File does not seem to contain valid workflows.
AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12).
Data as JSON: /api/errors/fb7e5ce06ea0254d.
Report an issue: GitHub.