The shape of a sync
1
Trigger
A schedule. Every 30 seconds for stock levels, nightly for a price list — whatever matches how fast your source actually changes.
2
Read the source
A Google Sheets action, an HTTP step against an API, or any other connector.
3
Shape the rows
A Transform step to map the source’s fields onto your declared column names.
4
Apply
A Custom Data → Replace Table action.
Passing a dynamic number of rows
On the Replace Table action, the Rows field has two modes. Items takes rows you type in — fine for a fixed handful. For a sync you want One expression, which takes a single expression evaluating to the whole array:Replace, not Add
Use Replace Table for a mirror. It’s the only operation that propagates deletion: if a product vanishes from your source, it vanishes here, because absence is the signal. Write Rows (add-or-update) never deletes, so a mirror built on it accumulates rows your source dropped months ago. Rows are tombstoned rather than erased, so the next successful run restores everything — but until then your agents can’t see them. If your source can return partial data, put a Condition step before the apply that fails the run when the row count looks wrong for your data. The platform can’t tell a legitimate shrink from a broken read; you can.Running often is cheap
A refresh where nothing changed writes nothing at all. Rows are compared to what’s stored, and identical ones are skipped entirely — no timestamps move, no storage churns. That has a useful consequence: the “last changed” time on your table means when the data actually changed, not when the sync last ran. A table showing no change for three days with a healthy workflow means your source has been stable, not that something is broken. You can therefore poll far more often than you’d expect. Every 30 seconds against a small source is unremarkable.Watching it
The workflow’s own run history tells you whether the sync ran. The table tells you whether the data changed. They’re different questions and you want both:- Workflow keeps failing → your source or credentials are broken
- Workflow succeeds,
written: 0every time → the source is stable, or you’re reading a stale cache - Guard refusals → your source is returning partial data

