New to Kestra?
Use blueprints to kickstart your first workflows.
Trigger on new Google Cloud Storage objects, load each file into a raw BigQuery table with schema autodetect, archive it, and confirm in Slack.
Turn a Google Cloud Storage bucket into an event source that feeds BigQuery automatically. The moment new files land in a landing prefix, this flow loads each one into a raw BigQuery table, moves the processed object to an archive prefix so it can never re-trigger, and confirms the batch in Slack. It removes the gap between data arriving in object storage and data being queryable in your warehouse, with no manual loads, no cron guesswork, and no duplicate ingestion.
io.kestra.plugin.gcp.gcs.Trigger polls gs://{bucket}/landing/ every PT1M and fires on CREATE events, exposing the new objects as trigger.blobs. Its action: MOVE relocates each processed object to gs://{bucket}/archive/ so the same file is never detected twice.load_new_files task (io.kestra.plugin.core.flow.ForEach) iterates over trigger.blobs.io.kestra.plugin.gcp.bigquery.Load appends the file to analytics.landed_files using format: CSV, autodetect: true, createDisposition: CREATE_IF_NEEDED, and writeDisposition: WRITE_APPEND, so the table is created on first run and grown on every subsequent run.notify task (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts how many files were loaded.alert_on_failure error handler posts to Slack if any load fails.MOVE, so reprocessing and duplicates are avoided.CREATE_IF_NEEDED.GCS object notifications and BigQuery scheduled queries can each move data, but neither gives you a single declarative pipeline that reacts to file arrival, fans out per object, loads, archives, alerts, and retries as one auditable unit. Kestra adds the event Trigger, ForEach fan-out, automatic retries, full execution lineage over every blob, and version-controlled YAML, filling the gap that a bucket watcher or a warehouse scheduler alone cannot cover.
A GCS bucket with a landing/ prefix and a BigQuery analytics dataset. The destination table analytics.landed_files is created on the first load.
GCP_PROJECT_ID: GCP project hosting the bucket and dataset.GCP_SERVICE_ACCOUNT: service account key JSON with GCS read/write and BigQuery job access.GCS_BUCKET: bucket holding the landing and archive prefixes.SLACK_WEBHOOK_URL: Slack incoming webhook URL.from and moveDirectory at your bucket prefixes.format (CSV, JSON, AVRO, PARQUET) and destinationTable to match your files.disabled: false on the on_new_object trigger and drop a file into the landing prefix.action: MOVE to DELETE to remove processed files, or NONE with a stateKey to leave them in place.interval for fresher detection, or set maxFiles to cap objects per run.