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.
The customer runs one read-only query against their n8n database. It returns node types, typeVersions and five option names, never workflow content.
Commandpsql "$DATABASE_URL" --csv -f node-inventory.postgres.sql > inventory.csv
-- 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.
| Customer | Target | Baseline | Mode | Started by | Submitted | Status |
|---|---|---|---|---|---|---|
| Simone Corso | 3.0.1 | — | Single | dev@localhost | Oct 28, 2026, 7:06 PM | Every test passed |