New to Kestra?
Use blueprints to kickstart your first workflows.
Sync Pipedrive deal stages from product events with Kestra. A webhook maps activation milestones to stage updates and posts every move to Slack.
A pipeline stage is supposed to describe reality, but in most CRMs it describes the last time a salesperson remembered to drag a card. This blueprint inverts that: the product itself reports milestones through a webhook, and io.kestra.plugin.pipedrive.deals.Update moves the deal to the stage that matches what the customer actually did. An activated account advances to evaluation, an account crossing the expansion threshold advances to negotiation, and unmapped milestones are logged rather than dropped.
product_event_webhook trigger (io.kestra.plugin.core.trigger.Webhook) receives a JSON body carrying dealId and milestone from your product analytics or event bus.route_milestone (io.kestra.plugin.core.flow.If) matches milestone == 'activated' and runs move_to_evaluation, a deals.Update that sets stageId: 3.else branch nests a second If: expansion_ready runs move_to_negotiation with stageId: 4, and anything else lands in log_unmapped, so a new product event type shows up in the logs instead of disappearing.notify posts the processed milestone and deal id to Slack after the branch completes.errors block posts a distinct Slack alert naming the milestone and deal that failed to apply.The mapping between product milestones and pipeline stages is business logic, and business logic deserves version control, branching, error alerts, and an execution history. Kestra gives the webhook, the If tree, the CRM update, and the notification one home, so when someone asks why a deal moved, the answer is an execution link rather than a shrug.
dealId and milestone fields.PIPEDRIVE_API_TOKEN: Pipedrive API token.SLACK_WEBHOOK_URL: Slack incoming webhook URL.key with a strong random value.stageId values 3 and 4 with real stage ids from your pipeline.{"dealId": 1, "milestone": "activated"} to the webhook URL.io.kestra.plugin.core.flow.Switch on the milestone value as the mapping grows.probability alongside stageId in the update so the forecast moves with the stage.status to lost with a matching stage instead of advancing.