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

# Using Signal Builder

> Signal Builder lets you tag and segment calls by combining call details, caller demographics, and account data into rule-based Signals — including advanced manual expressions.

Use Signals to tag and segment calls by data and outcomes. This guide covers rule-based Signals evaluated on pre-defined conditions:

* Call details (duration, end reason, spoken word/phrase)
* Caller demographics (age, gender, address type)
* Other account data (Marketing Data, AdWords data, other Signals)
* Platform data (campaign/promo number)
* Missed opportunity indicators (for example, voicemail pickup)

You can combine several conditions in one Signal.

## Creating a new rule-based Signal

1. Log in, then in the sidebar click **Signal** > **Manage Signals**.
2. Click **+ New Signal** > **Rule-Based Signal**.
3. In the Name box, name the call type (for example, "Qualified caller"). In the Description box, list the conditions.
4. Optionally enter a Revenue amount.
5. Use the Conditions menu to pick a data type to evaluate — see the guides on Keyword Spotting and Missed Opportunity conditions for those specifically.
6. Repeat for more conditions, using the **and**/**or** dropdown between conditions.
7. Optionally restrict the Signal to specific Campaigns.
8. Optionally share the Signal via Syndication if you use performance marketing.
9. Click **Save**.

Invoca checks each new call against your conditions and marks each one true or false. Most Signals process before the call; the exceptions are phrase-spotting and call-duration conditions, which process shortly after the call ends.

## Advanced: manual Signal expressions

For complex logic, use the **Text** button to switch between the guided Builder and a manual text expression. Use parentheses to combine and/or logic across several conditions.

### Real-time vs. reporting-only operators

The operators below marked **real-time** can be used in call treatment conditions (they evaluate as the call is happening). Operators not marked real-time only evaluate correctly in reporting, after the call — they always evaluate false if used in a real-time call treatment condition.

| Operator           | Real-time? | Description                                                                                                 |
| :----------------- | :--------- | :---------------------------------------------------------------------------------------------------------- |
| `duration`         | No         | Call duration, in seconds or minutes                                                                        |
| `connect_duration` | Yes        | Connected call duration, in seconds or minutes                                                              |
| `mobile`           | Yes        | True if the caller's number is a mobile number                                                              |
| `landline`         | Yes        | True if the caller's number is a landline                                                                   |
| `sms_sent`         | Yes        | True if an SMS was sent on this call                                                                        |
| `during_hours`     | Yes        | True if the call occurred during defined business hours                                                     |
| `repeat`           | Yes        | True if this is a repeat caller (default: within the last 30 days) — see `previous_signal` for better logic |
| `signal`           | Yes        | True if another Signal was met on this call                                                                 |
| `previous_signal`  | No         | True if a Signal was met on a prior call by this repeat caller, within 30 days                              |
| `voice_signal`     | No         | True if a Voice Signal was met on a prior call                                                              |

### Examples

```text theme={null}
duration > 2 minutes
duration < 30 seconds
duration > 1 minute AND mobile
landline
during_hours AND sms_sent
signal = 'Over 18'
signal = 'SupportCall' AND duration > 5 minutes
previous_signal = 'Over 18'
voice_signal = 'Quote'
```

### Marketing Data fields

Reference a Marketing Data field with `custom_data["field name"]`. This is true if the field exists on the call; you can also check for an exact match, a partial match, or simple presence.

```text theme={null}
custom_data["utm_source"] = 'LinkedIn'
custom_data["utm_campaign"] contains 'Search'
custom_data["device_type"] = 'mobile' AND pool_param[os_type] = 'android'
```

Check whether a field exists using `present`. Note that `present` only returns true if the field exists **and** isn't blank or whitespace:

```text theme={null}
custom_data["gclid"] present
not (custom_data["gclid"] present)
```

### RingPool parameters

Reference a RingPool parameter with `pool_param[param_name]` — this supports the same exact-match, partial-match, and presence checks as Marketing Data fields:

```text theme={null}
pool_param[utm_source] = 'LinkedIn'
pool_param[utm_campaign] contains 'Search'
pool_param[gclid] present
```

### Promo number details

Use `media_type` (Promo Number Media Type) and `promo_number_description` to reference details about the promo number that drove the call:

```text theme={null}
media_type contains 'Search' OR media_type = 'Offline: TV'
promo_number_description = 'AdWords 2015 A1'
promo_number_description contains 'facebook'
```

### Account and campaign details

Use `advertiser_name`, `affiliate_name`, and `advertiser_campaign_name` (the campaign name without the advertiser prefix) to reference account-level details:

```text theme={null}
advertiser_name = 'Zulu Servers'
affiliate_name contains 'search'
advertiser_campaign_name contains 'facebook' OR advertiser_campaign_name contains 'social media'
```

### Enhanced caller profile

If enabled on your account, you can reference enhanced caller profile fields: Gender, Age (5-year ranges), Address Type, Household Income, Marital Status, Has Children, Home Owner Status, Home Market Value, Length of Residence, Education, and High Net Worth.

```text theme={null}
gender = "male" AND age > 20 AND age < 50
gender = "female" AND address_type = "residential"
address_type = "business"
```

### Expression operators

| Operator  | Meaning                             |
| :-------- | :---------------------------------- |
| `OR`      | True if either condition is true    |
| `AND`     | True if both conditions are true    |
| `AND NOT` | Inverts the following condition     |
| `( )`     | Groups multiple conditions together |

```text theme={null}
duration >= 5 minutes AND (pool_param[gclid] present OR pool_param[kid] present)
```

### Comparing numbers

| Operator | Meaning                  |
| :------- | :----------------------- |
| `>`      | Greater than             |
| `<`      | Less than                |
| `>=`     | Greater than or equal to |
| `<=`     | Less than or equal to    |
| `=`      | Equal to                 |

### Comparing strings

| Operator   | Meaning                          |
| :--------- | :------------------------------- |
| `=`        | Equal (case-insensitive)         |
| `contains` | Partial match (case-insensitive) |
| `present`  | Exists and isn't blank           |

## Where to go next

* [Signals Overview](/s/article/signals-overview)
* [Keyword Spotting](/s/article/keyword-spotting)
* [Signal Tracking: IVR Keypresses](/s/article/signal-tracking-ivr-keypresses)
* [Expression Syntax Error When Building Out New Signals](/s/article/expression-syntax-error-new-signals)
