Drive Snowflake from events, not cron tasks.

Snowflake runs the SQL. Kestra decides when it runs, what feeds it, and what runs next. Load stages on file arrival, run idempotent MERGE upserts as transactions, chain with dbt and ingestion, and trace every statement in one execution history.

Blueprints for Snowflake orchestration.

Snowflake Tasks and Streams cover scheduling inside the warehouse. Kestra covers everything around it: it loads files to a stage and runs COPY the moment they land, chains Snowflake with Airbyte ingestion and dbt transforms in one flow, and runs incremental MERGE upserts as transactions so a partial load never lands. A transient dbt retry never re-runs the load, and every query is tagged back to the run that issued it.

Load files to a stage, COPY to a table, run SQL Open blueprint
Start a flow when a Snowflake query returns rows Open blueprint
Incremental MERGE upsert with a transactional load Open blueprint

Above the Snowflake task scheduler.

Snowflake runs the SQL, the warehouse, and the stage. Kestra runs the steps around the query: what triggers it, what feeds it, who approves it, and where the cross-tool audit trail lives.

Event-driven queries, not warehouse cron

Snowflake Tasks fire on a cron schedule. If the upstream load slips, the task runs on stale data. Kestra triggers io.kestra.plugin.jdbc.snowflake.Query the moment the upstream step confirms, whether that is an Airbyte sync, a file landing in S3, or a webhook. The Trigger task can also poll Snowflake and start a flow when a query returns rows.

Stage loading orchestrated end to end

Loading data means PUT a file to a stage, then COPY INTO a table, then validate. Kestra runs Upload to push a file from internal storage to a Snowflake stage, then Query to run the COPY, then a row-count check, as ordered steps with per-step retries. A failed COPY retries without re-uploading the file.

Full ELT in one flow

Snowflake has no view of the connector that fed it or the dbt models that read it. Kestra runs ingestion, the Snowflake load, the transform, and the Hightouch activation as steps in one flow. Run IDs and the Snowflake query ID flow forward, and the whole chain shares one execution ID.

Transactional multi-statement loads

An incremental load is rarely one statement: stage the file, MERGE into the target, dedup, update a watermark. io.kestra.plugin.jdbc.snowflake.Queries runs them as one transaction (enabled by default), so a failure rolls back and a partial load never lands. The next run picks up cleanly from the last committed watermark.

Cost-aware warehouse control

Idle warehouses burn credits. Kestra can resume a warehouse with a query, run the workload, and suspend it again in the same flow, so compute is only on for the job. Query tags set per run tie Snowflake's query history and credit usage back to the exact Kestra execution that issued each statement.

Self-service queries for analysts

Analysts should not need warehouse access to run a parameterized export. Kestra Apps wraps a Query flow in a typed form: pick the date range, run the query, get the result file. Every run lands in execution history with the requesting user, so self-service does not mean unaudited.

How teams use Snowflake and Kestra

Patterns data platform teams run in production today. Each one shows the flow end to end, with the real plugin classes in play.

Full ELT

Ingest to Snowflake to dbt in one flow

Airbyte syncs raw data into Snowflake, Kestra waits for it, then runs the Snowflake load and triggers dbt against the warehouse. Slack confirms. A dbt retry never re-runs the Airbyte sync.

Step retries stay local

A dbt retry never re-runs Airbyte; a load retry never re-runs ingestion.

Query ID flows forward

The Snowflake query ID lands in outputs for downstream traceability.

One execution ID across the stack

Debug ingestion, load, and transform from one screen, not three.

airbyte sync
ingest
snowflake load
COPY INTO
dbt build
transform
slack
on complete
Stage load

Load files to a stage on arrival

A file lands in object storage. Kestra uploads it to a Snowflake stage with Upload, runs Query for the COPY INTO, then checks the loaded row count. A failed COPY retries without re-uploading the file.

Stage then COPY, ordered

Upload pushes the file; Query runs the COPY only after it lands.

Validate before downstream

An If task branches on the loaded row count before anything reads the table.

Retry the COPY in isolation

A COPY failure retries without re-staging the file.

file trigger
S3 arrival
snowflake upload
PUT to stage
snowflake query
COPY INTO
row check
validate
Event-driven

Start a flow when a Snowflake query returns rows

Some pipelines react to data, not clocks. The Snowflake Trigger polls the warehouse on an interval and starts a flow when a sentinel query returns rows, then marks them processed with afterSQL so the same rows do not fire twice.

Poll-based data trigger

Fires on rows returned, not on the next cron tick.

afterSQL marks processed

Sentinel rows are flagged so they do not re-trigger.

Fan out per row

A ForEach processes each returned row independently.

snowflake trigger
query returns rows
process
downstream work
notify
Slack on done
Incremental

Incremental MERGE upsert with dedup

The daily pattern: COPY new rows into a staging table, then MERGE into the target with dedup and a watermark update, all as one transaction with Queries. A failed MERGE rolls back, so the target never holds a half-applied batch.

One transaction, all or nothing

Queries wraps the MERGE and watermark update; a failure rolls back.

Idempotent reruns

The watermark means a rerun resumes from the last committed batch.

Dedup in the MERGE

Late or duplicate rows collapse on the merge key, not downstream.

stage load
COPY new rows
merge
upsert + dedup
row check
validate
notify
on complete
Operations

Resume, run, suspend for cost control

Kestra resumes a warehouse, runs the batch, and suspends it again in one flow, so compute is only billed for the job. A query tag set per run ties Snowflake credit usage back to the exact execution, and a scheduled flow can report daily spend to Slack.

Compute on only for the job

Resume and suspend bracket the workload in the same flow.

Query tags per run

Snowflake credit usage ties back to the issuing execution.

Multi-statement batches

Queries runs several statements in one transactional task.

schedule
nightly batch
resume wh
ALTER WAREHOUSE
run batch
the workload
suspend wh
ALTER WAREHOUSE

Kestra vs the orchestration alternatives Snowflake teams evaluate

Capability
Snowflake Tasks
Astronomer
Dagster
Trigger Snowflake on upstream completion
Native event triggers
Cron or stream-based onlySensor-based pollingSensors, Python required
Stage upload plus COPY in one flow
Upload + Query tasks
SQL only, no file stagingOperator chainOps, Python required
Transactional multi-statement load
Queries in one transaction
Stored proceduresOperator chainOps, Python required
Trigger a flow on query results
Snowflake Trigger task
Streams + Tasks, in-warehouseCustom sensorCustom sensor
Chain with Airbyte, dbt, Hightouch
Native plugins
Snowflake-onlyOperator-dependentAsset-based, Python
Self-service queries for analysts
Kestra Apps
NoNo native form layerNo native form layer
Declarative YAML, IaC-friendly
YAML + Terraform provider
SQL DDLPython DAGsPython assets

Snowflake & Kestra: common questions

Find answers to your questions right here, and don't hesitate to Contact Us if you couldn't find what you're looking for.

See How

Ready to orchestrate your Snowflake pipelines?

Trigger on upstream events, load stages, run idempotent MERGE upserts, and chain with Airbyte and dbt in one flow. Open source, self-hosted, event-driven.