New to Kestra?
Use blueprints to kickstart your first workflows.
Run SQL analytics on a CSV with DuckDB and Kestra, then post weekly sales metrics straight to Slack. No data warehouse or ETL required.
Run SQL analytics directly on a CSV file with DuckDB, then push the results to Slack on a weekly schedule, no data warehouse, no ETL, and no manual spreadsheet checks. This blueprint reads a remote CSV over HTTP, computes sales KPIs in place with DuckDB, and delivers a formatted summary to a Slack channel every Monday morning, turning a flat file into an automated business report your team can read without logging into anything.
every_monday trigger (io.kestra.plugin.core.trigger.Schedule) fires on the cron 0 9 * * MON, starting the flow at 9 AM every Monday.analyze_sales task (io.kestra.plugin.jdbc.duckdb.Queries) installs and loads the DuckDB httpfs extension, then runs read_csv_auto against a remote orders.csv to compute sum(total) as total revenue and avg(quantity) as average order quantity. With fetchType: FETCH, the rows are returned as task outputs.slack task (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts a formatted message to your channel, interpolating outputs.analyze_sales.rows[0].total and outputs.analyze_sales.rows[0].avg_quantity into the text.httpfs.DuckDB is a query engine, not a scheduler: it cannot fire on a cron, retry a failed run, alert a channel, or track which inputs produced which outputs. Kestra fills that gap. The Schedule trigger runs the analysis on an event-driven cron, tasks can retry transient HTTP or network failures, every execution is captured with full logs and lineage, and the whole pipeline is declarative YAML you can version, review, and reuse. You get the speed of DuckDB SQL with the reliability and visibility of a real orchestrator.
jdbc) and Slack plugins available.SLACK_WEBHOOK: the Slack incoming webhook URL used by the slack task.SLACK_WEBHOOK secret.read_csv_auto at your own CSV URL and adjust the SQL to your metrics.httpfs and the secrets extension support cloud object storage).analyze_sales query.url: "jdbc:duckdb:md:my_db?motherduck_token={{ secret('MOTHERDUCK_TOKEN') }}" on the query task, no change to the SQL logic.