> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stairoids.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Outgoing Automations: Take Action on Engagement Signals

> Outgoing automations trigger real-time actions in your CRM, sequencer, and other tools the moment the right engagement conditions are met.

Outgoing automations close the loop between signal intelligence and action. Instead of manually monitoring your accounts list and deciding who to reach out to, you define the conditions that matter — a form submission, a score crossing a threshold, a specific property matching a value — and Stairoids fires the right action in the right tool automatically, in real time. Each outgoing automation is composed of a **trigger** (the condition that activates it) and an **action** (what Stairoids does in a connected tool when the trigger fires).

<Warning>
  Automations run in real time against live data. Test thoroughly using the **Simulate** feature before enabling any automation on your production accounts and contacts.
</Warning>

## Automation Anatomy

Every outgoing automation has three components:

<ResponseField name="trigger" type="object" required>
  The condition Stairoids evaluates as each signal arrives or as scores update. When the trigger condition is satisfied, the automation fires. See [Trigger Types](#trigger-types) below.
</ResponseField>

<ResponseField name="conditions" type="array">
  Optional additional filters that must all be true alongside the trigger. For example, you might trigger on `score_threshold` but only for accounts in a specific industry or with a specific CRM owner. Conditions use AND logic.
</ResponseField>

<ResponseField name="action" type="object" required>
  The operation Stairoids performs in a connected tool when the trigger fires. See [Action Types](#action-types) below.
</ResponseField>

## Trigger Types

<Accordion title="signal_received">
  Fires when a new signal of a specified type is ingested. Use this trigger when you want to react immediately to a specific engagement event regardless of the account's overall score.

  **Configuration parameters:**

  * `signal_type` — the event type to listen for (e.g. `form_submit`, `meeting_booked`)
  * `source` *(optional)* — restrict to signals from a specific integration

  **Example use case:** Notify your sales team in Slack every time a `meeting_booked` signal arrives from Calendly.
</Accordion>

<Accordion title="score_threshold">
  Fires when an account's or contact's engagement score crosses a configured value. The trigger fires once per threshold crossing — it will not re-fire until the score drops below the threshold and rises above it again.

  **Configuration parameters:**

  * `entity_type` — `account` or `contact`
  * `threshold` — the score value that activates the trigger (e.g. `70`)
  * `direction` — `above` (score rises past threshold) or `below` (score falls past threshold)

  **Example use case:** Automatically update a HubSpot deal stage to "Hot Lead" when an account score exceeds 70.
</Accordion>

<Accordion title="signal_property_match">
  Fires when an incoming signal contains a `properties` field that matches a specified key-value condition. Use this trigger when you need to react to a specific attribute of an event, not just its type.

  **Configuration parameters:**

  * `property_key` — the key inside the signal's `properties` object (e.g. `utm_campaign`)
  * `operator` — `equals`, `contains`, `starts_with`, `greater_than`, `less_than`
  * `property_value` — the value to match against (e.g. `q2-outbound`)

  **Example use case:** Enrol a contact in a nurture sequence when a `page_visit` signal arrives with `properties.url` containing `/pricing`.
</Accordion>

## Action Types

| Action                 | Description                                               | Supported Tools                |
| ---------------------- | --------------------------------------------------------- | ------------------------------ |
| **Create CRM record**  | Create a new contact, company, or deal record             | HubSpot, Pipedrive, Salesforce |
| **Update CRM record**  | Update a field on an existing contact, company, or deal   | HubSpot, Pipedrive, Salesforce |
| **Enroll in sequence** | Add the contact to an outbound email or LinkedIn sequence | Lemlist, HeyReach, Expandi     |
| **Add to list**        | Add the contact or account to a static or smart list      | HubSpot, Mailchimp             |
| **Send notification**  | Post a message to Slack or send an email alert            | Slack, Email                   |
| **Call webhook**       | POST a custom payload to any HTTPS endpoint               | Any tool with a REST API       |

## Creating an Outgoing Automation

<Steps>
  <Step title="Open Automations">
    Navigate to **Automations** in the main sidebar, then click **New Automation**.
  </Step>

  <Step title="Choose Your Trigger">
    Select a trigger type from the dropdown: **Signal Received**, **Score Threshold**, or **Signal Property Match**. Configure the trigger parameters in the panel that appears.
  </Step>

  <Step title="Add Conditions (Optional)">
    Click **Add Condition** to layer additional filters. For example, you can restrict the automation to accounts tagged with a specific CRM owner, a particular industry segment, or a minimum number of employees. All conditions must be true for the action to fire.
  </Step>

  <Step title="Choose an Action">
    Select the action type and the connected tool you want to act on. If you haven't connected the tool yet, click **Connect Tool** to complete the integration setup inline.
  </Step>

  <Step title="Configure Action Parameters">
    Fill in the action-specific fields. For CRM updates, specify the object type, the field to update, and the new value. For sequence enrolment, select the sequence name. For webhooks, provide the URL and any custom headers or payload template.
  </Step>

  <Step title="Test with Simulate">
    Before enabling, click **Simulate** and select a sample account or contact from your data. Stairoids runs the automation against that record without making any real changes, and shows you exactly what action would have fired and with what parameters.
  </Step>

  <Step title="Enable the Automation">
    Toggle the automation to **Active** and click **Save**. The automation is now live and will fire in real time as matching signals arrive.
  </Step>
</Steps>

## Example Automation: Score + Signal → CRM Update

The following automation updates a HubSpot deal stage to "Hot Lead" the moment an account both crosses a score of 70 **and** receives a `form_submit` signal — combining a score threshold with a specific engagement event for higher-confidence triggering.

```json theme={null}
{
  "name": "Hot Score + Form Submit → HubSpot Hot Lead",
  "trigger": {
    "type": "score_threshold",
    "entity_type": "account",
    "threshold": 70,
    "direction": "above"
  },
  "conditions": [
    {
      "field": "last_signal_type",
      "operator": "equals",
      "value": "form_submit"
    }
  ],
  "action": {
    "type": "update_crm_record",
    "integration": "hubspot",
    "object": "deal",
    "updates": {
      "dealstage": "hot_lead"
    }
  }
}
```

## Example Automations by Tool

<Tabs>
  <Tab title="HubSpot">
    **Scenario: Move a deal to "Demo Requested" when a meeting is booked**

    * **Trigger:** `signal_received` → `type = meeting_booked`
    * **Action:** Update HubSpot deal → set `dealstage = demo_requested`

    **Scenario: Create a HubSpot contact when a new signal arrives for an unknown contact**

    * **Trigger:** `signal_received` → any type
    * **Condition:** Contact does not exist in HubSpot
    * **Action:** Create HubSpot contact with `email`, `company`, and `source` pre-filled

    ```json theme={null}
    {
      "trigger": { "type": "signal_received" },
      "conditions": [
        { "field": "contact_exists_in_hubspot", "operator": "equals", "value": false }
      ],
      "action": {
        "type": "create_crm_record",
        "integration": "hubspot",
        "object": "contact",
        "fields": {
          "email": "{{signal.contact}}",
          "company": "{{signal.account}}",
          "lead_source": "{{signal.source}}"
        }
      }
    }
    ```
  </Tab>

  <Tab title="Pipedrive">
    **Scenario: Create a Pipedrive deal when account score crosses 50**

    * **Trigger:** `score_threshold` → account score ≥ 50
    * **Action:** Create Pipedrive deal with the account domain as the organisation name and set the stage to "Qualified"

    **Scenario: Update Pipedrive contact's last engagement date on every signal**

    * **Trigger:** `signal_received` → any type
    * **Action:** Update Pipedrive person → set custom field `last_signal_date` to `{{signal.created_at}}`

    ```json theme={null}
    {
      "trigger": { "type": "signal_received" },
      "action": {
        "type": "update_crm_record",
        "integration": "pipedrive",
        "object": "person",
        "updates": {
          "last_signal_date": "{{signal.created_at}}",
          "last_signal_type": "{{signal.type}}"
        }
      }
    }
    ```
  </Tab>

  <Tab title="HeyReach">
    **Scenario: Enrol a contact in a LinkedIn sequence when they visit the pricing page**

    * **Trigger:** `signal_property_match` → `properties.url` contains `/pricing`
    * **Condition:** Signal type = `page_visit`
    * **Action:** Enrol contact in HeyReach sequence "Pricing Page Visitors — LinkedIn Outreach"

    **Scenario: Pause a HeyReach sequence when a contact books a meeting**

    * **Trigger:** `signal_received` → `type = meeting_booked`
    * **Action:** Remove contact from active HeyReach sequences (prevents sending outreach to contacts already in the pipeline)

    ```json theme={null}
    {
      "trigger": {
        "type": "signal_received",
        "signal_type": "meeting_booked"
      },
      "action": {
        "type": "update_sequence_enrollment",
        "integration": "heyreach",
        "operation": "unenroll_all",
        "contact": "{{signal.contact}}"
      }
    }
    ```
  </Tab>
</Tabs>

## Testing and Debugging

### Simulate

Use the **Simulate** button in any automation's settings panel to run the automation against a real account or contact without making any live changes. The simulation report shows:

* Whether the trigger condition would have fired
* Which (if any) conditions filtered out the event
* The exact payload that would have been sent to the action's target tool
* Any errors in field mapping or missing required parameters

### Execution Logs

Every time an automation fires (or fails to fire), Stairoids writes an entry to the **Automation Log**, accessible from the automation's detail page. Each log entry records:

* The signal that triggered evaluation
* The timestamp
* Whether the action succeeded, was filtered out by conditions, or returned an error
* The response from the target tool's API

<Tip>
  If an action fails due to a transient error (e.g. a momentary API timeout from your CRM), Stairoids automatically retries up to three times with exponential backoff before marking the execution as failed and logging an alert.
</Tip>
