> ## 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.

# Core Concepts: Signals, Intelligence, and Automations

> Learn the mental model behind Stairoids: how Signals, Signal Intelligence, Automations, Accounts, Contacts, and Workspaces all fit together.

Everything in Stairoids is built around a single idea: your GTM tools are already generating rich engagement data, but that data sits in silos. Stairoids breaks down those silos by pulling every meaningful event into one place, scoring it intelligently, and letting you act on it automatically. This page explains the six core concepts that make that possible — read it once and the rest of the platform will click into place.

## The Data Flow

Before exploring each concept individually, here's the end-to-end picture of how data moves through Stairoids:

```text theme={null}
Data Sources  →  Incoming Automations  →  Signal Intelligence  →  Outgoing Automations  →  Your Tools
```

Your connected tools and direct API calls feed raw events in. Incoming Automations normalize and route those events as Signals. Signal Intelligence scores and correlates them into account and contact profiles. Outgoing Automations watch those profiles and fire actions back to your tools when conditions are met.

***

## Signals

A **Signal** is a discrete engagement event — a single, timestamped record that says "this thing happened, involving this account and/or contact." Signals are the atomic unit of data in Stairoids. Every piece of intelligence and every automation is ultimately built on top of them.

### Anatomy of a Signal

Every signal shares a common structure regardless of where it came from:

| Field        | Type               | Description                                                                                                            |
| ------------ | ------------------ | ---------------------------------------------------------------------------------------------------------------------- |
| `id`         | string             | Unique identifier assigned by Stairoids at ingestion time.                                                             |
| `type`       | string             | A namespaced event type such as `page_visit`, `email_open`, `deal_stage_changed`, or `linkedin_connection`.            |
| `account`    | object             | The company associated with this signal, identified by domain (e.g., `acme.com`).                                      |
| `contact`    | object (optional)  | The individual associated with this signal, identified by email address.                                               |
| `properties` | object             | Arbitrary key-value metadata specific to the signal type (e.g., `{"page": "/pricing"}` or `{"stage": "Proposal"}`).    |
| `score`      | integer            | The weight Stairoids assigns to this specific signal type, used to update the account and contact's engagement scores. |
| `created_at` | ISO 8601 timestamp | When the signal was received by Stairoids.                                                                             |

### Signal Types

Stairoids ships with a library of built-in signal types mapped to common GTM tools, and you can also define custom signal types for anything your stack emits that doesn't fit a standard category. Examples of built-in types include:

* `page_visit` — A contact visited a page on your website.
* `email_open` — A contact opened a marketing or sales email.
* `deal_stage_changed` — A HubSpot deal moved from one pipeline stage to another.
* `linkedin_connection` — A prospect accepted a LinkedIn connection request.
* `form_submission` — A contact submitted a form on your site or in a tool.

<Tip>
  Custom signal types follow the same structure as built-in types. Prefix them with a namespace that reflects your business (e.g., `custom.webinar_attended`) to keep them easy to identify in filters and automations.
</Tip>

***

## Signal Intelligence

**Signal Intelligence** is the scoring and correlation engine at the heart of Stairoids. Raw signals on their own are useful, but their real value emerges when Stairoids combines them across sources, over time, and across multiple contacts at the same account.

### How Scoring Works

Every time a signal arrives, Stairoids updates two engagement scores: one for the **account** and one for the **contact**. Scores are computed using three inputs:

* **Type weight** — Each signal type carries a configured weight reflecting its intent value. A `page_visit` to `/pricing` weighs more than an `email_open` of a newsletter. You can customize type weights in **Settings → Signal Weights**.
* **Recency** — More recent signals contribute more to the current score. Stairoids applies a time-decay function so that older signals fade in influence without disappearing from history.
* **Frequency** — Repeated signals of the same type from the same contact within a short window are aggregated to prevent score inflation from spam or bot traffic.

The resulting score is a single integer between 0 and 100 for each entity, updated in real time with every new signal. A rising account score is your clearest indicator of growing buying intent.

<Note>
  Score thresholds — the values at which Outgoing Automations fire — are fully configurable per automation rule. There is no global "hot lead" threshold; you define what the numbers mean for your business.
</Note>

***

## Incoming Automations

**Incoming Automations** are the mechanisms that bring signals into Stairoids. There are three ways signals can enter the platform:

