Make GCS the trigger, not just the bucket.

GCS holds the objects. Kestra decides what happens when they land: load new files into BigQuery on arrival, run partition-aware refreshes, curate raw drops with Python, and archive processed files, all with retries and one execution history.

Blueprints for GCS orchestration.

Cloud Scheduler and GCS notifications give you the event, but not the pipeline. Kestra makes the bucket a trigger and chains the rest: it loads new objects into BigQuery the moment they land, curates raw drops with Python and DuckDB, refreshes only the partitions that changed, and archives processed files so they never re-fire, with retries and lineage that wiring Cloud Functions and Pub/Sub by hand cannot match.

Load GCS files into BigQuery on arrivalOpen blueprint
Refresh only the BigQuery partitions that changedOpen blueprint
Curate GCS files into BigQuery with PythonOpen blueprint
Browse all 33 GCS blueprints

Above the bucket and Cloud Scheduler.

GCS runs the storage, the durability, and the object events. Kestra runs the steps around the object: what fires on arrival, what loads it, what cleans it, and where the cross-tool audit trail lives.

Event-driven on object arrival

Stitching GCS notifications to Pub/Sub to a Cloud Function is a lot of moving parts for what should be one step. io.kestra.plugin.gcp.gcs.Trigger polls a prefix, fires when new objects match, and downloads them, so a file landing starts a full pipeline. Set action: MOVE or DELETE so processed files never re-trigger.

Load to BigQuery end to end

Loading means detect the file, load it, validate, and archive. Kestra runs io.kestra.plugin.gcp.bigquery.LoadFromGcs straight from a gs:// path, or bigquery.Load from internal storage, then a row check, then an archive move, as ordered steps with per-step retries. A failed load retries without re-detecting the file.

Partition-aware incremental refresh

Reloading a whole table to absorb a day of late data is slow and expensive. Kestra loops a rolling window with ForEach and loads each day's GCS files into the matching BigQuery partition with WRITE_TRUNCATE, so cost tracks the delta and a rerun safely replaces just its own partitions.

Curate raw drops into clean tables

Raw files rarely match the target schema. Kestra downloads an object, transforms it in a Python or DuckDB container (normalize columns, dedup, reshape), then loads the curated result into BigQuery. Business logic stays in code, orchestration stays in YAML, and the messy raw stays out of the warehouse.

One flow across the lakehouse

GCS has no view of the warehouse load or the dbt models downstream. Kestra runs the object trigger, the BigQuery load, the dbt transform, and the notification as steps in one flow. Run IDs flow forward and the whole chain shares one execution ID, so you debug ingestion and transform from one screen.

Compose, stage, and govern objects

Object work is more than upload. Kestra runs List, Compose (concatenate parts into one object), Copy, and Delete as tasks, so daily partner exports get assembled and staged on a schedule. Every run lands in execution history with the user and timestamp, so object operations are audited, not ad hoc.

How teams use GCS 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.

Event-driven

Load a file the moment it lands, then archive it

A file drops into a landing prefix. The GCS Trigger fires, Kestra loads it into BigQuery, and the trigger moves the object to an archive prefix so it never fires twice. Slack confirms the batch with the file count.

Polling trigger with archive

action: MOVE archives each processed object so it never re-triggers.

Raw-first loading

Autodetect lands the file as-is; parse and model it downstream.

Retry the load alone

A failed load retries without re-detecting the object.

Trigger icon
gcs trigger
new object
Load icon
bigquery load
load file
Copy icon
archive
move object
SlackIncomingWebhook icon
slack
file count
Incremental

Refresh only the partitions that changed

Late data arrives for the last few days. Kestra loops a rolling window with ForEach and loads each day's GCS files into the matching BigQuery partition with WRITE_TRUNCATE, so each partition is atomically replaced and cost tracks the delta, not the whole table.

Cost tracks the delta

Each load is scoped to one day's files, so it never rescans history.

Reruns are safe

WRITE_TRUNCATE on a partition decorator replaces exactly one partition.

Tune the window

Widen or narrow the day window to trade freshness for cost.

Schedule icon
schedule
daily
ForEach icon
for each day
rolling window
LoadFromGcs icon
load partition
WRITE_TRUNCATE
TelegramSend icon
telegram
on complete
Curate

Clean raw GCS files into a warehouse table

Raw drops need normalizing before they are useful. Kestra downloads the file, transforms it with Python and pandas in a container, then loads the curated result into BigQuery with WRITE_TRUNCATE. Discord confirms, and the messy raw never reaches the warehouse.

Logic in code, flow in YAML

The transform runs in a pinned container; orchestration stays declarative.

Swap the engine

Use Polars or DuckDB in place of pandas with no flow change.

Reproducible runs

Each step runs in a container, so the curation is the same anywhere.

Download icon
gcs download
pull raw
Script icon
python
clean + reshape
Load icon
bigquery load
load curated
DiscordIncomingWebhook icon
discord
on complete
Export

Export BigQuery to a GCS data lake

Downstream consumers want files, not warehouse access. Kestra runs a BigQuery query to build the dataset, then ExtractToGcs writes it to a date-partitioned GCS path as CSV, JSON, or Avro, on a schedule, so partners and lakes always have the latest export.

Files, not warehouse grants

Partners read a GCS object instead of getting BigQuery access.

Partitioned by date

Each run writes a dated path so history stays intact.

Pick the format

Export CSV, JSON, or Avro with compression in one task.

Schedule icon
schedule
daily
Query icon
bigquery query
build dataset
ExtractToGcs icon
extract to gcs
partitioned file
TeamsIncomingWebhook icon
teams
on complete
Assemble

Compose daily parts into one delivery object

A day's data lands as many part files. Kestra lists the day's objects, composes them into a single object with Compose, uploads the assembled file with delivery metadata, and emails the recipient, so partner hand-offs are one clean object, not a scatter of parts.

One object, not many parts

Compose concatenates up to 32 objects into a single delivery file.

Delivery metadata

Set content type and cache headers on the staged object.

Audited assembly

Every assembly run lands in execution history with the user and time.

List icon
gcs list
find parts
Compose icon
gcs compose
concatenate
Upload icon
gcs upload
stage final
MailSend icon
email
notify recipient
Kestra is the unifying layer for our data and workflows. You can start small, but then there is no limit to the possibilities and scalability of such an open architecture.
Julien Henrion, Head of Data at Leroy Merlin France
+900%in data production
+5,000flows orchestrated

Kestra vs the orchestration alternatives GCS teams evaluate

Capability
Cloud Composer
Cloud Workflows
Dagster
Fire a pipeline on object arrival
Native GCS Trigger
GCS sensor, Python DAGNeeds Eventarc + FunctionCustom sensor, Python
Load to BigQuery in the same flow
LoadFromGcs task
Operator, PythonConnector callAsset, Python
Partition-aware incremental refresh
ForEach + partition decorators
Python DAG logicVerbose step graphPartitioned assets, Python
Archive or move processed files
Trigger action MOVE/DELETE
Custom operatorExtra stepCustom op
Chain beyond GCP (dbt, Slack, APIs)
Native plugins
Python operatorsHTTP calls onlyPython
Declarative YAML, no Python
Pure YAML
Python DAGsGCP-only YAMLPython
Self-hosted or air-gapped option
Open source, self-hosted
GCP-managed onlyGCP-managed onlyOSS or cloud

GCS & 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 GCS pipelines?

Trigger on object arrival, load to BigQuery, refresh partitions cost-efficiently, and curate raw drops into clean tables in one flow. Open source, self-hosted, event-driven.