New to Kestra?
Use blueprints to kickstart your first workflows.
Automate a vacation approval business process with Kestra. Send a Slack approval request, pause for a human to resume, then submit the request to an API.
Automate a human-in-the-loop business process for vacation approvals with Kestra. This getting started flow shows how to combine an automated Slack notification, a manual approval gate, and an HTTP API submission into one declarative YAML workflow. It solves a common problem in business process automation: how to pause an automated pipeline for a human decision and then resume downstream steps once approval is granted, without writing custom glue code or a separate approval service.
inputs: an employee request.name, a request.start_date, a request.end_date, and a slack_webhook_uri. Kestra renders these as a form automatically in the UI.send_approval_request task (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts a message to Slack with a link back to the execution so an approver can act.wait_for_approval task (io.kestra.plugin.core.flow.Pause) pauses the execution with a pauseDuration of PT30S, holding the flow until a human clicks Resume in the Kestra UI.process_request task (io.kestra.plugin.core.http.Request) sends a POST with contentType application/json and the approved request payload to the target API.Slack incoming webhooks can post a message, but they cannot pause a process, wait for a decision, and then run conditional follow-up work. Kestra fills that gap. The declarative YAML keeps the whole approval process in one versioned file, the Pause task models the human gate natively, and execution state, retries, and full lineage are tracked end to end. You can trigger the flow on a schedule or an event, audit every approval, and replay failed runs, capabilities a standalone webhook or chat tool cannot provide.
This getting started example uses no secrets. The Slack webhook is passed through the slack_webhook_uri input. For production, move it to a secret with {{ secret('SLACK_WEBHOOK_URI') }} instead of an input default.
slack_webhook_uri to your real Slack incoming webhook.Resume in the UI.process_request task submits the approved payload.process_request with your HR or HTTP backend.pauseDuration or remove it so the flow waits indefinitely for approval.Switch task to branch on approve versus reject responses.Schedule or webhook trigger to start the process automatically.