n8nUpgrade check
dev@localhost
Internal tool

Upgrade check

Runs the test suite against the target n8n release for the node versions in a customer's inventory, and produces the report to share with them.

InventoryTest runReport
Step 2

Start an upgrade check

Inventory
Execution mode
More options
A run takes a few minutes, longer when the n8n images are not cached yet.
Step 1, on the customer side

Collect inventory.csv

The customer runs one read-only query against their n8n database. It returns node types, typeVersions and five option names, never workflow content.

Command
psql "$DATABASE_URL" --csv -f node-inventory.postgres.sql > inventory.csv
  • If the instance sets DB_TABLE_PREFIX, prefix workflow_entity and migrations in the query.
  • On releases older than 1.94, remove the WHERE clause: the isArchived column does not exist yet.
The query, node-inventory.postgres.sql
-- Node inventory for an n8n instance on PostgreSQL.
-- Output: one row per node type, typeVersion and operation, with usage
-- counts, plus the instance's latest database migration on every row.
--
--   psql "$DATABASE_URL" --csv -f node-inventory.postgres.sql > inventory.csv
--
-- Read-only. Besides the node type and typeVersion, only five parameters are
-- read: resource, operation, action, mode and language. They are fixed option names
-- (for example database, insert, runOnceForAllItems, javaScript), never
-- workflow content. The migration name tells which n8n release the database
-- was last upgraded to.
--
-- If the instance sets DB_TABLE_PREFIX, prefix workflow_entity and migrations
-- accordingly. On releases older than 1.94 the isArchived column does not
-- exist; remove the WHERE clause.
SELECT n->>'type'                          AS node_type,
       n->>'typeVersion'                   AS type_version,
       n->'parameters'->>'resource'        AS resource,
       n->'parameters'->>'operation'       AS operation,
       n->'parameters'->>'action'          AS action,
       n->'parameters'->>'mode'            AS mode,
       n->'parameters'->>'language'        AS language,
       COUNT(*)                            AS node_count,
       COUNT(DISTINCT w.id)                AS workflow_count,
       (SELECT name FROM migrations ORDER BY "timestamp" DESC LIMIT 1) AS last_migration
FROM workflow_entity w
CROSS JOIN LATERAL json_array_elements(w.nodes::json) AS n
WHERE NOT w."isArchived"
GROUP BY 1, 2, 3, 4, 5, 6, 7
ORDER BY 8 DESC, 1, 2;

Download the .sql file to send it to the customer.

Recent runs

CustomerTargetBaselineModeStarted bySubmittedStatus
Simone Corso3.0.1—Singledev@localhostOct 28, 2026, 7:06 PMEvery test passed