Skip to Content
BuildAction StepsData Store

Data Store

Data Store (data-store) persists Tables, Lists, and Key-value records across runs inside your workspace. It requires no external database. Seven built-in triggers start runs when rows or keys change, or when a Collect and send list releases a batch.

At a glanceVerified in app · Oct 29, 2026
Use it to
Persist structured Tables, ordered Lists (with Collect and send digests), and Key-value records across runs
Find it
Dock → Apps → Data Store (or Tools → Data)
Cost
1 Step credit per action · Free for Data Store triggers
Limits
Up to 1,000 rows returned per Find rows / Get all rows call · 100,000 records workspace quota
Output
{{ N.row.col }}, {{ N.results }}, {{ N.existingKeyFound }}, or {{ N.value }} (no ret wrapper)
Instead
Custom Variables (when data is only needed inside a single run)

Use Custom Variables for single-run values. Use Secrets and Variables for static workspace config or credentials. Use Data Store for live runtime data shared across runs and teammates.

Choose a Data Store type

Structured grids & digestsTables and Lists
  • Tables store up to 100 typed columns (Text, Number, Date, Yes/no) with CSV import and live grid editing.
  • Lists collect ordered items and release scheduled or threshold batches via Collect and send.
  • Best for customers, leads, inventory, and daily or hourly digest queues.
Fast lookup & TTL expiryKey-Value Records
  • Stores one JSON value (up to 1 MB) per key (up to 1,024 chars), with optional TTL up to 1 year.
  • Create under More types in Create data store, or auto-create on a Key-value Step's first write.
  • Best for webhook deduplication, sync cursors, and idempotency locks.

Open Data stores in the sidebar to filter by All, Tables, Lists, or Key-value and check your quota (0 / 100,000 rows and records). Each row shows its type badge, name, update time, usage, count, size, and TTL.


Tables, Lists, Key-Value Records, and Triggers

ActionKeyWhat it does
Add a rowdata-store/add-rowInsert or replace a row (empty Text keys get a UUID); returns { key, row, created }.
Add to collectiondata-store/add-to-collectionAppend item to a Collect and send list; returns { key, item }.
Find rowsdata-store/find-rowsReturn up to 1,000 matching rows (oldest first) as { results, resultCount }.
Get all rowsdata-store/get-all-rowsReturn up to 1,000 live rows (oldest first) as { results, resultCount }.
Update fields of a rowdata-store/update-row-fieldsAtomically update filled columns on key; returns { updated, key, row }.
Delete a rowdata-store/delete-rowDelete the row matching key; returns { deleted, key, row }.
  • Over 1,000 rows. Get all rows and Find rows return up to 1,000 rows (oldest first). Filter larger tables by a status column (processed is equal to false) and mark or delete each row after processing.
  • Live collaboration. Teammates appear with colored cell outlines and draft previews. Yes/no cells distinguish Yes, No, and unset states. Import CSVs up to 20 MB (100,000 rows) or paste up to 1,000 rows.
  • Collect and send. Enable Collect and send on a List to release batches (1 to 1,000, oldest first) Every hour, Every day, Every week, at a row threshold, or via Send now.

Setting it up & what it passes on

Pick an operation

Open Apps → Data Store in the dock and select a Table, List, or Key-value action.

Choose or name the store

Select an existing Data store or type a name (1 to 200 chars). Click Open data store to view it.

Map columns or keys

Map row columns or Key / Value inputs. Outputs sit at the root without ret ({{ 2.row.email }}, {{ 2.results }}, {{ 2.existingKeyFound }}, {{ 2.value }}).

Whole-store actions (Find rows, Get all rows, List keys, List records, Get all records, Get difference, Get record keys, Delete all records, Add or update multiple records) run once on the store. They only loop after Run for each item when referencing {{ item }}.

Do not store credentials in a Data Store. Workspace secrets and API keys ({{ $secret.* }} and {{ $key.* }}) fail with SECRET_IN_UNSAFE_SINK. Keep credentials in Secrets and Variables.

Limits

ResourceLimit
Store name / Record keyStore name: 1 to 200 chars · Record key: 1 to 1,024 chars
Maximum value size1 MB (1,048,576 bytes) of JSON per record
Workspace live capacity100,000 non-expired rows and records across all Data Stores
Table columns / CSV importUp to 100 typed columns · CSV import up to 20 MB (100,000 rows) · Paste 1,000
Maximum records / rows read1,000 per call (Find rows, Get all rows, Get all records, List records, Get difference)
Time to live (ttl) range1 to 31,536,000 seconds (up to 1 year); 0 or empty keeps records

Examples to copy

  1. Add Data Store → Check whether a key exists at Step 2 (Data store: processed_webhooks, Key: {{ 1.body.eventId }}). Enable Create a new record if the key is not found (Value: {{ $now }}, Time to live: 604800).
  2. Add Conditions at Step 3 to continue only when {{ 2.existingKeyFound }} is false.
Verify it works
Run
Add Data Store → Add or update a record, enter a store name and key, and click Run step
You should see
The Output tab returns the key and value, and the record appears on the Data stores page.

What’s Next?

Last updated on

Search documentation

Start with a guide, or search by Step, task or error.