packages/cli/BREAKING-CHANGES.md
This list shows all the versions which include breaking changes and how to upgrade.
The npm command is no longer available in the n8nio/runners image. Only pnpm is available for package management.
If you are extending the n8nio/runners image and using npm to install dependencies. Replace any npm install commands with pnpm install in your Dockerfile or scripts.
The way to add third-party dependencies to the n8nio/runners image has changed. More details here.
If you are adding third-party dependencies to the n8nio/runners image using package.json and extras.txt and building the image yourself, please extend the image as instructed in the link above.
Support for bare repositories in Git Node was dropped in the cloud version of n8n due to security reasons. Also, an environment variable N8N_GIT_NODE_DISABLE_BARE_REPOS was added that allows self-hosted users to disable bare repositories as well.
If you have workflows that use the Git Node and work with bare git repositories.
Webhook HTML responses were sandboxed to an iframe starting from 1.103.1 due to security. The sandboxing mechanism is now changed to use Content-Security-Policy header instead of an iframe. The security guarantees stay the same, but the mechanism is less breaking.
If you have workflows that return HTML responses from Webhook Trigger node or Respond to Webhook node.
The CLI flag --reinstallMissingPackages, deprecated a year ago in version 1.154.0, has been removed.
If you are using this flag, please switch to the environment variable N8N_REINSTALL_MISSING_PACKAGES.
We will no longer be allowing users to use responseData within the Webhook node since this is now sandboxed in an iframe, which may break workflows relying on browser APIs like localStorage and fetch from within custom code.
If your workflow is using the Webhook node and uses JavaScript in responseData to make fetch calls or access localStorage, you may need to refactor it due to the new iframe sandboxing.
The N8N_RUNNERS_ALLOW_PROTOTYPE_MUTATION flag has been replaced with N8N_RUNNERS_INSECURE_MODE. The new flag
disables all task runner security measures and is intended as an escape hatch for users who value compatibility
with libraries like puppeteer at the cost of security.
If you are using the N8N_RUNNERS_ALLOW_PROTOTYPE_MUTATION flag, or if you find that the task runner does not
currently support an external module that you rely on, then consider setting N8N_RUNNERS_INSECURE_MODE=true,
at your own risk.
The last_activity metric included as a part of route metrics has been changed to output a Unix time in seconds from
the previous timestamp label approach. The labeling approach could result in high cardinality within Prometheus and
thus result in poorer performance.
Stricter parameters for iframe, video, and source tags when using the Form node.
If you've been ingesting route metrics from your n8n instance (version 1.81.0 and newer), you should analyze
how the last_activity metric has affected your Prometheus instance and potentially clean up the old data. Future
metrics will also be served in a different format, which needs to be taken into account.
If you are using iframe, video, or source tags with attributes beyond those listed here or are using schemes which are neither http or https, you will need to update your node or workflow.
The minimum Node.js version required for n8n is now v20.
If you're using n8n via npm or PM2 or if you're contributing to n8n.
Update the Node.js version to v20 or above.
The Form nodes no longer allows input field types for custom HTML to prevent malicious javascript from being added.
If you were previously using input in the custom HTML for a Form node.
The Form nodes no longer allows input field types for custom HTML to prevent malicious javascript from being added.
If you were previously using input in the custom HTML for a Form node.
The Form nodes no longer allows input field types for custom HTML to prevent malicious javascript from being added.
If you were previously using input in the custom HTML for a Form node.
Queue polling via the env var QUEUE_RECOVERY_INTERVAL has been removed.
If you have set the env var QUEUE_RECOVERY_INTERVAL, so you can remove it as it no longer has any effect.
/healthz used to report healthy status based on database and Redis checks. It now reports healthy status regardless of database and Redis status, and the database and Redis checks are part of /healthz/readiness.QUEUE_HEALTH_CHECK_PORT./healthz/readiness instead of /healthz.The verbose log level was merged into the debug log level.
If you are setting the env var N8N_LOG_LEVEL=verbose, please update your log level to N8N_LOG_LEVEL=debug.
The N8N_BLOCK_FILE_ACCESS_TO_N8N_FILES environment variable now also blocks access to n8n's static cache directory at ~/.cache/n8n/public.
If you are writing to or reading from a file at n8n's static cache directory via a node, e.g. Read/Write Files from Disk, please update your node to use a different path.
Prometheus metrics enabled via N8N_METRICS_INCLUDE_DEFAULT_METRICS and N8N_METRICS_INCLUDE_API_ENDPOINTS were fixed to include the default n8n_ prefix.
If you are using Prometheus metrics from these categories and are using a non-empty prefix, please update those metrics to match their new prefixed names.
Calling $(...).last() (or $(...).first() or $(...).all() respectively) without arguments is returning the the last item (or first or all items) of the output that connects the two nodes. Before it was returning the item/items of the first output of that node.
If you are using $(...).last() (or $(...).first() or $(...)all() respectively) without arguments for nodes that have multiple outputs (e.g. If, Switch, Compare Datasets, etc.) and you want it to default to the first output. In that case change it to $(...).last(0) (or first or all respectively).
This does not affect the Array functions [].last(), [].first().
The default value for the DB_POSTGRESDB_USER environment variable was switched from root to postgres.
If your Postgres connection is relying on the old default value root for the DB_POSTGRESDB_USER environment variable, you must now explicitly set DB_POSTGRESDB_USER to root in your environment.
The --file flag for the execute CLI command has been removed.
If you have scripts relying on the --file flag for the execute CLI command, update them to first import the workflow and then execute it using the --id flag.
n8n auth cookie has Secure flag set by default now.
If you are running n8n without HTTPS on a domain other than localhost, you need to either setup HTTPS, or you can disable the secure flag by setting the env variable N8N_SECURE_COOKIE to false.
The execution mode own was removed.
If EXECUTIONS_PROCESS is set to main or if executions.process in a config file is set to main n8n will print a warning, but start up normally.
If EXECUTIONS_PROCESS is set to own or if executions.process in a config file is set to own n8n will print an error message and refuse to start up.
If you use own mode and need the isolation and performance gains, please consider using queue mode instead, otherwise switch to main mode by removing the environment variable or config field.
If you have the environment variable EXECUTIONS_PROCESS or the config field executions.process set, please remove them. The environment variable has no effect anymore and the configuration field will be removed in future releases, prevent n8n from starting if it is still set.
If the N8N_ENCRYPTION_KEY environment variable on a main instance does not match the encryptionKey in the config file, the main instance will not initialize. If the N8N_ENCRYPTION_KEY environment variable is missing on a worker, the worker will not initialize.
If passing an N8N_ENCRYPTION_KEY environment variable to the main instance, make sure it matches the encryptionKey in the config file. If you are using workers, pass the N8N_ENCRYPTION_KEY environment variable to them.
The flag N8N_CACHE_ENABLED was removed. The cache is now always enabled.
Additionally, expressions in credentials now follow the paired item, so if you have multiple input items, n8n will try to pair the matching row to fill in the credential details.
In the Monday.com Node, due to API changes, the data structure of entries in column_values array has changed
If you are using the flag N8N_CACHE_ENABLED, remove it from your settings.
In regards to credentials, if you use expression in credentials, you might want to revisit them. Previously, n8n would stick to the first item only, but now it will try to match the proper paired item.
If you are using the Monday.com node and refering to column_values property, check in table below if you are using any of the affected properties of its entries.
| Resource | Operation | Previous | New |
|---|---|---|---|
| Board | Get | owner | owners |
| Board | Get All | owner | owners |
| Board Item | Get | title | column.title |
| Board Item | Get All | title | column.title |
| Board Item | Get By Column Value | title | column.title |
| Board Item | Get | additional_info | column.settings_str |
| Board Item | Get All | additional_info | column.settings_str |
| Board Item | Get By Column Value | additional_info | column.settings_str |
*column.settings_str is not a complete equivalent additional_info
Hash algorithm ripemd160 is dropped from .hash() expressions.
sha3 hash algorithm now returns a valid sha3-512 has, unlike the previous implementation that returned a Keccak hash instead.
If you are using .hash helpers in expressions with hash algorithm ripemd160, you need to switch to one of the other supported algorithms.
Until now, in main mode, n8n used to deregister webhooks at shutdown and reregister them at startup. Queue mode and the flag N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN skipped webhook deregistration.
As from now, in both main and queue modes, n8n no longer deregisters webhooks at startup and shutdown, and the flag N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN is removed. n8n assumes that third-party services will retry unhandled webhook requests.
If using the flag N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN, note that it no longer has effect and can be removed from your settings.
In nodes, this.helpers.getBinaryStream() is now async.
If your node uses this.helpers.getBinaryStream(), add await when calling it.
Example:
const binaryStream = this.helpers.getBinaryStream(id); // until 1.9.0
const binaryStream = await this.helpers.getBinaryStream(id); // since 1.9.0
The env vars N8N_BINARY_DATA_TTL and EXECUTIONS_DATA_PRUNE_TIMEOUT no longer have any effect and can be safely removed. Instead of relying on a TTL system for binary data, n8n currently cleans up binary data together with executions during pruning.
If using these flags, remove them from your settings and be mindful of the new behavior.
The env var N8N_PERSISTED_BINARY_DATA_TTL no longer has any effect and can be removed. This legacy flag was originally introduced to support ephemeral executions (see details), which are no longer supported.
If using this flag, remove it from your settings.
In the Code node, console.log does not output to stdout by default.
If you were relying on console.log for non-manual executions of a Code node, you need to set the env variable CODE_ENABLE_STDOUT to true to send Code node logs to process's stdout.
For the Linear node, priority in issue creation is 4 (previously incorrectly 3) for Low.
If you were using Low, you were setting a priority of Normal, so please double check you are setting the priority you intend.
The minimum Node.js version required for n8n is now v18.
If you're using n8n via npm or PM2 or if you're contributing to n8n.
Update the Node.js version to v18 or above.
This release introduces two irreversible changes:
It will not be possible to read a [email protected] database with older versions of n8n, so we recommend that you take a full backup before migrating.
Due to Node.js/OpenSSL upgrade, the following crypto algorithms are not supported anymore.
If you're using any of the above mentioned crypto algorithms in Crypto node in any of your workflows, then please update the algorithm property in the node to one of the supported values.
The LoneScale List node has been renamed to LoneScale.
If you have used the LoneScale List node in any of your workflows.
Update any workflows using LoneScale List to use the updated node.
The extractDomain and isDomain are now also matching localhost, domains without protocol and domains with query parameters.
The extractUrl and isUrl are additionally also matching localhost and domains with query parameters.
If you're using the extractDomain or isDomain functions and expect them to not match localhost, domains without protocol and domains with query parameters.
The minimum Node.js version required for n8n is now v16.
If you're using n8n via npm or PM2 or if you're contributing to n8n.
Update the Node.js version to v16 or above.
Invalid Luxon datetimes no longer resolve to null. Now they throw the error invalid DateTime.
If you are relying on the above behavior, review your workflow to ensure you handle invalid Luxon datetimes.
Switched from NPM to PNPM for development.
If you are contributing to n8n.
Make sure that your local development setup is up to date with the latest Contribution Guide.
The Merge node list of operations was rearranged.
If you are using the overhauled Merge node and 'Merge By Fields', 'Merge By Position' or 'Multiplex' operation.
Go to the workflows that use the Merge node, select 'Combine' operation and then choose an option from 'Combination Mode' that matches an operation that was previously used. If you want to continue even on error, you can set "Continue on Fail" to true.
The GraphQL node now errors when the response includes an error.
If you are using the GraphQL node.
Go to the workflows that use the GraphQL node and adjust them to the new behavior. If you want to continue even on error, you can set "Continue on Fail" to true.
The Hive node now correctly rejects invalid SSL certificates when the "Ignore SSL Issues" option is set to False.
If you are using a self signed certificate with The Hive.
Go to the credentials for The Hive, Enable the "Ignore SSL Issues" option.
For the HubSpot Trigger node, the authentication process has changed to OAuth2.
If you are using the Hubspot Trigger.
Create an app in HubSpot, use the Client ID, Client Secret, App ID, and the Developer Key, and complete the OAuth2 flow.
The in-node core methods for credentials and binary data have changed.
If you are using custom n8n nodes.
this.getCredentials(myNodeCredentials) is now async. So await has to be added in front of it.Example:
// Before 0.135.0:
const credentials = this.getCredentials(credentialTypeName);
// From 0.135.0:
const credentials = await this.getCredentials(myNodeCredentials);
await this.helpers.getBinaryDataBuffer(itemIndex, binaryPropertyName) has to be used.Example:
const items = this.getInputData();
for (const i = 0; i < items.length; i++) {
const item = items[i].binary as IBinaryKeyData;
const binaryPropertyName = this.getNodeParameter('binaryPropertyName', i);
const binaryData = item[binaryPropertyName] as IBinaryData;
// Before 0.135.0:
const binaryDataBuffer = Buffer.from(binaryData.data, BINARY_ENCODING);
// From 0.135.0:
const binaryDataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName);
}
For the Pipedrive regular node, the deal:create operation now requires an organization ID or person ID, in line with upcoming changes to the Pipedrive API.
If you are using the deal:create operation in the Pipedrive regular node, set an organization ID or a person ID.
For the Taiga regular and trigger nodes, the server and cloud credentials types are now unified into a single credentials type and the version param has been removed. Also, the issue:create operation now automatically loads the tags as multiOptions.
If you are using the Taiga nodes, reconnect the credentials. If you are using tags in the issue:create operation, reselect them.
For the Zoho node, the lead:create operation now requires a "Company" parameter, the parameter "Address" is now inside "Additional Options", and the parameters "Title" and "Is Duplicate Record" were removed. Also, the lead:delete operation now returns only the id of the deleted lead.
If you are using lead:create with "Company" or "Address", reset the parameters; for the other two parameters, no action needed. If you are using the response from lead:delete, reselect the id key.
The minimum Node.js version required for n8n is now v14.
If you're using n8n via npm or PM2 or if you're contributing to n8n.
Update the Node.js version to v14 or above.
In the Postgres, CrateDB, QuestDB and TimescaleDB nodes the Execute Query operation returns the result from all queries executed instead of just one of the results.
If you use any of the above mentioned nodes with the Execute Query operation and the result is relevant to you, you are encouraged to revisit your logic. The node output may now contain more information than before. This change was made so that the behavior is more consistent across n8n where input with multiple rows should yield results acccording all input data instead of only one. Please note: n8n was already running multiple queries based on input. Only the output was changed.
Removed the "Activation Trigger" node. This node was replaced by two other nodes.
The "Activation Trigger" node was added on version 0.113.0 but was not fully compliant to UX, so we decided to refactor and change it ASAP so it affects the least possible users.
The new nodes are "n8n Trigger" and "Workflow Trigger". Behavior-wise, the nodes do the same, we just split the functionality to make it more intuitive to users.
If you use the "Activation Trigger" in any of your workflows, please replace it by the new nodes.
Remove the previous node and add the new ones according to your workflows.
Changed the behavior for nodes that use Postgres Wire Protocol: Postgres, QuestDB, CrateDB and TimescaleDB.
All nodes have been standardized and now follow the same patterns. Behavior will be the same for most cases, but new added functionality can now be explored.
You can now also inform how you would like n8n to execute queries. Default mode is Multiple queries which translates to previous behavior, but you can now run them Independently or Transaction. Also, Continue on Fail now plays a major role for the new modes.
The node output for insert operations now rely on the new parameter Return fields, just like update operations did previously.
If you rely on the output returned by insert operations for any of the mentioned nodes, we recommend you review your workflows.
By default, all insert operations will have Return fields: * as the default, setting, returning all information inserted.
Previously, the node would return all information it received, without taking into account what actually happened in the database.
In the Dropbox node, both credential types (Access Token & OAuth2) have a new parameter called "APP Access Type".
If you are using a Dropbox APP with permission type, "App Folder".
Open your Dropbox node's credentials and set the "APP Access Type" parameter to "App Folder".
In the Dropbox node, now all operations are performed relative to the user's root directory.
If you are using any resource/operation with OAuth2 authentication.
If you are using the folder:list operation with the parameter Folder Path empty (root path) and have a Team Space in your Dropbox account.
Open the Dropbox node, go to the OAuth2 credential you are using and reconnect it again.
Also, if you are using the folder:list operation, make sure your logic is taking into account the team folders in the response.
In the Hubspot Trigger, now multiple events can be provided and the field App ID was so moved to the credentials.
If you are using the Hubspot Trigger node.
Open the Hubspot Trigger and set the events again. Also open the credentials Hubspot Developer API and set your APP ID.
Support for MongoDB as a database for n8n has been dropped as MongoDB had problems saving large amounts of data in a document, among other issues.
If you have been using MongoDB as a database for n8n. Please note that this is not related to the MongoDB node.
Before upgrading, you can export all your credentials and workflows using the CLI.
n8n export:workflow --backup --output=backups/latest/
n8n export:credentials --backup --output=backups/latest/
You can then change the database to one of the supported databases mentioned here. Finally, you can upgrade n8n and import all your credentials and workflows back into n8n.
n8n import:workflow --separate --input=backups/latest/
n8n import:credentials --separate --input=backups/latest/
As User property and the User Name field got combined and renamed to Send as User. It also got moved under “Add Options”.Ephemeral property got removed. To send an ephemeral message, you have to select the "Post (Ephemeral)" operation.If you are using the following fields or properties in the Slack node:
Open the Slack node and set them again to the appropriate values.
If you have a question in Typeform that uses a previously answered question as part of its text, the question text would look like this in the Typeform Trigger node:
You have chosen {{field:23234242}} as your answer. Is this correct?
Those curly braces broke the expression editor. The change makes it now display like this:
You have chosen [field:23234242] as your answer. Is this correct?
If you are using the Typeform Trigger node with questions using the Recall information feature.
In workflows using the Typeform Trigger node, nodes that reference such key names (questions that use a previously answered question as part of its text) will need to be updated.
In the Harvest Node, we moved the account field from the credentials to the node parameters. This will allow you to work witn multiples accounts without having to create multiples credentials.
If you are using the Harvest Node.
Open the node set the parameter Account ID.
In the Segment Node, we have changed how the properties 'traits' and 'properties' are defined. Now, key/value pairs can be provided, allowing you to send customs traits/properties.
When the properties 'traits' or 'properties' are set, and one of the following resources/operations is used:
| Resource | Operation |
|---|---|
| Identify | Create |
| Track | Event |
| Track | Page |
| Group | Add |
Open the affected resource/operation and set the parameters 'traits' or 'properties' again.
Change in naming of the Authentication field for the Pipedrive Trigger node.
If you had set "Basic Auth" for the "Authentication" field in the node.
The "Authentication" field has been renamed to "Incoming Authentication". Please set the parameter “Incoming Authentication” to “Basic Auth” to activate it again.
Node.js version 12.9 or newer is required to run n8n.
If you are running Node.js version older than 12.9.
You can find download and install the latest version of Node.js from here.
The link.fish node got removed because the service is shutting down.
If you are are actively using the link.fish node.
Unfortunately, that's not possible. We'd recommend you to look for an alternative service.
In the Active Campaign Node, we have changed how the getAll operation works with various resources for the sake of consistency. To achieve this, a new parameter called 'Simple' has been added.
When one of the following resources/operations is used:
| Resource | Operation |
|---|---|
| Deal | Get All |
| Connector | Get All |
| E-commerce Order | Get All |
| E-commerce Customer | Get All |
| E-commerce Order Products | Get All |
Open the affected resource/operation and set the parameter Simple to false.
We have renamed the operations in the Todoist Node for consistency with the codebase. We also deleted the close_match and delete_match operations as these can be accomplished using the following operations: getAll, close, and delete.
When one of the following operations is used:
After upgrading, open all workflows which contain the Todoist Node. Set the corresponding operation, and then save the workflow.
If the operations close_match or delete_match are used, recreate them using the operations: getAll, delete, and close.
We have simplified how attachments are handled by the Twitter node. Rather than clicking on Add Attachments and having to specify the Catergory, you can now add attachments by just clicking on Add Field and selecting Attachments. There's no longer an option to specify the type of attachment you are adding.
If you have used the Attachments option in your Twitter nodes.
You'll need to re-create the attachments for the Twitter node.
To make it easier to use the data which the Slack-Node outputs we no longer return the whole
object the Slack-API returns if the only other property is "ok": true. In this case it returns
now directly the data under "channel".
When you currently use the Slack-Node with Operations Channel -> Create and you use any of the data the node outputs.
All values that get referenced which were before under the property "channel" are now on the main level. This means that these expressions have to get adjusted.
Meaning if the expression used before was:
{{ $node["Slack"].data["channel"]["id"] }}
it has to get changed to:
{{ $node["Slack"].data["id"] }}
The names of the following nodes were not set correctly and got fixed:
If any of the nodes mentioned above, are used in any of your workflows.
For the nodes mentioned above, you'll need to give them access to the credentials again by opening the credentials and moving them from "No Access" to "Access". After you've done that, there are two ways to upgrade the workflows and to make them work in the new version:
Simple
Advanced
After upgrading, select the whole workflow in the editor, copy it, and paste it into a text editor. In the JSON, change the node types manually by replacing the values for "type" as follows:
Then delete all existing nodes, and then paste the changed JSON directly into n8n. It should then recreate all the nodes and connections again, this time with working nodes.
The function "evaluateExpression(...)" got renamed to "$evaluateExpression()" in Function and FunctionItem Nodes to simplify code and to normalize function names.
If "evaluateExpression(...)" gets used in any Function or FunctionItem Node.
Simply replace the "evaluateExpression(...)" with "$evaluateExpression(...)".
To make sure that all nodes work similarly, to allow to easily use the value from other parts of the workflow and to be able to construct the source-date manually in an expression, the node had to be changed. Instead of getting the source-date directly from the flow the value has now to be manually set via an expression.
If you currently use "Date & Time"-Nodes.
Open the "Date & Time"-Nodes and reference the date that should be converted via an expression. Also, set the "Property Name" to the name of the property the converted date should be set on.
To make it possible to support also Rocketchat on-premise the credentials had to be changed.
The subdomain parameter had to get renamed to domain.
When you currently use the Rocketchat-Node.
Open the Rocketchat credentials and fill the parameter domain. If you had previously the
subdomain "example" set you have to set now "https://example.rocket.chat".
The node "Read File From Url" got removed as its functionality got added to "HTTP Request" node where it belongs.
If the "Read File From Url" node gets used in any workflow.
After upgrading open all workflows which contain a "Read File From Url" node. They will have a "?" as icon as they are not known anymore. Create a new "HTTP Request" node to replace the old one and add the same URL as the previous node had (in case you do not know it anymore you can select the old node, copy it and paste it in a text-editor, it will display all the data the node contained). Then set the "Response Format" to "File". Everything will then function again like before.
When "HTTP Request" property "Response Format" was set to "String" it did save the data by default in the property "response". In the new version that can now be configured. The default value got also changed from "response" to "data" to match other nodes with similar functionality.
When "HTTP Request" nodes get used which have "Response Format" set to "String".
After upgrading open all workflows which contain the concerning Nodes and set "Binary Property" to "response".
Because of a typo very often reponse instead of response got used in code. So also on the Webhook-Node. Its parameter reponseMode had to be renamed to correct spelling responseMode.
When Webhook-Nodes get used which have "Response Mode" set to "Last Node".
After upgrading open all workflows which contain the concerning Webhook-Nodes and set "Response Mode" again manually to "Last Node".
Because the CLI library n8n used was not maintained anymore and included packages with security vulnerabilities we had to switch to a different one.
When you currently start n8n in your setup directly via its JavaScript file. For example like this:
/usr/local/bin/node ./dist/index.js start
Change the path to its new location:
/usr/local/bin/node bin/n8n start