> ## Documentation Index
> Fetch the complete documentation index at: https://80x.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Build your first workflow

> Build, test, and publish a deal-stage Slack alert in about ten minutes. Learn the canvas, variables, and publishing model as you go.

Build, test, and publish a deal-stage Slack alert in about ten minutes. Learn the canvas, variables, and publishing model as you go.

<Note>
  **Prerequisites:** you understand what a workflow is and how a trigger starts one. If that is new, read [What are Attio Workflows?](/explanation/what-are-workflows) first.

  **By the end you can:** build, publish, and debug a live workflow that posts a Slack alert every time a deal reaches a chosen stage.
</Note>

This lesson builds the classic first workflow. When a deal moves to a new stage, it posts an alert with the deal's details. The build is small, but it touches every fundamental you will reuse forever. You will set up a trigger, a filter, variables, an action, and the publishing model. It is also genuinely useful on day one.

If you have not connected Slack, swap the message step for a [Create task](/reference/tasks/create-task) block. Every other step is identical.

## What you build

The finished workflow follows the shape that most go-to-market (GTM) automation shares. A trigger fires, a filter narrows it, and an action runs. Here the [Attribute value changed](/reference/triggers/attribute-value-changed) trigger watches the deal stage. A [Filter](/reference/conditions/filter) block keeps only the stage you care about. The Slack **Post message to channel** block sends the alert.

A few facts orient you before you start:

* Workflows live under **Automations → Workflows** in the left sidebar.
* You build in a **draft**. Nothing runs until you publish.
* Workflows have no write access to objects by default. A read-only Slack alert needs none. But bookmark [Permissions & workflow access](/explanation/permissions-and-access) for the first workflow you build that changes data.

## Build the workflow

<Steps>
  <Step title="Create and name the workflow">
    Open **Automations → Workflows** and click the **Create workflow** button. Click the **Untitled Workflow** name in the top-left and rename it to something a colleague would recognize, such as `Deal stage → Slack alert`. Add a one-line description while you are there. Future-you will be grateful.

    <Tip>
      **The Ask Attio shortcut.** You can type *"When a deal's stage changes, post the deal name, value, and new stage to #revenue"* into the **Describe your workflow…** box and let the agent assemble the blocks. Build it by hand once first. Debugging an agent-built workflow takes exactly the block knowledge this lesson teaches.
    </Tip>
  </Step>

  <Step title="Add the trigger">
    Press `B` (or click the **Add block** button) and choose [Attribute value changed](/reference/triggers/attribute-value-changed). Configure it with these two fields.

    | Field | Value |
    | - | - |
    | Object or List | Deals |
    | Attribute | Deal stage |

    Why this trigger and not [Record updated](/reference/triggers/record-updated)? Because **Record updated** does not fire when an attribute is first set during record creation. A deal created straight into "Won" would silently skip your workflow. **Attribute value changed** catches both the creation-time value and every later change. That distinction is the single most common trigger mistake. [Choosing the right trigger](/explanation/triggers) covers the full decision.
  </Step>

  <Step title="Filter to the stages you care about">
    You almost never want an alert for every stage change, so narrow the run with a filter. Add a [Filter](/reference/conditions/filter) block after the trigger, then add one condition.

    | Field | Value |
    | - | - |
    | New value | is |
    | Stage | Won |

    A **Filter** block silently stops the run when its condition is not met, with no error and no alert. If you want a different message for each stage instead of stopping, use a [Switch](/reference/conditions/switch) block in this position.
  </Step>

  <Step title="Post the Slack message">
    Add the Slack **Post message to channel** block, available once the Slack app is connected. Pick your channel, such as `#revenue`. Write the message and click the **`{x}` use variable** button to inject live data.

    ```text Message body theme={null}
    🎉 {Deal name} just moved to {New value}
    Value: {Deal value} · Owner: {Deal owner}
    ```

    Each `{…}` token is a variable pulled from the trigger's outputs. Passing an earlier block's output into a later block's input is [data passing](/explanation/variables), the mechanism every multi-step workflow relies on. The new engine renders Slack messages in standard Markdown rather than Slack's own markup, which is [a change from legacy](/guides/migrating-from-legacy/block-changes).
  </Step>

  <Step title="Publish and test">
    Click the **Publish workflow** button. Attio highlights any misconfigured block in red. Fix each one and publish again. Then trigger the workflow for real by moving a test deal, such as `Acme renewal`, into the target stage. Open the **Runs** tab to confirm it worked. You see the run, the green-arrow path it took, and every block's inputs and outputs. The [run viewer](/explanation/runs-and-debugging) is where you will spend your time when a workflow misbehaves.
  </Step>
</Steps>

## What it costs

The trigger is free, the filter is free, and the Slack post costs 1 credit. So each alert costs 1 credit in total. The arithmetic stays trivial here, but it matters far more once you add loops or AI blocks. Learn to read it now. [Credits & pricing explained](/reference/credits-and-pricing) shows how every block is priced.

## Where this goes next

The trigger → filter → act shape you just built is the skeleton of most GTM automation. You change one block at a time to reach a new outcome:

* Swap the action for [Enroll in sequence](/reference/sequences/enroll-in-sequence) to drive stage-based outbound, as in [Enroll and auto-exit sequences](/guides/route-and-sequence/sequence-enrollment).
* Swap the trigger for [Webhook received](/reference/triggers/webhook-received) to capture product signals, as in [Webhook lead intake with safe upsert](/guides/capture-and-qualify/webhook-lead-intake).
* Add a [Web agent](/reference/agents/web-agent) before the Slack post to attach research to every alert, as in [AI ICP-fit research and routing](/guides/signals-and-ai/inbound-lead-research).

When you are ready to harden this exact build into something a sales team relies on, work through the full guide it grows into, [Slack deal alerts on stage change](/guides/route-and-sequence/slack-deal-alerts).

## See also

* [Slack deal alerts on stage change](/guides/route-and-sequence/slack-deal-alerts)
* [Choosing the right trigger](/explanation/triggers)
* [Variables & data passing](/explanation/variables)
* [Runs, debugging & publishing](/explanation/runs-and-debugging)
* [Credits & pricing explained](/reference/credits-and-pricing)

*Source: [Create a workflow](https://attio.com/help/reference/automations/workflows/create-a-workflow). Last reviewed against the Attio Help Center, June 2026.*


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.