New to Kestra?
Use blueprints to kickstart your first workflows.
Ingest CSV file drops with dlt the moment they land. A Kestra webhook triggers the flow, the filesystem source parses every file, and Discord gets the report.
Replace the cron job that polls a drop folder with ingestion that runs the moment files arrive. An upstream system, an SFTP hook, an application export, or a vendor delivery, calls the flow's webhook after finishing a drop. dlt's filesystem source then globs the location (local mount, S3, GCS, or anything fsspec speaks), streams every matching CSV through read_csv, and appends the rows into DuckDB. dlt records which file every row came from, so bad deliveries can be traced and surgically deleted later.
on_files_announced (io.kestra.plugin.core.trigger.Webhook) exposes a URL keyed by a secret string; the upstream system calls it once a drop is complete, which avoids the classic half-written-file race that folder polling suffers from.load_files (io.kestra.plugin.dlt.Run) builds a filesystem source from the source_uri and file_glob inputs and pipes it through read_csv, so parsing happens lazily, file by file.write_disposition: append fits the immutable-drop model: every delivery adds rows, and dlt's _dlt_load_id plus file metadata give each row lineage.notify posts them to Discord, and the errors block flags the drop location when a malformed file breaks parsing.File ingestion fails in operational ways: a truncated file, an unexpected delimiter, a vendor renaming columns. Kestra gives the dlt source a webhook front door, retries, per-delivery execution history with the exact inputs used, and failure alerts that name the drop location. The upstream system needs nothing more than one HTTP call to hand off responsibility.
warehouse_path input).DISCORD_WEBHOOK_URL: Discord incoming webhook URL.DISCORD_WEBHOOK_URL secret and replace the webhook trigger key with a strong random string.source_uri at s3:// or gs:// buckets, passing storage credentials through task env.read_parquet or read_jsonl for other formats; the pipeline shape stays identical.