New to Kestra?
Use blueprints to kickstart your first workflows.
Bridge HTTP webhooks to MQTT with Kestra. Forward selected webhook fields as a JSON message to a broker topic and confirm each publish in Slack.
Plenty of systems can send a webhook; far fewer can speak MQTT. This blueprint turns Kestra into the translator: io.kestra.plugin.core.trigger.Webhook accepts a JSON POST from any HTTP-capable tool, and io.kestra.plugin.mqtt.Publish republishes selected body fields as a JSON message onto the broker. The target topic comes from the request body with a safe default, so one endpoint serves many event types, and Slack notes every bridged event with the resolved topic and publish count.
http_event (io.kestra.plugin.core.trigger.Webhook) exposes a URL containing the webhook key; any system that can POST JSON can start the flow. Replace the placeholder key with a strong random value before sharing the URL.forward_to_mqtt (io.kestra.plugin.mqtt.Publish) connects to the broker from the MQTT_SERVER secret. The topic is {{ trigger.body.topic ?? 'bridge/events' }}, letting the sender route per event while unrouted events land on the default topic.event, source, and detail are lifted from the body with ?? defaults, and bridged_by plus execution_id are stamped on so subscribers can trace any message back to the exact execution that bridged it.qos: 1 gives at-least-once delivery to the broker, and the task's messagesCount output feeds the notification.notify posts the event name, resolved topic, and count to Slack; the errors block posts a distinct alert when an event was received over HTTP but failed to reach the broker, which is exactly the gap a bridge must never hide.topic body field, with a default that keeps malformed requests flowing.A bridge is infrastructure the moment two teams depend on it. Kestra gives this one authentication via the webhook key, secret management for the broker, retries on transient broker failures, an execution per event with the full request logged, and an alert when forwarding fails. The translation logic stays a few lines of YAML that review like configuration, not a service to deploy and monitor.
username and password properties to the task from secrets.MQTT_SERVER: broker URI, e.g. tcp://broker.example.com:1883.SLACK_WEBHOOK_URL: Slack incoming webhook URL.MQTT_SERVER and SLACK_WEBHOOK_URL secrets to your Kestra namespace.change-me-strong-webhook-key with a strong random key.mosquitto_sub -t 'bridge/#', then POST an event: curl -X POST https://your-kestra/api/v1/executions/webhook/company.team/mqtt-webhook-to-mqtt-bridge/YOUR_KEY -H 'Content-Type: application/json' -d '{"topic": "bridge/deploys", "event": "deploy_finished", "source": "ci", "detail": "v2.1.0"}'.bridge/deploys and Slack notes the bridged event.If task that fails fast on missing required fields.bridge/{{ trigger.body.topic ?? 'events' }}, so HTTP callers can never publish outside the bridge namespace.retain: true for event types that represent state rather than occurrences, as shown in the retained config push blueprint.