New to Kestra?
Use blueprints to kickstart your first workflows.
Human-in-the-loop approval gate that pings an approver QQ group, pauses on Tencent Cloud IM, and posts the decision or expiry back to chat.
Drive a human-in-the-loop approval gate that pings a Tencent Cloud IM / QQ approver group, pauses the workflow on a deep link to the Kestra Resume button, and posts the outcome (or an expiry notice) back to the same chat. This blueprint pairs io.kestra.plugin.tencent.qq.QQIncomingWebhook with io.kestra.plugin.core.flow.Pause so production deploys, data releases, or finance approvals never move forward without an explicit human decision, and the audit trail of who decided what lives in chat alongside the execution id.
notify_pending_approval (io.kestra.plugin.tencent.qq.QQIncomingWebhook) posts a message to the QQ recipients in inputs.approver_recipients containing inputs.change_summary, inputs.requested_by, and a deep link to the Resume button built from inputs.kestra_ui_url and the execution id.wait_for_approval (io.kestra.plugin.core.flow.Pause) halts the run for pauseDuration: P2D with behavior: FAIL, waiting for an approver to resume it with the approved (BOOLEAN, defaults to false) and reason (STRING) onResume inputs.errors block runs notify_expired, a second QQIncomingWebhook that posts a "request expired, no decision taken" message to the same group.notify_outcome (QQIncomingWebhook) posts the recorded decision back to the QQ group, rendering outputs.wait_for_approval.onResume.approved as APPROVED or REJECTED along with the supplied reason.pluginDefaults on io.kestra.plugin.tencent.qq inject the url and token once so every QQ call uses the same endpoint and credentials.approved defaults to false, so a careless Resume rejects rather than auto-approves.pauseDuration: P2D so executions never hang indefinitely.timeout: PT30S and retry (constant, three attempts).| toJson.Tencent Cloud IM is a messaging API, not a workflow engine. It cannot pause a deploy pipeline, wait for an approver, retry a failed webhook, branch on the decision, or expire a stalled request. Kestra adds the missing control plane: declarative YAML for the whole approval flow, event triggers and Resume API to drive the gate from external systems, retries and timeouts on each notification, automatic expiry handling via the Pause errors block, and full execution lineage tying the chat message, the decision, and the downstream tasks to one execution id.
UserSig signature.sendmsg REST endpoint URL for your SDKAppID (for example v4/openim/sendmsg).kestra_ui_url so the Resume deep link resolves for approvers.TENCENT_IM_URL: Tencent Cloud IM REST endpoint used to send messages, including your SDKAppID and admin identifier.TENCENT_IM_TOKEN: Tencent Cloud IM authentication token or UserSig signature.TENCENT_IM_URL and TENCENT_IM_TOKEN secrets to your Kestra instance.approver_recipients to the QQ group or user identifiers of your approvers.kestra_ui_url to your Kestra base URL so the Resume link resolves.approved and reason. The outcome message is sent to the same group. If no one acts within two days, the group receives the expiry notice instead.Subflow from a parent CI/CD flow and gating the next stage on outputs.wait_for_approval.onResume.approved.io.kestra.plugin.core.flow.If to run a rollback, a Slack mirror message, or a ServiceNow change record on rejection.pauseDuration, or change behavior: FAIL to CANCEL for non-critical approvals.