# Automations in Attio

> Source: https://docs.trailspark.ai/destinations-rules/automations-in-attio

## Overview

The **Trailspark Accounts** list is a source, and Attio workflows are how you act on it. This page gives four recipes, which are four ways of doing one job: getting the right account in front of the right person without being told twice. Pick the one that fits, or combine them.

Every recipe:

- **Triggers on Last changed, filtered on What changed.** Set the trigger to **List entry updated**, choose the list **Trailspark Accounts**, and choose the attribute **Last changed**. Then add a **Filter** block on **What changed**. Do not build on **As of**: it changes whenever Trailspark refreshes the row, even when nothing meaningful changed.
- **Uses columns you own.** Trailspark never adds a column for a recipe, and never changes a column it didn't create. Each recipe tells you which of your own columns to add to the list first.
- **Costs one credit for each action a run takes.** In our testing, runs that were filtered out and runs that failed cost nothing. Check your Attio plan for how many workflow credits it includes.
- **Runs about a minute after the update.** Trailspark updates rows hourly, and Attio then runs the workflow roughly 30 to 60 seconds after each update.

To start, open **Workflows** in Attio's sidebar and create a new workflow. To add a condition to a Filter block: click **Add condition**, choose **List entry updated**, then **Updated Entry**, then the attribute, then the operator and the value.

When you finish a workflow, click **Publish changes**. Republishing a workflow that is already live asks "Are you sure you want to publish these changes? Ongoing runs will not be affected by these changes." Click **Publish**.

> [!TIP]
> Each time a workflow changes a row, the record's activity feed names the workflow that did it, so you can see which automation touched which row.

## Recipe 1: Route on first reach

Do something the first time an account's level changes, and not again.

**Add first:** a Timestamp column of your own on the list, for example **Last routed**.

**Build it:**

1. Trigger: **List entry updated**, list **Trailspark Accounts**, attribute **Last changed**.
2. Add a **Filter** block with these conditions, all required:
   - **What changed** is **Propensity**
   - **Score status** is not **Merged**
   - **Last routed** is empty
3. Add an **Update list entry** block. Set **Last routed** to the trigger's **Updated at** value.
4. After it, add your own action, for example a task for the account's owner.

The stamp is what stops a repeat. After the first run, **Last routed** is filled, so later runs are filtered out and cost nothing.

**Cost:** 1 credit for the stamp. The action you add is yours to price.

**Ask Attio prompt.** If you build with Attio's assistant, you can paste this:

```text
Create a workflow. Trigger: List entry updated on the list Trailspark Accounts, attribute Last changed. Filter: What changed is Propensity, Score status is not Merged, and Last routed is empty. Then Update list entry: set Last routed to the Updated at time of the updated entry.
```

Check the final block against the steps above before you publish. The assistant can pick the wrong attribute or leave out a condition.

## Recipe 2: Route while still worth routing

Act whenever an account reaches High, but only for companies that are not already customers.

**Add first:** a Checkbox column of your own on the list, for example **Still worth routing**, and a Checkbox column on Companies called **Customer**.

**Build it:**

1. Trigger: **List entry updated**, list **Trailspark Accounts**, attribute **Last changed**.
2. Add a **Filter** block with these conditions, all required:
   - **What changed** is **Propensity**
   - **Score status** is not **Merged**
   - **Propensity** is **High**
   - Under **Updated Entry**, choose **Parent Record**, then **Customer** is not **True**
3. Add an **Update list entry** block that ticks **Still worth routing**.
4. After it, add your own action.

Choosing **Parent Record** lets a condition read a field on the company itself, which is how the filter sees whether the company is a customer. Use **is not** with **True**, never **not**. A checkbox nobody ticked is empty, not false, and the condition **not** fails on an empty value, so every run fails.

**Cost:** 1 credit when the box is ticked. A run for an account at Medium, or for a company that is a customer, is filtered out and costs nothing.

**Ask Attio prompt:**

```text
Create a workflow. Trigger: List entry updated on the list Trailspark Accounts, attribute Last changed. Filter: What changed is Propensity, Score status is not Merged, Propensity is High, and the parent record's Customer checkbox is not True. Then Update list entry: tick Still worth routing.
```

Check the final block, especially that the Customer condition reads **is not True**.

## Recipe 3: Tidy up merged rows

When an account is merged into another in Trailspark, its row is finished. This workflow removes it from your list.

**Add first:** nothing.

**Build it:**

1. Trigger: **List entry updated**, list **Trailspark Accounts**, attribute **Last changed**.
2. Add a **Filter** block: **What changed** is **Merged**.
3. Add a **Delete list entry** block (under **Lists**). Set **List** to Trailspark Accounts and **Entry** to **Updated Entry**.

**Cost:** 1 credit when a merged row is removed.

**Ask Attio prompt:**

```text
Create a workflow. Trigger: List entry updated on the list Trailspark Accounts, attribute Last changed. Filter: What changed is Merged. Then Delete list entry: the list Trailspark Accounts, the updated entry.
```

Check that the delete block is pointed at the updated entry and nothing else.

> [!NOTE]
> **A row your own automation removed** is a tidy-up, not an error. Merged rows never come back, so Trailspark does not try to restore this one, and you do not need to click **Repair** or **Restore all**. Trailspark's next daily check notices the row is gone, does not report it as deleted in your CRM, and does not show it as waiting to come back.

## Recipe 4: Tell the team once

Send one alert when an account's level changes, and not again.

**Add first:** a Timestamp column of your own on the list, for example **Last alerted**.

**Build it:**

1. Trigger: **List entry updated**, list **Trailspark Accounts**, attribute **Last changed**.
2. Add a **Filter** block with these conditions, all required:
   - **What changed** is **Propensity**
   - **Score status** is not **Merged**
   - **Last alerted** is empty
3. Add an **Update list entry** block. Set **Last alerted** to the trigger's **Updated at** value.
4. After it, add your own action, for example a message to your team.

Without the **Score status is not Merged** condition, the run triggered by a merge also matches, and if recipe 3 has already removed the row, that run fails with "The provided entry could not be found". It costs nothing, but it shows up in the run history as a failure.

**Cost:** 1 credit for the stamp.

**Ask Attio prompt:**

```text
Create a workflow. Trigger: List entry updated on the list Trailspark Accounts, attribute Last changed. Filter: What changed is Propensity, Score status is not Merged, and Last alerted is empty. Then Update list entry: set Last alerted to the Updated at time of the updated entry.
```

Check the final block against the steps above before you publish.

## Next steps

- [Your Trailspark Accounts list in Attio](https://docs.trailspark.ai/destinations-rules/trailspark-accounts-list-attio): every column, and what What changed can hold
- [Connecting Attio](https://docs.trailspark.ai/crm-integration/connecting-attio): connect, open the list, and disconnect
- [Which accounts appear, and what happens after](https://docs.trailspark.ai/destinations-rules/which-accounts-appear): what Score status and What changed mean
