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.
- 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
- 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.
- 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
1. Tables and Lists (6 Actions)
| Action | Key | What it does |
|---|---|---|
| Add a row | data-store/add-row | Insert or replace a row (empty Text keys get a UUID); returns { key, row, created }. |
| Add to collection | data-store/add-to-collection | Append item to a Collect and send list; returns { key, item }. |
| Find rows | data-store/find-rows | Return up to 1,000 matching rows (oldest first) as { results, resultCount }. |
| Get all rows | data-store/get-all-rows | Return up to 1,000 live rows (oldest first) as { results, resultCount }. |
| Update fields of a row | data-store/update-row-fields | Atomically update filled columns on key; returns { updated, key, row }. |
| Delete a row | data-store/delete-row | Delete the row matching key; returns { deleted, key, row }. |
- Over 1,000 rows.
Get all rowsandFind rowsreturn up to1,000rows (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,000rows) or paste up to 1,000 rows. - Collect and send. Enable Collect and send on a List to release batches (
1to1,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
| Resource | Limit |
|---|---|
| Store name / Record key | Store name: 1 to 200 chars · Record key: 1 to 1,024 chars |
| Maximum value size | 1 MB (1,048,576 bytes) of JSON per record |
| Workspace live capacity | 100,000 non-expired rows and records across all Data Stores |
| Table columns / CSV import | Up to 100 typed columns · CSV import up to 20 MB (100,000 rows) · Paste 1,000 |
| Maximum records / rows read | 1,000 per call (Find rows, Get all rows, Get all records, List records, Get difference) |
Time to live (ttl) range | 1 to 31,536,000 seconds (up to 1 year); 0 or empty keeps records |
Examples to copy
Deduplicate webhooks
- 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). - Add Conditions at Step 3 to continue only when
{{ 2.existingKeyFound }}isfalse.
- 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?
- Reshape records in a single run with Change Fields or Custom Variables.
- Store API keys and static config in Secrets and Variables.