# Workflows in Linkubit: every trigger and action, and how they chain

> A workflow runs actions when an event happens and its condition holds. Every trigger and action, the starter set, and how one sets off another.

Source: https://www.linkubit.com/docs/workflows-explained  
Section: Linkubit help centre › How the AI agent works  
Updated: 2026-10-09

## In short

A workflow has a Trigger (an event), an optional Condition and Actions run in order. Actions can themselves fire events — qualify_lead fires lead.qualified — so workflows chain. Every run is in the audit log with each action's result. Check what listens to an event before adding an action that hands over, assigns or closes on it.

## How a workflow runs

1. An event happens — a score changes, a goal completes, a lead is qualified.
2. Every active workflow on that trigger is checked. **Condition** tests the event and the contact (signals, contact fields, your fields); blank means always.
3. Actions run in the order listed. One that fails is recorded and the next still runs.
4. The run is written to **Settings › Audit log** as `workflow:<trigger>`, with each action and its result, and to the conversation's automatic events.

## Triggers

| Trigger | Fires when |
| --- | --- |
| `message.received` | A customer message arrives. |
| `conversation.opened`, `conversation.replied` | A conversation starts; the customer replies. |
| `conversation.escalated` | A conversation is handed to a person, for any reason. |
| `conversation.went_stale` | A conversation is first found quiet by the follow-up sweep. |
| `contact.scored` | A contact's score changes. The event carries the new and previous score. |
| `lead.created` | A lead is created — from a conversation's first required field, an ad form, an import or a workflow. |
| `lead.qualified` | A lead gets a class of high, medium or low for the first time. Once per lead. |
| `lead.assigned` | A lead's owner changes. |
| `goal.completed` | A goal's required fields are all captured. Carries the goal's key — condition on it. |
| `opportunity.stage_changed`, `opportunity.won`, `opportunity.lost` | A deal moves or closes. |
| `product.interest_recorded`, `product.interest_changed` | A product comes up, or the customer changes their mind about one. |
| `payment.requested`, `payment.captured`, `payment.failed` | A payment request goes out, is paid, or fails. |
| `campaign.replied`, `campaign.completed` | A campaign recipient replies; a campaign finishes. |
| `consent.withdrawn` | A contact opts out. |
| `crm.record_changed` | A linked record changes in your CRM. |

## Actions

| Action | What it does |
| --- | --- |
| `create_task` | Puts a to-do on somebody's list, with a title (use {contact_name}) and a due time. |
| `assign_owner` | Gives the contact, their leads, deals and conversation to a person, a round-robin or a territory. |
| `escalate_conversation` | Hands the conversation to a person and stops the agent replying. |
| `qualify_lead` | Sets the lead's class — fixed, or from the score's band. Fires `lead.qualified` the first time. |
| `advance_lifecycle` | Moves the contact to a pipeline stage, with its open deals. |
| `open_opportunity` | Opens the contact's deal, priced from the catalogue. |
| `sync_opportunity_line_items` | Re-prices the open deal from the products the contact is interested in. |
| `close_deal` | Closes the open deal as won or lost. |
| `start_goal` | Starts a conversation goal. |
| `set_attribute` | Writes a value onto one of the contact's fields. |
| `record_product_interest` | Records that the contact is considering, wants or rejected a product. |
| `request_payment` | Sends a payment request for catalogue items. |
| `stop_campaigns` | Stops the contact's remaining campaign steps. |
| `crm_sync`, `crm_update_field`, `crm_add_note`, `crm_create_record` | Write to your connected CRM (queued, never inline). |

## The starter workflows

| Workflow | Trigger → actions |
| --- | --- |
| Score qualifies the lead | `contact.scored` with score ≥ 40 → `qualify_lead` from the score (40 low, 60 medium, 80 high) |
| Qualified lead → pipeline | `lead.qualified` → `advance_lifecycle` to qualified, `open_opportunity` |
| Keep the deal value current | `product.interest_recorded` / `product.interest_changed` → `sync_opportunity_line_items` |
| Follow up an ad lead | `lead.created` from an ad → `create_task` due in an hour |

Setup may add up to three of its own (for example a task when a lead qualifies), and **Edit agent** can add routing ones. They are ordinary rows on **Settings › Workflows** — edit or switch them off like any other.

## Chains, and how to keep them safe

- Actions fire events: `qualify_lead` fires `lead.qualified`, `escalate_conversation` fires `conversation.escalated`, `assign_owner` fires `lead.assigned`. Every workflow on those runs too.
- Before adding an action to a trigger, read what sets that trigger off. `lead.qualified` is only as strict as your scoring rules and your goals' **Qualifies as**.
- Loops stop on their own: a lead is qualified once, so a workflow on `lead.qualified` that qualifies again fires nothing new.
- To hand over after the details are collected, mark the goal **Escalate to a human when this goal completes** instead of escalating on `lead.qualified`.

## Related
- [From a conversation to a lead to a deal](https://www.linkubit.com/docs/conversation-to-lead-to-deal)
- [Lead scoring, explained](https://www.linkubit.com/docs/lead-scoring-explained)
- [Pipeline stages, scoring and workflows](https://www.linkubit.com/docs/pipeline-scoring-and-workflows)
