Write the SQL once.
Keep your team’s tools in sync.
Join, filter and summarise your database or SaaS data with SQL. Query Streams runs the saved query on your schedule and syncs the results to Smartsheet, Airtable, Google Sheets, SeaTable, Baserow or Anvil. Your numbers stay current. Your team keeps working where it already does.
On every plan, including Free. All six destinations. As often as every 5 minutes.

The same sheet.
The next set of changes.
Scroll to follow one Full Sync run. The balance, rows and team notes make it clear what the sync changes and what it keeps.
Smartsheet
See the saved SQL
SELECT i.invoice, c.name AS customer,
i.amount, i.status
FROM ar.invoices i
JOIN ar.customers c
ON c.id = i.customer_id
WHERE i.status <> 'Paid'
ORDER BY i.dueFollow the changes at your own pace, or run the sample.
Open invoices
| InvoiceKey · SYNC | AmountSYNC | StatusSYNC | Team notesPRESERVE |
|---|---|---|---|
| INV- | 1,140.00 | Overdue | Alex following up |
| INV- | 17,320.80 | Overdue | Call on Friday |
| INV- | 12,480.00 | Open | Waiting for PO |
| INV-20481 removedIts note leaves with the row. | |||
| INV- | 5,493.95 | Open | Add a note |
Three invoices before the next run. Team notes are already in place.
Sample data. The shaded notes column belongs to your team. The rotating logos show supported source coverage.
Your team already has an open-invoice list. Balances and invoice status came from the query. Follow-up notes were entered by people.
The invoice key identifies each row. SYNC and PRESERVE decide which columns can change.
Open invoices
| InvoiceKey · SYNC | AmountSYNC | StatusSYNC | Team notesPRESERVE |
|---|---|---|---|
| INV- | 1,140.00 | Overdue | Alex following up |
| INV- | 17,320.80 | Overdue | Call on Friday |
| INV- | 12,480.00 | Open | Waiting for PO |
| INV-20481 removedIts note leaves with the row. | |||
| INV- | 5,493.95 | Open | Add a note |
Three invoices before the next run. Team notes are already in place.
A part payment reduces INV-20478 from 1,140.00 to 940.00. Full Sync updates its mapped amount without replacing Alex’s follow-up note.
Watch the amount cell. The note beside it stays in the same place.
Open invoices
| InvoiceKey · SYNC | AmountSYNC | StatusSYNC | Team notesPRESERVE |
|---|---|---|---|
| INV- | 940.00 | Overdue | Alex following up |
| INV- | 17,320.80 | Overdue | Call on Friday |
| INV- | 12,480.00 | Open | Waiting for PO |
| INV-20481 removedIts note leaves with the row. | |||
| INV- | 5,493.95 | Open | Add a note |
INV-20478 updated to 940.00. “Alex following up” stays intact.
INV-20481 is now paid, so the saved query no longer returns it. Full Sync removes that destination row to keep this an open-invoice list.
Removing a row also removes its notes. PRESERVE protects values on retained rows; it does not keep deleted rows.
Open invoices
| InvoiceKey · SYNC | AmountSYNC | StatusSYNC | Team notesPRESERVE |
|---|---|---|---|
| INV- | 940.00 | Overdue | Alex following up |
| INV- | 17,320.80 | Overdue | Call on Friday |
| INV- | 12,480.00 | Open | Waiting for PO |
| INV-20481 removedIts note leaves with the row. | |||
| INV- | 5,493.95 | Open | Add a note |
INV-20481 removed because it is paid. Its row and note leave together.
INV-20472 now matches the query. It arrives with its amount and status, ready for someone to add a follow-up note. Existing notes remain on the retained invoices.
One added, one updated, one removed. The team keeps working in the same destination.
Open invoices
| InvoiceKey · SYNC | AmountSYNC | StatusSYNC | Team notesPRESERVE |
|---|---|---|---|
| INV- | 940.00 | Overdue | Alex following up |
| INV- | 17,320.80 | Overdue | Call on Friday |
| INV- | 12,480.00 | Open | Waiting for PO |
| INV-20481 removedIts note leaves with the row. | |||
| INV- | 5,493.95 | Open | Add a note |
1 invoice added, 1 updated, 1 removed. Notes on retained rows stay intact.
Full Sync can remove whole rows. If a row leaves your query result, its manual notes leave too. Use Append when you need a growing history without changing existing rows.
Keep the numbers current.
Keep your team’s work.
Choose what happens to rows, then choose which columns the sync can change. The database can own the balance while your team owns the follow-up note.

