Pipedream data stores → n8n Data tables
Updated 2026-10-21 · 4 min read
In n8n, the closest thing to a Pipedream data store is a Data table, read and written with the Data Table node (what most people mean when they search for an n8n data store node). Pipedream data stores are a key-value store shared across workflows; n8n Data tables are small tables with columns, shared within a project. The catch is that Pipedream's export does not include data stores, so the records need their own backup. The backup runs as a Pipedream code step, so do it before workflows stop on March 31, 2027 (the data is deleted by April 30, 2027).
Concepts side by side
| Pipedream data store | n8n Data table | n8n workflow static data | |
|---|---|---|---|
| Model | Key-value | Rows and columns | JSON object per workflow or node |
| Scope | Shared across workflows | Project | One workflow |
| Access | this.dataStore in Node.js, pd.inputs["data_store"] in Python, no-code actions |
Data Table node, API, UI | $getWorkflowStaticData() in JavaScript Code node |
| TTL | Yes, per key | No | No |
| Size | Plan-dependent | 200 MiB per instance by default | "should be small" |
| Saved in test runs | Yes | Yes | No |
Sources: Pipedream data stores, n8n Data tables, n8n static data.
Step 1. Back up the records from Pipedream
There is no export button for data stores. Pipedream's docs include a sample action that posts records in chunks to an external endpoint; by default it deletes the keys it exported, so switch that option off for a copy. For small stores, a read-only code step is enough:
export default defineComponent({
props: { store: { type: "data_store" } },
async run() {
const rows = [];
for await (const [key, value] of this.store) rows.push({ key, value: JSON.stringify(value) });
return rows;
},
});
Select the data store in the prop, run the step once, and copy the result. Pipedream caps step exports and logs at 6 MB, so for larger stores post the rows to your own storage in batches instead.
Step 2. Create the Data table in n8n
- In n8n, open the project and the Data tables tab.
- Create a table, for example
customers_seen, with columnskeyandvalue(both string). - Import the rows: the Data tables tab can create a table from a CSV, or you can insert rows with the Data Table node in a one-off workflow.
If your values are objects with a stable shape, use one column per field instead of a JSON string. Lookups and filters get easier.
Step 3. Replace data store calls
| Pipedream (Node.js) | n8n |
|---|---|
await this.store.get(key) |
Data Table node → Get, filter key = ... |
await this.store.set(key, value) |
Data Table node → Upsert |
await this.store.has(key) |
Data Table node → If Row Exists / If Row Does Not Exist |
await this.store.delete(key) |
Data Table node → Delete |
await this.store.keys() |
Data Table node → Get (no filter) |
set(key, value, { ttl }) |
No TTL: store an expires_at column and filter or delete on a schedule |
The Data Table node's row operations are Delete, Get, If Row Exists, If Row Does Not Exist, Insert, Update and Upsert (node docs).
Because a Code node can't read a Data table directly, a code step that used a data store in the middle of its logic becomes three nodes: Data Table (read) → Code → Data Table (write).
When static data is fine
For a single workflow that keeps a cursor or "last seen ID", workflow static data is simpler:
const state = $getWorkflowStaticData('global');
const lastId = state.lastId ?? 0;
const fresh = $input.all().filter((item) => item.json.id > lastId);
if (fresh.length) state.lastId = Math.max(...fresh.map((item) => item.json.id));
return fresh;
Know the limits n8n documents: it's experimental, JavaScript only, not saved during manual test runs (the workflow has to be published and run by a trigger), saved only when the execution succeeds, and meant for small data.
What our converter does
To keep converted workflows running without manual edits, our converter maps data store calls in JavaScript code steps to workflow static data, and the report recommends a Data table for each store, with the import steps listed in the download. Data stores in Python steps are flagged red, because static data doesn't exist in n8n Python. The free report lists every data store your workflows use.
Next steps
- Back up everything else too: Pipedream data deletion checklist
- Code mapping: code steps to the n8n Code node
- Full guide: migrate Pipedream to n8n
Not affiliated with Pipedream or n8n.
FAQ
- What is the n8n equivalent of a Pipedream data store?
- Data tables: built-in tables you read and write with the Data Table node. For small per-workflow state in JavaScript code, there is also workflow static data.
- Are data store records included in the Pipedream export?
- No. Pipedream's export leaves out data stores. Back them up separately while workflows still run, before March 31, 2027; the data is deleted by April 30, 2027.
- How big can n8n Data tables be?
- By default all data tables in an instance share 200 MiB. Self-hosted instances can change the limit with N8N_DATA_TABLES_MAX_SIZE_BYTES.
- Can I read a Data table from the n8n Code node?
- No. n8n says direct access to data tables from a Code node isn't supported. Use a Data Table node before or after the Code node.
- Should I use $getWorkflowStaticData instead?
- Only for small, single-workflow state. n8n calls static data experimental, doesn't save it in test runs, and recommends data tables instead.
Related
Sources
- https://pipedream.com/docs/workflows/data-management/data-stores
- https://pipedream.com/docs/workflows/building-workflows/code/nodejs/using-data-stores
- https://pipedream.com/docs/workflows/export-workflows
- https://docs.n8n.io/build/work-with-data/data-tables
- https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.datatable
- https://docs.n8n.io/build/code-in-n8n/cookbook/built-in-methods-and-variables-examples/getworkflowstaticdata