<CardGroup cols={3}>
  <Card title="Native Integrations" icon="plug">
    Connect tools like HubSpot, HeyReach, or LinkedIn Sales Navigator directly. Stairoids polls or listens via webhook for qualifying events and converts them to signals automatically using pre-built mappings.
  </Card>

  <Card title="Inbound Webhooks" icon="webhook">
    Generate a unique webhook URL in Stairoids and point any tool that supports outbound webhooks at it. Stairoids parses the payload and maps it to a signal type using a rule you define.
  </Card>

  <Card title="Direct API Calls" icon="code">
    `POST /v1/signals` directly from your own application or backend. This is the most flexible path and is ideal for custom in-house tools, product usage data, or events that don't come from a third-party integration.
  </Card>
</CardGroup>

Incoming Automations can also include **field mappings** and **filters** — for example, you can configure an incoming automation that only creates a signal when a HubSpot deal reaches the "Proposal" stage, ignoring all earlier stage changes.

***

## Outgoing Automations

**Outgoing Automations** are rules that Stairoids evaluates in real time after every signal ingestion. When a rule's conditions are met, Stairoids executes one or more actions against your connected tools.

### Anatomy of an Outgoing Automation

Every outgoing automation is composed of:

| Component         | Description                                                                                                                                                      |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Trigger**       | The condition that activates the rule. Triggers can be based on signal type, signal properties, account score thresholds, or contact score thresholds.           |
| **Filters**       | Optional additional conditions that must also be true (e.g., "only if the account is in the `Enterprise` segment").                                              |
| **Actions**       | One or more operations to perform on a connected tool — enroll a contact in a sequence, update a CRM field, send a Slack notification, create a task, and so on. |
| **Deduplication** | Controls how often the automation can fire for the same contact or account (e.g., "at most once per 7 days").                                                    |

<Warning>
  Outgoing Automations fire asynchronously. There is typically a sub-second delay between a signal arriving and an action executing, but you should not rely on synchronous execution in time-critical workflows. Use the **Automation Logs** page to monitor execution history and debug any failed actions.
</Warning>

***

## Accounts and Contacts

Stairoids tracks two entity types that signals are attached to:

### Accounts

An **Account** represents a company. Stairoids identifies accounts by their **domain** (e.g., `acme.com`). When a signal arrives with `account.domain`, Stairoids looks up or creates the account record and appends the signal to its engagement timeline. Account profiles include:

* Firmographic data (name, industry, size) — populated automatically via enrichment if configured.
* A running engagement score updated with every signal.
* A full timeline of every signal associated with any contact at that domain.
* All active and past outgoing automation executions tied to the account.

### Contacts

A **Contact** represents an individual person. Stairoids identifies contacts by their **email address**. Contacts always belong to an account (the domain portion of their email is used to associate them automatically). Contact profiles include:

* The contact's own engagement score, distinct from their account's score.
* A personal signal timeline.
* Enrichment data pulled from connected tools or enrichment integrations.

<Tip>
  If a signal arrives with a contact email whose domain doesn't match an existing account, Stairoids creates both the contact and a new account record automatically. You can merge duplicate account records from the Accounts page at any time.
</Tip>

***

## Workspaces

A **Workspace** is the top-level organizational unit in Stairoids. All data — signals, accounts, contacts, automations, and integrations — lives inside a workspace and is fully isolated from other workspaces.

Workspaces are designed for two primary use cases:

* **B2B agencies** — Create one workspace per client to keep data, automations, and integrations completely separated. Each workspace has its own API keys, settings, and user access controls.
* **Internal business units** — Large organizations can use separate workspaces for distinct business units or product lines that operate independent GTM programs.

Users can be members of multiple workspaces and switch between them from the top navigation bar. Billing is managed at the workspace level.

***

## Putting It All Together

Here's a concrete example that ties all six concepts together:

1. A contact at `acme.com` visits your pricing page. Your website fires a `POST /v1/signals` call with `type: "page_visit"` and `properties.page: "/pricing"`. This is a **direct API call** — an **Incoming Automation**.

2. Stairoids creates the signal, assigns it a type weight of `15`, and updates Jane's **Contact** score and the `acme.com` **Account** score in real time. **Signal Intelligence** detects that this is the third pricing page visit from this account in seven days and boosts the account score accordingly.

3. The account score crosses `75` — the threshold you defined in an **Outgoing Automation** rule. Stairoids fires the action: it enrolls Jane in a HeyReach LinkedIn outreach sequence and posts a "Hot account alert" message to your `#sales-signals` Slack channel.

4. Your rep sees the Slack alert, opens the **Account** profile in Stairoids, reviews the full signal timeline, and jumps into the HeyReach sequence — all without manually checking a single tool.

That's Stairoids: signals in, intelligence applied, actions out.