Append: build a history
Add new rows at the bottom. Existing rows are left as they are, even if the source changes later.
For logs, transaction histories and records you want to retain.

Full Sync: keep a current view
Match records by a key. Add new rows, update changed values and remove rows no longer returned by the query.
For open invoices, stock levels and active project lists.
Values the source owns
Keep mapped balances, quantities and dates aligned with your query results.
Values your team owns
Keep manual notes, assigned owners and follow-up status when a row is updated. Full Sync can still remove the entire row if it leaves the result.
Send the answer your team needs.
A destination does not need a copy of every source table. Use SQL to turn the data into a useful working list or summary before the sync writes it.
- Join related recordsPut the customer name beside the invoice, or the product beside its stock count.
- Filter and calculateUse WHERE, GROUP BY, HAVING, SUM, COUNT and AVG to deliver the rows and totals that matter.
- Use databases and SaaS sourcesQuery supported databases or service tables through the API Connector. Source settings determine whether a query reads a synced copy or refreshes supported API data before SQL runs.

Six places the results can land.
Connect your account, pick the sheet, base or table, and send your query results straight into it. Google Sheets uses Google sign-in; other destinations use their supported credentials, such as an API token.
Project plans and task lists that stay in step with your database.
A flexible base your team can sort, group and build views on.
A shared sheet everyone can open, with current numbers in it.
A base you can host yourself, kept current the same way.
An open-source base, synced like the others.
A data table behind a Python web app, fed on a schedule.
One setup. A schedule that keeps working.

1. Save the query
Build and test the result in the Query Builder. The Network Agent runs the source query inside your network.
Open the Query Builder guide
2. Choose where it lands
Connect a destination account and select the target sheet, base or table. Map your columns, choose Append or Full Sync, and mark the values to preserve.

3. Set the timetable
Choose a preset interval, as often as every 5 minutes, or a custom cron schedule. For example, 7 a.m. on weekdays:
0 7 * * 1-5The agent connects outbound, with no inbound port or VPN. Source queries are read-only; Automation writes the result into the destination you authorised.
Anywhere the team works in a sheet, but the truth lives in a database.
- Project management. Milestones, tasks and who is assigned, into Smartsheet.
- Sales reporting. Pipeline and revenue numbers into one sheet the sales team trusts.
- Inventory tracking. Stock levels and warehouse counts on a tight interval.
- Finance dashboards. Budget, expense and forecast figures into the sheets leadership reads.
- HR operations. The employee directory mirrored into the team sheets people actually open.
- Marketing analytics. Campaign metrics from your database or Google Analytics into Airtable.
On every plan, including Free.
Scheduled syncs are not a paid extra. Every plan can connect all six destinations; what changes between plans is how many rows one sync can carry. Free supports queries returning up to 125 rows, enough for a summary, a top list or a status board. A query over your plan’s row limit is blocked rather than silently cut short. Paid plans raise that limit.
Need a message when something changes?
Automation keeps a destination table current. Reports send a scheduled update; Data Alerts tell you when a query result meets a condition.
Explore Reports and Data AlertsQuestions people ask.
How often can a sync run?
As often as every 5 minutes. Pick a preset interval, or write a cron expression for an exact timetable. Once set, it runs on its own.
What is the difference between Append and Full sync?
Append adds new rows and leaves existing rows untouched. Full Sync matches rows by a key: it adds new records, updates mapped SYNC values and removes rows no longer returned by the query. PRESERVE values on retained rows are not overwritten. Removing a row also removes any manual notes on that row.
What are SYNC and PRESERVE columns?
SYNC columns follow your query results, for example balances and stock counts. PRESERVE columns keep values your team enters in the destination, such as notes, owners and follow-up status, when existing rows are updated. This protects the values on retained rows; it does not stop Full Sync removing a row that no longer matches the query.
Can it sync data from an online service, not just a database?
Yes. Services like Stripe, HubSpot or Shopify come in through the API Connector, which turns their data into tables you query with SQL. A query on those tables syncs to any of the six destinations exactly like a database query.
Do I need to write code or set up a data pipeline?
Build and save a SQL query in the browser with the Query Builder, connect a destination, map your columns and set a schedule. Google Sheets uses Google sign-in; other destinations use their supported credentials, such as an API token. There is no separate sync script to maintain. For scheduled messages or threshold notifications, use Reports and Data Alerts.
Write the query once. Let the schedule do the rest.
Scheduled syncs are on every plan, including Free. See what each plan carries per sync.

