n8n 3.0.0 shipped as a beta on 27 October, stable lands in early December, and it is an operational release rather than a feature release. Around three dozen legacy nodes go away, including Function, Function Item, Item Lists, Cron and Interval.
The dangerous sentence is in n8n's own docs: "Workflows that use a removed node fail when they run. If such a workflow is published, it doesn't activate when n8n 3.0 starts, so its triggers stop firing."
No red execution. No retry. No email. The workflow is simply not active, and you find out from a customer.
The mapping
Removed in 3.0 Use instead
-------------------- ----------------------------------------------
Function Code node, Run Once for All Items
Function Item Code node, Run Once for Each Item
Item Lists Split Out, Aggregate, Sort, Limit, Remove Duplicates, Summarize
Cron, Interval Schedule Trigger
HTML Extract current node version
iCalendar current node version
Binary file nodes current node versions
Some migrations are automatic (the AI Transform node becomes a Code node with the same generated JavaScript). Function and Function Item are not. You replace those yourself.
Find them in ten minutes
- Settings, then Migration Report. Exists from 2.39 onwards, and it lists the affected workflows, nodes and settings on your own instance. Save a copy.
- On an older version, upgrade to 2.39 first. The report is worth one small, reversible upgrade.
-
Count the node types yourself. Export workflows through
/api/v1/workflowsor the CLI and search the JSON forn8n-nodes-base.function,functionItem,itemLists,n8n-nodes-base.cron,n8n-nodes-base.interval. - Write the list down with workflow name, node and purpose. That list is your upgrade plan and your rollback argument.
Fix on 2.x, not after
The Function to Code conversion is the only real work, because the execution model changes:
// Function (legacy): input is items, you return an array of items
return items.map(item => ({ json: { ...item.json, seen: true } }));
// Code, Run Once for All Items: read all input, return an array
const items = $input.all();
return items.map(item => ({ json: { ...item.json, seen: true } }));
For Function Item, use Code with Run Once for Each Item: the input is a single item and you return that item's new data.
Test each migrated workflow on 2.x, run it once manually, check the output shape the next node expects, then publish. Then upgrade, with a backup, because 3.0 cannot be rolled back.
The check nobody does after upgrading
Open the workflow list and look at the active toggle on every workflow, not only the ones you migrated. A workflow that lost activation looks identical to a healthy one in a screenshot. The list is the only place the difference shows, and only if you look.
Full guide with the audit steps and sources: voxahq.in. No affiliate links.
Top comments (0)