# 5 Minute Quick Start

Integrating Rep.ai is a breeze.

1\. Visit <https://app.rep.ai> to grab your API key. If you haven't yet created an account, you'll need to do that first. After you sign-up, you'll see your API key first in the onboarding, and then in [your widget settings at the bottom](https://app.rep.ai/settings/widget?expand=install).

2\. Integrate Rep.ai into your web app with NPM/Yarn or a script tag. Rep.ai runs entirely in the browser.&#x20;

{% tabs %}
{% tab title="Script Tag" %}
Paste the following script **at the very top** of of the `<head>` of your site.

```markup
<script>
  !function(w,d){function e(e,n){w.RepAI.q=w.RepAI.q||[],w.RepAI.q.push([e,n])}if(!w.RepAI){var t=function(n){for(var t=arguments.length,i=new Array(t>1?t-1:0),r=1;r<t;r++)i[r-1]=arguments[r];e(n,i)};["init","identify","dial","alert","bookMeeting","hide","show","expand","collapse","connect","disconnect"].forEach((function(i){t[i]=function(){for(var t=arguments.length,i=new Array(t),r=0;r<t;r++)i[r]=arguments[r];e(n,i)}})),w.RepAI=t}var s=d.createElement("script");s.id="rep-ai-script",s.src="https://cdn.servicebell.com/main.js",s.async=1;var i=d.getElementsByTagName("script")[0];i.parentNode.insertBefore(s,i)}(window,document);
  RepAI("init", "<YOUR_CLIENT_KEY_HERE>", { mode: "iframe-jit" });
</script>
```

{% endtab %}

{% tab title="NPM/Yarn" %}
Install the package via NPM:

```bash
# NPM
npm install --save @repai/widget

# Yarn
yarn add @repai/widget
```

Import `RepAI` and call `RepAI.init()` with your configuration options

```typescript
import RepAI from "@repai/widget";
RepAI("init", "YOUR_CLIENT_KEY_HERE");
```

{% endtab %}
{% endtabs %}


# Controlling the Widget

Use the Javascript API to control widget behaviors

The `RepAI` API exposes a few methods that allow you to control the widget without user interaction. This can be useful for controlling the user experience around users requesting calls, or hooking up the widget to custom UI elements.

### `RepAI("init", api_key, options?)`

You can add options to the `init` call to specify how the widget should render initially.

```javascript
RepAI("init", "<API_KEY>", {
  /**
   * Whether or not to hide the widget initially.
   *
   * Defaults to false.
   */
  hidden: false,

  /**
   * Which side to render the widget on, 'left' or 'right'.
   *
   * Defaults to 'right'.
   */
  position: "right",
  
  /**
   * Whether or not to connect the widget on init, or manually later.
   * If the client has recently connected, they will connect anyway
   * despite this setting to allow for navigation and refreshes.
   *
   * Defaults to true.
   */
  connect: true,
  
  /**
   * Which design to use for the launcher, 'pill' or 'video'. Pill
   * is the small circle design that is used on smaller devices.
   * Video is the larger widget. Even if 'video' is specified,
   * 'pill' will be used on smaller devices.
   *
   * Defaults to 'video'.
   */
  launcher: 'pill',
  
  /**
   * Class name to use as selector for sensitive elements, causes
   * them not to be sent when viewing a visitor's screen. Should not
   * include selector characters like . or #, cannot be an arbitrarily
   * complex selector.
   *
   * Defaults to 'sb-block'.
   */
  blockClass: "sb-block",
  
  /**
   * How the widget initializes itself. It has three possible values.
   *
   * "retrigger" The widget will re-establish its session on each page load. 
   *     This is the default mode.
   *
   * "iframe-jit" The widget loads the page into an iframe
   *     when an agent connects. After that the widget will be continuously 
   *     connected as they navigate the site.
   *
   * Defaults to 'retrigger'
   */
  mode: "retrigger"
})
```

Note that some of these options overlap with the configurations set via your organization's widget appearance settings page. If any of these arguments are provided programmatically, the JS options will take precedence over the appearance settings.

### `RepAI("show")`

```javascript
RepAI("show");
```

Shows the widget if it's hidden. If you want to start the widget hidden and programmatically show later, initialize with `hidden: false`.

### `RepAI("hide")`

```javascript
RepAI("hide");
```

Hides the widget if it's visible.

### `RepAI("expand")`

```javascript
RepAI("expand");
```

Expands the widget if it's visible.

### `RepAI("alert", options?)`

```javascript
RepAI("alert", {
  // Title text to display in the push notification
  title: "My important page",
  // Body message to display in the push notification
  body: "Some helper text",
})
```

Puts the visitor into an alert state, which displays them prominently on the dashboard, and sends all available admins a push notification. You can configure the notification with the optional options object argument. Alerting will cause no visual change for the visitor, it's only for dashboard alerting purposes.

### `RepAI("dial")`

```javascript
RepAI("dial");
```

Puts the visitor into the dialing state, which displays them prominently on the dashboard, sends all available admins a push notification, and displays to the user the dialing state. This is equivalent to the user clicking on the widget to dial. The widget will always be visible when dialing, even if it was hidden.

### `RepAI("bookMeeting")`

```typescript
RepAI("bookMeeting");
```

Immediately opens the widget to the book meeting view that they normally see if the dial timer times out, or if no admins are available. Either shows them an email submission form, or the Calendly widget if [Calendly is configured](/integrations/calendly).

### `RepAI("connect")`

```typescript
RepAI("connect");
```

Triggers the widget to connect to the Rep.ai server if it wasn't already connected. This is only used in conjunction with `{ connect: false }` or `RepAI("disconnect")` as the widget will normally connect by default after calling `RepAI.init()`

### `RepAI("disconnect")`

```typescript
RepAI("disconnect");
```

Triggers the widget to disconnect from the Rep.ai server if it wasn't already disconnected. This should typically be used in conjunction with `RepAI.connect()`.

Note that if your Rep.ai installation initializes with `{ connect: true }` or doesn't specify a connect parameter, the widget will immediately connect on the next page load or refresh unless `RepAI("disconnect")` is called again.

### `RepAI("showPopup", options?)`

```typescript
RepAI("showPopup", {
  /**
  * Whether to display a 'small' popup or a 'large' full screem modal
  *
  * Defaults to 'small'
  */
  size: "small"
});
```

Triggers a small popup to appear above the widget, or a larger modal to take over the screen, to invite visitors to use the Rep.ai widget to start a call. Either of them will only show up if the widget is currently collapsed, and agents are available to take calls. Otherwise there will be no effect.

### `RepAI("startJourney", options)`

```typescript
RepAI("startJourney", {
  /**
  * Journey ID to start the visitor on.
  *
  * The journey must be enabled.
  */
  journeyId: 123
});
```

This asynchronous call will attempt to start the visitor on the journey for the provided ID. If the journey is not found or not active, the api call will not succeed. If the visitor is currently on a different journey, it will be cancelled in favor of the one specified in the `journeyId` option parameter. If the visitor is already on the specified journey, the call will return `true` without restarting the journey.\
\
This function returns a `Promise<boolean>` representing whether the visitor has been (or already is) started on the journey. It will log failures to the browser console.


# Custom Visitor Identities

You can provide custom visitor identity information to the Rep.ai dashboard, which will allow you to deduplicate visitors and give customer support agents information about who they're helping.

### Code Sample

```javascript
RepAI("identify",
  YOUR_UNIQUE_CUSTOM_ID, // String or integer, replace with your own custom unique value
  {
    email: "daniel@rep.ai", // REQUIRED: Required to create or associate a contact with the visitor.
    displayName: "Jessie", // Changes the name of the visitor in the dashboard
    avatar: "https://example.com/avatar.png", // Changes the avatar of the visitor in the dashboard
    tag: "PAID_PLAN", // or "NEW_PLAN" or "TRIAL_PLAN": Adds an icon next to the visitor name in the dashboard
    anyDataYouWant: "hotdogs", // Any other custom data can be added as well
  },
);
```

{% hint style="danger" %}

#### Providing a Unique Custom ID

In order to fully use the `identify` api, you must have a unique custom identifier available in Javascript to attach to the visitor, and use that to replace `YOUR_UNIQUE_CUSTOM_ID` above.

This value is typically a user ID or an email address. Using a static value or a value that can collide with multiple visitors (such as an IP address or a name) can cause loss of data and disconnected sessions.

If you do not have a custom identifier but would still like to set custom properties to view in the dashboard, you can pass `undefined` as the unique identifier. Subsequent visits from this visitor may not have the associated metadata, and their session history will be incomplete.
{% endhint %}

### Custom Metadata

The custom data object can provide customer service agents any other details that may be important to the session. The object has a few implementation notes and limits:

* The `email` key is required. Email addresses are used to create or associate a contact with the visitor. If the `email` key is not present the metadata will be ignored.&#x20;
* Keys must be JSON-serializable values.
* Repeated calls to identify will overwrite previous data, and should be called on every session.
* New keys passed into the custom data object will be added on to previous custom data, so you don't have to pass the whole object every time, and can pass keys that you may not have until later into the visitor's session.
* If you want to remove a key, you must pass `null` for its value. Simply omitting it will keep the previous value.

{% hint style="warning" %}
**Custom Metadata Length Restriction**

Custom Metadata is limited on a per-visitor basis. Each visitor is limited to 1024 bytes  for metadata storage. When adding custom metadata, if the change would cause the stored custom metadata to exceed this limit, the change will not persist and the custom metadata will be left in the state prior to the update being attempted.&#x20;
{% endhint %}

### Secure Identities

For security-conscious customers, we recommend validating user identities on your server before identifying them to Rep.ai. This is done by generating a unique hash of the visitor's identity before sending it to Rep.ai, using a secret key on your server.

You only need to hash the custom user ID, and optionally the email if you're providing one in the custom metadata. Below are examples of how to generate this hash on your server.

{% tabs %}
{% tab title="Python (3+)" %}

```python
import hmac
import hashlib
import json

def generate_repai_identity_hash(user_id: str, email: str) -> str:
  data = {"id": user_id}
  if email:
      data["email"] = email
  return hmac.new(
      bytes(
          os.environ.get("REPAI_IDENTITY_SECRET_KEY"),
          encoding="utf-8",
      ),
      bytes(
          json.dumps(data, separators=(",", ":")),
          encoding="utf-8",
      ),
      digestmod=hashlib.sha256,
  ).hexdigest()
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
import crypto from 'crypto';

function generateRepAIIdentityHash(id, email) {
  const data = { id: id };
  if (email) {
    data.email = email;
  }
  return crypto
    .createHmac('sha256', process.env.REPAI_IDENTITY_SECRET_KEY)
    .update(JSON.stringify(data))
    .digest('hex');
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If you don't see your server's language listed above, you can use any technique to generate an equivalent HMAC SHA256 hash of the data in JSON string form. For example, an ID of "123" and an email of "<email@example.com>" would be a hash of:

`{"id":"123","email":"email@example.com"}`

Make sure the JSON string is in the correct order (id first, email second) and that it has no unnecessary whitespace. Any difference in the JSON string will result in mismatching hashes.
{% endhint %}

You'll take the hash generated from your server and add it as the third argument to the `RepAI("identify")` call, like so.

```javascript
// This assumes you have an API endpoint at /api/repai-identity-hash
// that returns the hash as text, and assumes that you have some kind of
// user object in Javascript that has an id and email. Your implementation may
// look different.

fetch("/api/repai-identity-hash").then(async res => {
  const authHash = await res.text();
  RepAI("identify",
    user.id,
    { email: user.email },
    authHash,
  );
});
```

You can retrieve your secure identity secret key from the [Security Settings page](https://app.rep.ai/settings/security) on the Rep.ai dashboard. Once you've implemented everything above, you can toggle on requiring secure identities. This will cause any identity sent without a valid hash to be rejected.


# Listening to Events

Integrate your application with the Rep.ai widget by listening for and reacting to events

The Rep.ai widget triggers events on the global `window` object in JavaScript that can be listened for and reacted to. Some of these events will get triggered by calls to the Rep.ai JavaScript API, but they can also be triggered by visitor interaction with the widget, or by admins interacting with visitors via the Rep.ai dashboard.

## Conversion Event Tracking Example

A popular use case for the Events API is conversion tracking. the `sb:callstart` event will be fired whenever a call is accepted by a visitor, and you can listen for these events like so:

```javascript
window.addEventListener("sb:callstart", () => {

    gtag('event', 'callstart', {
      'event_category': 'chat',
      'event_label': 'sb:callstart',
    });

});
```

Refer to GA4 documentation to [set up events](https://developers.google.com/analytics/devguides/collection/gtagjs/events), [set up event parameters](https://developers.google.com/analytics/devguides/collection/ga4/event-parameters?client_type=gtag), and [mark events as conversions](https://support.google.com/analytics/answer/13128484?sjid=9040534538290068234-NC).

### Events

<table data-header-hidden><thead><tr><th>Event name</th><th>Description</th></tr></thead><tbody><tr><td>Event name</td><td>Description</td></tr><tr><td><code>sb:initialized</code></td><td>Emits when the widget is fully initialized and ready to be interacted with. </td></tr><tr><td><code>sb:error</code></td><td>Emits if a critical error is encountered during widget initialization. The error is included in <code>event.detail</code>.</td></tr><tr><td><code>sb:expand</code></td><td>Emits on the widget going into its expanded state, either by the visitor clicking on the widget or by calling <code>RepAI.expand()</code>.</td></tr><tr><td><code>sb:collapse</code></td><td>Emits on the widget going into its collapsed state, either by the visitor clicking on the widget or by calling <code>RepAI.collapse()</code>.</td></tr><tr><td><code>sb:callaccept</code></td><td>Emits on the visitor accepting a call that was initiated either proactively or reactively.</td></tr><tr><td><code>sb:callreject</code></td><td>Emits on the visitor rejecting a call that was initiated either proactively or reactively.</td></tr><tr><td><code>sb:dialstart</code></td><td>Emits on the widget requesting assistance, either by the visitor clicking on the dial button or by calling <code>RepAI.dial()</code></td></tr><tr><td><code>sb:dialcancel</code></td><td>Emits on the dial canceling, either by the visitor clicking "Cancel" or the "X" button on the top right of the widget while dialing.</td></tr><tr><td><code>sb:dialmiss</code></td><td>Emits on the widget going into the dial missed state after a period of time elapses after dialing but nobody answered the request for help.</td></tr><tr><td><code>sb:callstart</code></td><td>Emits on an admin starting a call with a visitor. This will emit before the visitor explicitly presses "accept" on the call.</td></tr><tr><td><code>sb:callend</code></td><td>Emits on a call ending, either by the visitor ending it, the admin ending it, or from a network connectivity issue.</td></tr><tr><td><code>sb:availabilitychange</code></td><td><p>Emits on org availability changes. Includes an object with current org states:</p><pre><code>{ 
  detail: {
    isAvailable: boolean; 
    isBusy: boolean;
    isWorkingHours: boolean;
  }
}
</code></pre></td></tr><tr><td><code>sb:agentsavailabilitychange</code></td><td><p>Emits on agents' availability changes. Includes a full list of agents with current availabilities.</p><pre><code>{
  "agents": [
    {
      "avatar": null,
      "available": true,
      "onCall": true,
      "title": "Support",
      "id": 1,
      "name": "Steven"
    },
    {
      "avatar": null,
      "available": false,
      "onCall": true,
      "title": "Support",
      "id": 2,
      "name": "Joe"
    }
  ]
}
</code></pre></td></tr></tbody></table>


# Examples of Custom Behavior

Trigger Rep.ai from buttons

## Custom dial trigger

Rep.ai can be invoked by most HTML elements by adding an `onclick` attribute.

```markup
<button onclick="RepAI('dial')">Need live help?</button>
```

Or you can listen for the `click` event in JavaScript.

```javascript
var button = document.getElementById('my-button');
button.addEventListener("click", function() {
  RepAI("dial");
});
```

## Require permission before initializing

You can take the `RepAI("init")` snippet and call it at any point, including after the user has agreed to a permission (e.g. by clicking "accept" in a modal or banner.) However, **you still must keep the long part of the snippet that looks like `!function...` first**, in order to load the `RepAI` API.

Here's an example using a jQuery dialog, but it would work with any JavaScript framework.

```markup
<div id="dialog-confirm" title="Receive calls?">
  <p><span class="ui-icon ui-icon-alert" style="float:left; margin:12px 12px 20px 0;"></span>
  Would you like to opt-in to receiving calls from our team during your session?</p>
</div>

<script>
  // Inject the RepAI API.
  !function(w,d){function e(e,n){w.RepAI.q=w.RepAI.q||[],w.RepAI.q.push([e,n])}if(!w.RepAI){var t=function(n){for(var t=arguments.length,i=new Array(t>1?t-1:0),r=1;r<t;r++)i[r-1]=arguments[r];e(n,i)};["init","identify","dial","alert","bookMeeting","hide","show","expand","collapse","connect","disconnect"].forEach((function(i){t[i]=function(){for(var t=arguments.length,i=new Array(t),r=0;r<t;r++)i[r]=arguments[r];e(n,i)}})),w.RepAI=t}var s=d.createElement("script");s.id="rep-ai-script",s.src="https://cdn.servicebell.com/main.js",s.async=1;var i=d.getElementsByTagName("script")[0];i.parentNode.insertBefore(s,i)}(window,document);

  // Pop open jQuery dialog to confirm they're OK with being called.
  $(function () {
    $("#dialog-confirm").dialog({
      resizable: false,
      height: "auto",
      width: 400,
      modal: true,
      buttons: {
        Accept: function () {
          RepAI("init", "YOUR_CLIENT_KEY_HERE");
          $(this).dialog("close");
        },
        Decline: function () {
          $(this).dialog("close");
        },
      },
    });
  });
</script>
```

## Handling missed calls

If you want to trigger custom behavior after a visitor tries dialing but nobody answers their request, you can listen to the `sb:dialmiss` event.

Here's an example that directs the visitor to the contact page if they're missed:

```javascript
window.addEventListener("sb:dialmiss", function() {
  window.location.href = "/contact-us";
});
```

## Show expanded widget, hide on collapse

If you want to keep the widget hidden most of the time, but expand it to let the user decide if they want to call or book a meeting (depending on availability) without immediately dialing, you can do that with a combination of `RepAI` methods and events.

```javascript
// Show & expand the widget.
RepAI("show");
RepAI("expand");

// If the visitor closes it after expanding, hide it completely.
window.addEventListener("sb:collapse", () => {
  RepAI("hide");
});
```

## Listen for initialization or error

If Rep.ai is initialized and triggered as a core part of your user flow, you may want to handle the UX of a user encountering an error with widget initialization.

```javascript
// On clicking a button, initialize the widget and dial.
const button = document.getElementById("call-button");
button.addEventListener("click", () => {
  button.disabled = true;
  RepAI("init", "CLIENT_KEY_HERE");
  RepAI("dial");
  
  // Widget initialized correctly.
  window.addEventListener("sb:initialized", () => {
    button.disabled = false;
  });
  
  // Widget encountered a critical error.
  window.addEventListener("sb:error", (ev) => {
    button.disabled = false;
    alert("Failed to start a call! Please contact support.");
    console.log("What happened?!", ev.detail);
  });
});
```


# Security and Spam Prevention

To avoid malicious use of your organization's Rep.ai widget, and to prevent your team from wasting time on spam callers, there are a few options that you can configure on the settings [Security page](http://app.rep.ai/settings/security).

### Domain Allow List

Add a list of all the domains you plan to use the Rep.ai widget on. Any attempts to load the widget on other web pages will be blocked, and you'll never see those clients in the dashboard. Domains are subdomain specific, so connections from `app.mycompany.com` will be rejected if your allow list only contains `mycompany.com`. The allow list currently does not support wildcarding.

#### Development domains

While you can manually specify your development domains along side your public domains, we also include a toggle to allow connections from most common development domains without having to exhaust your available domains. These include:

* All `localhost` ports
* Any IP address (e.g. `http://127.0.0.1`)
* Any `.local` domain


# Virtual Backgrounds

Rep.ai offers virtual backgrounds for Chromium-based browsers (Google Chrome, Chromium, Brave, Microsoft Edge, Opera).&#x20;

If you use a different browser, you can utilize virtual webcam software to get the same result. We recommend you use any of the following:

| Software                                   | Windows Support | macOS Support                | Linux Support |
| ------------------------------------------ | --------------- | ---------------------------- | ------------- |
| [ChromaCam](https://www.chromacam.me/)     | ✅ All browsers  | ✅ All browsers except Safari | ❌             |
| [XSplit VCam](https://www.xsplit.com/vcam) | ✅ All browsers  | ✅ All browsers except Safari | ❌             |

Once you start a call, click on the overflow menu below the call button and select which camera to use. This will be saved as the default for future calls.

![](/files/-MbcBjXc1MXzaWUBjxhR)

If you don't see your virtual camera in the device list, confirm the app is running and restart your browser. Safari does not support virtual cameras either.


# How to Identify Contacts who Click Through Emails to Your Site from Email Sequencers

With the right setup, Rep.ai can identify contacts (name, company, email) who click through email campaigns.

Email clickthrough identification at contact-level relies on a unique link query parameters per email recipient. Below is a set of steps to configure your Rep.ai instance to recognize individuals by their email.

1. Add this code to your site in addition to the installation code you already installed:&#x20;

```javascript
<script>
  function runAfterDomLoaded(callback) {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', callback);
    } else {
      callback();
    }
  }

  function decodeQueryParam(param) {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");
      if (pair[0] === param) {
        return pair[1] ? atob(pair[1]) : null;
      }
    }
    return null;
  }

  function onDomReady() {
    var email = decodeQueryParam("sbec");
    var firstName = decodeQueryParam("sbfn");
    var lastName = decodeQueryParam("sbln");
    var companyName = decodeQueryParam("sbcn");
    
    var displayName = [firstName, lastName].filter(function(item) {
      return !!item;
    }).join(" ") || email;

    if (email) {
      // Set up identification object with mandatory email and any other available information
      var identifyObj = { email: email, displayName: displayName };
      if (companyName) identifyObj.company = companyName;

      // Identify the user with the provided details
      RepAI("identify", email, identifyObj);

      // Create an alert title
      var alertTitle = 'Email-click through from ' + displayName;
      
      // Initiate alert with included details
      var alertBody = "";
      if (displayName !== email) alertBody += "Name: " + displayName + " ";
      if (companyName) alertBody += "Company: " + companyName;

      RepAI("alert", { title: alertTitle, body: alertBody.trim() });
    } else if (!email) {
      console.log("Mandatory query parameter 'sbec' (email) not found.");
    }
  }

  runAfterDomLoaded(onDomReady);
</script>
```

1. Build a reference table of email and base64-encoded query parameters attached to the clickthrough URL. This can be done in a Google Sheet, but is easiest to automate in Clay, especially if you use a sequencer that integrates with Clay.
   1. The one column you *must* encode is the email as “sbec”
   2. You can optionally encode firstname as “sbfn”, lastname as “sbln”, and company name as “sbcn”
   3. Example query string:[https://rep.ai?sbec=ZXZhbkBzZXJ2aWNlYmVsbC5jb20=\&sbfn=RXZhbg==\&sbln=RHVubg==\&sbcn=U2VydmljZUJlbGw=](https://servicebell.com?sbec=ZXZhbkBzZXJ2aWNlYmVsbC5jb20=\&sbfn=RXZhbg==\&sbln=RHVubg==\&sbcn=U2VydmljZUJlbGw=)
   4. See this sheet for reference: <https://docs.google.com/spreadsheets/d/19Ngik_bhK-OdBjrv618RevMR_XKUlwsIP0kZ43JYH7Q/edit?usp=sharing>
2. Integrate the table from Clay or Sheets into your campaign, so that the hyperlinked text includes the encoded data.
3. Rep.ai will pick up the clickthrough and display alerts and contact information accordingly.

For reference, below is the Python code to encode an email. You can build this as a column in Clay.

```python
import base64

# String to encode
data = "evan@rep.ai"

# Encode the string to bytes
encoded_bytes = base64.b64encode(data.encode('utf-8'))

# Convert bytes to string
encoded_string = encoded_bytes.decode('utf-8')

print(encoded_string)
```


# Browser Compatibility

Rep.ai uses some of the latest technology available in browsers to support 2 way video calling and the screen takeover feature. The table below outlines which of the most common browsers are supported:

| Browser           | Supported |
| ----------------- | --------- |
| Chrome            | ✅ Yes     |
| Firefox           | ✅ Yes     |
| Safari            | ✅ Yes     |
| Microsoft Edge    | ✅ Yes     |
| Internet Explorer | ❌ No      |
| iOS Safari        | ✅ Yes     |
| Android Chrome    | ✅ Yes     |
| Android Firefox   | ✅ Yes     |

Only recent versions are considered, users on significantly older versions of their browsers may experience issues.

### Users with Incompatible Browsers

Users whose browsers don't support Rep.ai will see the widget, but with a message letting them know that they'll need to update their browser to speak to an agent.


# Notifications

Make sure you're being alerted right when your visitors are ready to talk

If you're not receiving notifications from your browser when visitors are dialing or alerting, make sure that they're enabled and your system is allowing them.

### Enabling Notifications in Rep.ai

You can enable notifications from the [Notifications Settings page](https://app.rep.ai/settings/notifications) in the dashboard, by clicking "Enable Push Notifications." Your browser will ask you for permission to send you notifications. Once you allow it, you'll be sent you a confirmation notification. It should look like this:

{% tabs %}
{% tab title="Chromium on macOS" %}
![Chromium includes Chrome, Edge, Brave, and Opera browsers](/files/-M_7e-goHfRmCTbY90Rj)
{% endtab %}

{% tab title="Chromium on Windows" %}
![Chromium includes Chrome, Edge, Brave, and Opera browsers](/files/-M_7eUhG_QAh8mEke0cx)
{% endtab %}

{% tab title="Firefox on macOS" %}
![](/files/-M_7g5qddVecBLbHn1G1)
{% endtab %}

{% tab title="Firefox on Windows" %}
![](/files/-M_7gCFwSWsxFxdoYksa)
{% endtab %}
{% endtabs %}

If you don't get a test notification after enabling them, make sure your operating system allows notifications from your browser with the steps below:

### Enabling Notifications in your Operating System

If you're still not seeing notifications after enabling them, it's likely that your system is not allowing the browser to display notifications. Select your operating system below for instructions on how to enable them:

{% tabs %}
{% tab title="macOS" %}

1. Search for "Notifications" in spotlight, or open "Notifications" from "System Preferences"
2. Find your browser in the list of applications
3. Ensure that "Allow Notifications" is toggled on, and that the style is either "Banners" or "Alerts"

![](/files/-M_7dTTbxpAysvMR08Dd)
{% endtab %}

{% tab title="Windows" %}

1. Search for "Notifications" in your start menu, or go to "Settings" and open "Notifications & actions"
2. Ensure that "Get notifications from apps and other senders" is enabled
3. Scroll down to "Get notifications from these senders" and ensure your browser has their notifications enabled.
4. Click on your browser, and confirm that "Show notification banners" is enabled.
   1. Firefox won't appear in this list, it does not use system-level notifications on Windows

![](/files/-M_7d7OYGrtTdLhLCvI9)

![](/files/-M_7dAizaMyimIMykcGw)
{% endtab %}
{% endtabs %}

### Browser Compatibility

The following browsers support push notifications:

| Browser           | Supports Push Notifications                                   |
| ----------------- | ------------------------------------------------------------- |
| Chrome            | ✅ Yes                                                         |
| Firefox           | ✅ Yes                                                         |
| Safari            | ❌ No                                                          |
| Microsoft Edge    | ✅ Yes                                                         |
| Brave             | [⚠️](https://emojipedia.org/warning/) Requires configuration¹ |
| Internet Explorer | ❌ No                                                          |
| iOS Safari        | ❌ No                                                          |
| Android Chrome    | ✅ Yes                                                         |
| Android Firefox   | ✅ Yes                                                         |

1. Go to brave://settings/privacy and enable "Use Google services for push messaging". Must restart browser for setting to take effect.


# Content-Security-Policy (CSP)

Content-Security-Policy (CSP) is a browser feature that limits what origins (i.e. domains) your page can interact with. When you configure a security policy on your website, the browser will reject any connections that don't fit the policy. If you're using the `<script>` tag to inject Rep.ai into your site, it's likely you may not have added the Rep.ai domains to your policy.

To use Rep.ai with a CSP, add the following directives **only** if you've already specified them for your other resources:

| **Directive** | **Value**                                                                                                                                                                                           |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `connect-src` | <p><code>https\://*.servicebell.com</code></p><p><code>wss\://*.servicebell.com</code></p><p><code>https\://*.rep.ai</code></p><p><code>wss\://*.rep.ai</code></p><p><code>\*.twilio.com</code></p> |
| `script-src`  | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p><p><code>https\://\*.calendly.com</code></p>                                                                        |
| `worker-src`  | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p>                                                                                                                    |
| `style-src`   | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p>                                                                                                                    |
| `img-src`     | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p>                                                                                                                    |
| `media-src`   | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p><p><code>mediastream:</code></p>                                                                                    |
| `font-src`    | <p><code>https\://*.servicebell.com</code><br><code>https\://*.rep.ai</code></p>                                                                                                                    |
| `webrtc`      | `'allow'`                                                                                                                                                                                           |


# Firewalls and VPNs

Add Rep.ai domains and ports to your organization's network security to ensure you can connect with visitors.

For organizations that secure their networks with firewalls or use VPNs, you may need to add exceptions for the domains and ports Rep.ai uses to communicate over our API, and to set up peer-to-peer connections with your website's visitors. Rep.ai uses [WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) to establish peer-to-peer connections with visitors.

{% hint style="info" %}
Note that these configurations are just suggestions. Every organizations network and device policies will be different, and you may only need some of these configurations, or completely different ones depending on how your network or device browser security is configured.
{% endhint %}

### Domains

| Domain                                                         | Description                        |
| -------------------------------------------------------------- | ---------------------------------- |
| <p><code>*.rep.ai</code><br><code>*.servicebell.com</code></p> | UI dashboard & API for Rep.ai.     |
| `*.stun.twilio.com`                                            | STUN server for WebRTC connections |
| `*.turn.twilio.com`                                            | TURN server for WebRTC connections |

### Ports

<table><thead><tr><th width="176.0182544209926">Port</th><th width="184.33333333333331">Traffic</th><th>Description</th></tr></thead><tbody><tr><td><code>443</code></td><td>External TCP</td><td>HTTPS traffic to Rep.ai</td></tr><tr><td><code>3478-3479</code></td><td>External TCP / UDP</td><td>WebRTC communications to STUN and TURN servers</td></tr><tr><td><code>20000-65535</code></td><td>Local UDP</td><td>WebRTC communications on local network</td></tr></tbody></table>


# Support

If you are still having issues after reviewing the troubleshooting documentation please reach out to our support team.

### Contacting Support

Contacting support is as simple as using the Rep.ai widget on the [homepage](https://rep.ai/) or [in-app](https://app.rep.ai/).

![](/files/SjRz02MlMcYp4ssPRdFg)![](/files/SNOUgAq8haPs0t1MKA9C)

### Hours & Response Times

Support members are available 9am - 5pm EST Monday - Friday.

You can expect to hear back about any inquiries within 1 business day.


# Scheduler

Full setup guide coming soon.

### Note: Using Rep.ai Scheduler with Outlook or Teams

There is a setting within Microsoft Outlook that must be turned *off* or it will add a duplicate online meeting link to each calendar event created by Rep.ai Scheduler.

Disabling this setting allows you to set your preferred meeting location/provider (Zoom, Teams, Meet, etc) in Rep.ai Scheduler per event type.

If you do not turn this setting off, you will likely have both your Rep.ai Scheduler option and a Microsoft Teams/Skype meeting link in each meeting created through the Rep.ai Scheduler.

In Outlook, go to Settings > Calendar > Events and invitations

Uncheck the box next to "Add online meeting to all events"

<figure><img src="/files/2X5ZiajkudaiK2CLLMiV" alt=""><figcaption><p>Screenshot of setting to un-check in Microsoft Office 365</p></figcaption></figure>

<figure><img src="/files/7B3UT1RnZZPnp8YGzwyf" alt=""><figcaption><p>Screenshot of setting to un-check in Microsoft Outlook</p></figcaption></figure>

### Embed Scheduler

You can embed the Rep.ai Scheduler on your website by using `iFrames`.

Here's an example of how you can add Rep.ai Scheduler to your site.

```
<iframe src="https://rep.ai/daniel" width="500px" height="500px"></iframe>
```


# Acuity

Rep.ai integration with Acuity allows visitors to book a meeting on your calendar if no one is available to take their call.&#x20;

### Authorizing Rep.ai with Acuity

To give Rep.ai access to your Acuity account, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Acuity card, and click the toggle to enable it. You'll be redirected to Acuity to authorize access.

![](/files/hty6uZCugCw1C10FGLRp)


# Calendly

Convert missed opportunities into meetings with Calendly

Rep.ai integration with Calendly allows visitors to book a meeting on your calendar if no one is available to take their call. This replaces Rep.ai default functionality of sending your organization an email with the visitor's email.

### Authorizing Rep.ai with Calendly

To give Rep.ai access to your Calendly account, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Calendly card, and click the toggle to enable it. You'll be redirected to Calendly to authorize access.

Rep.ai organizations can only be linked to a single Calendly account, so if you want to have meetings be booked for multiple members, you'll need [Calendly team account](https://calendly.com/pages/teams).

![](/files/GiHKFOjd2Oc8yYwTeKd3) ![](/files/Hgli0uCG511WrcfzrnlD)

### Accessing all of your Calendly events

Rep.ai will be able to retrieve all of the event types you have access to on your Calendly account dashboard. If you do not see an event on Rep.ai, please make sure you can see the event on your Calendly account dashboard.&#x20;

**Note:** A Calendly team admin will have access to all of a team's events, however a Calendly user (non-admin) will only have access to events which their personal user has been added to. In the example below, I will only have access to the 6 event types available on my dashboard

![](/files/wLOnFqO4E75xnTnyIpQB).


# Chili Piper

Rep.ai integration with Chili Piper allows visitors to book a meeting on your calendar if no one is available to take their call.

### Adding a Book Meeting link

To use your Chili Piper meetings, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Chili Piper card, and click the toggle to enable it. Add your desired [booking link](https://apps.chilipiper.com/meetings/booking-links) and you're done!

![](/files/unH6JzyktPwqZYBweglH) ![](/files/1lj469GUuVPd2bm53iyt)


# Clearbit

Reveal your most valuable customers to qualify who you should be talking to

Rep.ai integration with Clearbit allows you to leverage [Clearbit's Reveal API](https://clearbit.com/reveal) to provide agents with information about a visitor before making contact.

### Installing the Clearbit Integration

Rep.ai has partnered with Clearbit to provide all Rep.ai organizations free access to try Clearbit Reveal. Go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Clearbit card, and click the toggle to start. Select which of your organization members' emails, and which of your domains you'd like to associate the Clearbit account with. We'll take care of the rest and provision you an account.

![](/files/V7jbW9bJ1hpQzkjorvGs) ![](/files/1pRrD5MOevoPxS9RjnZ5)

### Revealing Visitors

From the Visitor screen, you'll now see a "Clearbit Reveal" section below the other visitor details. Simply hit the button, and you'll see a breakdown of what company your visitor is associated with.

![](/files/-Mdc7K_k0xTs_WExq2pb)

### Usage Limits

Clearbit accounts provisioned through Rep.ai are limited to 50 reveals to try the feature out. If you're interested in upgrading your Clearbit plan, [reach out to our team](mailto:help@rep.ai) and we'll get you set up.


# Google Calendar

Keep your Rep.ai availability up to date by integrating with Google Calendar

Rep.ai's integration with Google Calendar automatically sets your Rep.ai availability based on Google Calendar meetings. Having all your agents activate will prevent your team from ever missing a call because agents are in another meeting.

### Installing the Google Calendar Integration

To give Rep.ai access to your Google Calendar, go to the [user Integrations page](https://app.rep.ai/settings/user-integrations) in your Rep.ai settings, find the Google Calendar card, and click the toggle to enable it. You'll be redirected to Google to authorize access.

![](/files/TQDLIXNLzK1nemPwhLSw)![](/files/G4fUtIe8OksMqBgZe1c9)


# HubSpot

See information from and create HubSpot contacts right from the Rep.ai dashboard

Rep.ai integration with HubSpot allows admins to quickly view important information about HubSpot contacts from the dashboard, or create new contacts from visitors within the dashboard.

### Installing the HubSpot Integration

To link your HubSpot contacts to Rep.ai visitors, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the HubSpot card, and click the toggle to enable it. You'll be redirected to HubSpot to authorize the integration.

![](/files/mk8zsUwOhd6L2Dk6lrEP) ![](/files/J3gwMKy9RQnLgzaB3GTh)

### Linking Rep.ai visitors to existing HubSpot contacts

Providing Rep.ai with the email address of the visitor will link it to any HubSpot contacts with the same email. You can provide the widget with their email using the [Custom User Identities](/custom-user-identities) feature. If a match is found, you'll see information about the contact and a link to HubSpot in the sidebar.

![](/files/-M_bM-DBi5Bqjc4i5jzh)

### HubSpot Form Submissions

If you're using HubSpot forms to capture visitor information, Rep.ai will automatically pick up form submissions and call `RepAI.identify` with the email and name they provided in the form. Note that this only works with HubSpot's form embeds, not with their Non-HubSpot Forms setting or custom HubSpot form submission calls.

### Creating new HubSpot contacts

If you either don't have visitor email addresses available on your site, or would like to create HubSpot contacts right from the dashboard, you can click the "Create new contact" button and fill out the form. This will attach the email you enter to the visitor. If you want to add additional fields to the contact, you'll be able to access the contact in the HubSpot dashboard as soon as you submit the form.

{% hint style="warning" %}
Note that if you are using [Custom User Identities](/custom-user-identities) and providing `RepAI.identify` with a different email address than the one you create a HubSpot contact with, it will be overridden the next time `RepAI.identify` is called.
{% endhint %}

### HubSpot Contact, Company, Deal Syncing

When the HubSpot integration is activated, all contacts, companies and deals will immediately begin syncing down from HubSpot to Rep.ai. This means you can begin building segments and automations (Journeys, Alerts, etc.) in Rep.ai based off of your HubSpot data. Rep.ai will sync default HubSpot properties that correlate with the Rep.ai object properties. You can view the synced data in the [Contacts](https://app.rep.ai/contacts/hubspot) tab of the Rep.ai dashboard.

Any changes made to Rep.ai objects will be synced back up to HubSpot. For example if you were to configure a Journey that gathered phone numbers for contacts, that data will propagate in HubSpot as well.

#### Default HubSpot <-> Rep.ai Property Mapping

Contact

| HubSpot        | Rep.ai          |
| -------------- | --------------- |
| email          | email           |
| phone          | phone           |
| firstname      | first\_name     |
| lastname       | last\_name      |
| lifecyclestage | pipeline\_stage |

Company

| HubSpot                      | Rep.ai                         |
| ---------------------------- | ------------------------------ |
| name                         | name                           |
| description                  | description                    |
| domain                       | domain                         |
| annualrevenue                | revenue                        |
| industry                     | industry                       |
| hs\_is\_target\_account      | target\_account                |
| hs\_ideal\_customer\_profile | ideal\_customer\_profile\_tier |
| numberofemployees            | size\_estimate\_low            |
| numberofemployees            | size\_estimate\_high           |
| city                         | location                       |
| state                        | location                       |
| zip                          | location                       |
| country                      | country                        |

Deal

| HubSpot      | Rep.ai      |
| ------------ | ----------- |
| amount       | amount      |
| closedate    | close\_date |
| dealname     | name        |
| dealstage    | stage       |
| dealtype     | type        |
| hs\_priority | priority    |

#### Rep.ai Attribution

Contacts can be added to HubSpot in several ways. For example when a lead is gathered through a Journey or a visitor is manually identified during a call. There are two HubSpot properties that are created when the integration is activated that track these interactions. These properties can be leveraged to create custom dashboard in HubSpot to track how Rep.ai is affecting your sales pipeline.

Attribution Properties:

* `servicebell_created` - True if a contact was created by Rep.ai
* `servicebell_influenced` - True if the contact has interacted with the Rep.ai widget in any way.

#### Syncing Custom Properties to HubSpot

In addition to the default mapping above you can map any custom Rep.ai property to any HubSpot property. The only condition is that the data types match (cannot map a number property to a string property for example).&#x20;

Instructions:

1. Verify the property exists in HubSpot.
2. Go to the [Properties Page](https://app.rep.ai/settings/properties) in Rep.ai.
3. Click "+ Add Property". A modal will appear where you can configure the custom Rep.ai property and map it to the HubSpot property.

<figure><img src="/files/mAKZE7E3cVN55sJUeclf" alt="" width="375"><figcaption></figcaption></figure>

### HubSpot Call Syncing

Whenever a Rep.ai call is made with a visitor that has been identified and exists in HubSpot, the call is logged in HubSpot. The logged calls will appear in the Contact's activity feed in HubSpot. The outcome of the call is noted and contains a link to the recording, if it exists.

<figure><img src="/files/Ms2zlAiZRN5tIznM3rl6" alt=""><figcaption></figcaption></figure>

In the event that a known visitor requests a Rep.ai call and no one picks up, a call task will be created in HubSpot. These tasks will be seen in the overall list of tasks for the HubSpot organization as well as in the activity feed for the Contact.

<figure><img src="/files/1zQZaU4LnnxJm4ef0DNh" alt=""><figcaption></figcaption></figure>

### HubSpot Chat Transcripts

After completing a chat session with a visitor the transcript will be added to the HubSpot contact's activity feed.

<figure><img src="/files/LQPd2U59OLFcanU9x5ON" alt=""><figcaption></figcaption></figure>

## Hubspot influence properties syncing

Rep.ai integrates with HubSpot to synchronize various influence-related properties. These properties capture interactions that a visitor has had with the website or with Rep.ai. The synchronization is fully automated and does not require manual configuration. All properties are automatically created upon connecting HubSpot and Rep.ai. The process ensures that the properties are transmitted to HubSpot within 30 minutes after the visitor finishes their browsing session. The properties collected and transmitted to HubSpot include the following:

<table><thead><tr><th>Property Name</th><th width="208">Object Types</th><th>Description</th></tr></thead><tbody><tr><td>ServiceBell Engagement Status</td><td>Contact, Company</td><td>Interactions the Contact has had with the website or Rep.ai. Possible options include: Detected, Chat, Video Chat, Audio Chat, User Viewed Session, Inbound Call, Outbound Call, Journey Presented, Journey Engaged, Form Filled, Meeting Booked</td></tr><tr><td>ServiceBell Web URLs Visited</td><td>Contact, Company</td><td>A raw capture of all URLs visited by the Contact, including query strings.</td></tr><tr><td>ServiceBell High-Intent URLs Visited</td><td>Contact, Company</td><td>Names of the high-intent urls visited by the Contact based on a list of high-value pages maintained in Rep.ai.</td></tr><tr><td>ServiceBell First Detected</td><td>Contact, Company</td><td>This field reflects the first date the Contact was detected on the website.</td></tr><tr><td>ServiceBell Last Detected</td><td>Contact, Company</td><td>This field reflects the last date the Contact was detected on the website.</td></tr><tr><td>ServiceBell First Engaged</td><td>Contact, Company</td><td>This field reflects the first date the Contact was engaged on the website through Rep.ai.</td></tr><tr><td>ServiceBell Last Engaged</td><td>Contact, Company</td><td>This field reflects the last date the Contact was engaged on the website through Rep.ai.</td></tr><tr><td>ServiceBell Utm Source</td><td>Contact, Company</td><td>Last detected UTM Campaign .</td></tr><tr><td>ServiceBell Utm Medium</td><td>Contact, Company</td><td>Last detected UTM Medium .</td></tr><tr><td>ServiceBell Utm Campaign</td><td>Contact, Company</td><td>Last detected UTM Campaign .</td></tr><tr><td>ServiceBell Utm Term</td><td>Contact, Company</td><td>Last detected UTM Term .</td></tr><tr><td>ServiceBell Utm Content</td><td>Contact, Company</td><td>Last detected UTM Content .</td></tr><tr><td>ServiceBell Number of unique visitors</td><td>Company</td><td>This is the total number of unique website visitors from the account visiting the site, detected by Rep.ai.</td></tr></tbody></table>


# Intercom

Start video calls and get easy access to the Rep.ai dashboard from Intercom

Rep.ai integration with Intercom allows you to continue using Intercom as your initial point of contact with customers, but leverage Rep.ai's video call and screen viewing and takeover features as needed.

### Installing the Intercom App

To add Rep.ai to your Intercom workspace, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Intercom card, and click the toggle to enable it. You'll be redirected to Intercom to authorize the application. That's it!

![](/files/qOdp9rICT3xZDvM1YPXY) ![](/files/k9ZlBQfYeZpI4CfSiXE7)

### Widget Positioning and Visibility

Rep.ai's widget works nicely with the Intercom widget and avoids occupying the same space. Rep.ai will position the widget in the opposite corner of Intercom to avoid overlap. If you only want users to interact with Rep.ai after having talked to someone via Intercom, you can hide the widget by default so that it will only show when a user has an active call.

### Adding Rep.ai to the Intercom Conversation Details

To get a convenient link to the Rep.ai dashboard for your visitors so that you can quickly observe their screen and prompt a call, click the "Customize" button at the top right of the conversation page, click the "Show more" button, and select Rep.ai from the list.

![](/files/-MVSx6qE_9nLgrN3VH_5)

Once it's added, you'll see a button to go to the dashboard whenever you're talking to a visitor who has connected to the Rep.ai widget.

![](/files/-MVSxHh-C9N9Yq0WvCtF)

Note that some visitors may not have this link if the widget could not connect the visitor to Rep.ai. This could happen due to conditional or delayed loading of the widget, ad blocking extensions preventing the script from loading, or a misconfiguration of the script.

### Sending a Rep.ai Video Call Invitation

When you're at a point in a conversation where you'd like to start a video call with a visitor, click the Rep.ai icon at the bottom of the your Intercom chat text input, and send the embedded message. If the icon is missing, you may need to click the "Add an App" button and select Rep.ai from the list.

The visitor will then see the button on their end, and if they click it, it will start ringing the Rep.ai dashboard. You'll need to answer their call in the Rep.ai dashboard. Adding the Intercom Conversation Details sidebar widget will make it easier to get to the Rep.ai dashboard quickly.

![](/files/-MVSyefoXWl6XSYsRxbQ)

### Adding Rep.ai to the Intercom Home Screen

To add a button to the home screen of Intercom that prompts a Rep.ai call, go to the "Messenger" tab in your Intercom workspace and click "Add apps to your Messenger." When you click "Add an App", Rep.ai should be in the list of applications.

![](/files/-MVSz1UiQjr9HF5rzUjw)


# Outreach

See information from and create Outreach prospects right from the Rep.ai dashboard

The Rep.ai integration with Outreach allows admins to quickly view important information about Outreach prospects from the dashboard.

### Installing the Outreach Integration

To link your Outreach prospects to Rep.ai visitors, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Outreach card, and click the toggle to enable it. You'll be redirected to Outreach to authorize the integration. The user connecting the integration must be an Admin in Outreach, otherwise certain features will not work correctly.

<figure><img src="/files/xmUgYYEX7I21UhliJ3qW" alt=""><figcaption></figcaption></figure>

Once you've successfully authorized the application, visit [this link](https://marketplace.outreach.io/apps/servicebell?store=unlisted) and install the Rep.ai application from the Outreach marketplace. This step is crucial in order to be able to identify users arriving on your website from Outreach sequences and e-mails.

### Linking Rep.ai visitors to existing Outreach prospects

Providing Rep.ai with the email address of the visitor will link it to any Outreach prospects with the same email. You can provide the widget with their email using the [Custom User Identities](/custom-user-identities) feature.

### Outreach Prospect and Account Syncing

When the Outreach integration is activated, all prospects and accounts will immediately begin syncing down from Outreach to Rep.ai. This means you can begin building segments and automations (Journeys, Alerts, etc.) in Rep.ai based off of your Outreach data. Rep.ai will sync default Outerach properties that correlate with the Rep.ai object properties.

#### Default Outreach <-> Rep.ai Property Mapping

Prospect

| Outreach             | Rep.ai      |
| -------------------- | ----------- |
| email                | email       |
| mobilePhones (first) | phone       |
| firstName            | first\_name |
| lastName             | last\_name  |

Account

| Outreach          | Rep.ai               |
| ----------------- | -------------------- |
| domain            | domain               |
| industry          | industry             |
| locality          | location             |
| name              | name                 |
| numberOfEmployees | size\_estimate\_high |

#### Syncing Custom Properties from Outreach

In addition to the default mappings above you can map any custom Rep.ai property to any Outreach property. The only condition is that the data types match (cannot map a number property to a string property for example).&#x20;

Instructions:

1. Verify the property exists in Outreach.
2. Go to the Outreach Integration Settings page in Rep.ai.
3. Click "+ Add Property". A modal will appear where you can configure the custom Rep.ai property and map it to the Outreach property.

#### Triggering automations based on Outreach prospect visits

When one of your prospects lands on a page that has the Rep.ai widget installed from an Outreach Sequence e-mail, Rep.ai can identify the user and trigger automations based on the Sequence or Sequence Step they arrived from. To segment incoming users by Outreach Sequence, create a new segment and select the Outreach Sequence or step you would like to target:

<figure><img src="/files/GIQPOyglmRvsVne8cgrZ" alt=""><figcaption></figcaption></figure>

You can then use that segment in an alert, a journey, or a routing rule to perform an action whenever prospects from that sequence land on your page.


# Salesforce

Integrate Rep.ai with the #1 CRM platform.

Rep.ai integration with Salesforce allows admins to quickly view important information about Salesforce contacts from the dashboard, or create new contacts from visitors within the dashboard.

### Installing the Salesforce Integration

To link your Salesforce contacts to Rep.ai visitors, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Salesforce card, and click the toggle to enable it. You'll be redirected to Salesforce to authorize the integration. The integration requires a Salesforce edition with the Web Services API feature. For more information view the [Salesforce comparison page](https://www.salesforce.com/products/sales-cloud/pricing/). The connecting account must have admin access to the Salesforce instance.

![](/files/8KzBPXy0k5ssEbz0mU6U) ![](/files/w1MZBYI5SJEY78G1LcQr)

### Syncing data between Salesforce and Rep.ai

Once connected, all Salesforce Leads, Contacts, Accounts and Opportunities will be synced to your Rep.ai account. As objects change between the two systems, they will automatically be kept in sync in the background, after a short delay.

Data from Salesforce Leads and Contacts whose email matches contacts in Rep.ai will sync into that contact. When a Rep.ai Contact is associated with both a Salesforce Lead and a Salesforce Contact, changes to that contact will be synced up to both the Lead and the Contact. When a new Rep.ai Contact is created (eg. via an agent asking a visitor for their e-mail address) for which there is no equivalent Lead or Contact in Salesforce, a new Lead (but not a Contact) will be created in Salesforce.

### Linking Rep.ai visitors to existing Salesforce contacts

Providing Rep.ai with the email address of the visitor will link it to any Salesforce contacts with the same email. You can provide the widget with their email using the [Custom User Identities](/custom-user-identities) feature. If a match is found, you'll see information about the contact and a link to Salesforce in the sidebar.

![](/files/CvYUucCnVqTxcdzWhmWn)

### Creating new Salesforce contacts

If you either don't have visitor email addresses available on your site, or would like to create Salesforce contacts right from the dashboard, you can click the "Create new contact" button while viewing an active visitor. As soon as you submit the form you will be able to use the link to immediately access Salesforce and add additional information.

### Salesforce Call Sync

When a Rep.ai call is completed a call is logged in Salesforce as a "Call" type task. If the call was recorded a link to the recording will be included.

<figure><img src="/files/bSlTfJM2OpLL17FCFq1Y" alt=""><figcaption></figcaption></figure>

## Salesforce influence properties syncing

Rep.ai integrates with Salesforce to synchronize various influence-related properties. These properties capture interactions that a visitor has had with the website or with Rep.ai. The synchronization is fully automated and does not require manual configuration. All properties are automatically created upon connecting Salesforce and Rep.ai. The process ensures that the properties are transmitted to Salesforce within 30 minutes after the visitor finishes their browsing session. The properties collected and transmitted to Salesforce include the following:

<table><thead><tr><th>Property Name</th><th width="208">Object Types</th><th>Description</th></tr></thead><tbody><tr><td>ServiceBell Engagement Status</td><td>Contact, Account</td><td>Interactions the Contact has had with the website or Rep.ai. Possible options include: Detected, Chat, Video Chat, Audio Chat, User Viewed Session, Inbound Call, Outbound Call, Journey Presented, Journey Engaged, Form Filled, Meeting Booked</td></tr><tr><td>ServiceBell Web URLs Visited</td><td>Contact, Account</td><td>A raw capture of all URLs visited by the Contact, including query strings.</td></tr><tr><td>ServiceBell High-Intent URLs Visited</td><td>Contact, Account</td><td>Names of the high-intent urls visited by the Contact based on a list of high-value pages maintained in Rep.ai.</td></tr><tr><td>ServiceBell First Detected</td><td>Contact, Account</td><td>This field reflects the first date the Contact was detected on the website.</td></tr><tr><td>ServiceBell Last Detected</td><td>Contact, Account</td><td>This field reflects the last date the Contact was detected on the website.</td></tr><tr><td>ServiceBell First Engaged</td><td>Contact, Account</td><td>This field reflects the first date the Contact was engaged on the website through Rep.ai.</td></tr><tr><td>ServiceBell Last Engaged</td><td>Contact, Account</td><td>This field reflects the last date the Contact was engaged on the website through Rep.ai.</td></tr><tr><td>ServiceBell Utm Source</td><td>Contact, Account</td><td>Last detected UTM Campaign .</td></tr><tr><td>ServiceBell Utm Medium</td><td>Contact, Account</td><td>Last detected UTM Medium .</td></tr><tr><td>ServiceBell Utm Campaign</td><td>Contact, Account</td><td>Last detected UTM Campaign .</td></tr><tr><td>ServiceBell Utm Term</td><td>Contact, Account</td><td>Last detected UTM Term .</td></tr><tr><td>ServiceBell Utm Content</td><td>Contact, Account</td><td>Last detected UTM Content .</td></tr><tr><td>ServiceBell Number of unique visitors</td><td>Company</td><td>This is the total number of unique website visitors from the account visiting the site, detected by Rep.ai.</td></tr></tbody></table>

### Dialer Support

Once you've integrated Salesforce in your Rep.ai account, you can immediately start using it with the dialer. The dialer will sync all your Salesforce reports and you can use synced reports to call prospects. To create a new report:

1. **Log into Salesforce.**
2. **Navigate to Reports.**
3. **Choose a Report Type.** The report must include contacts or leads and must contain at least an e-mail address or a phone number for each contact or lead row.
4. **Add any filters you like.**
5. **Save the report.**&#x20;
6. **Sync with** Rep.a&#x69;**.** Once created, the report will sync with Rep.ai within about 15 minutes. Once synced, you'll be able to find the report in Rep.ai under the name you chose in step 5.

To remove prospects from reports once they've been called:

1. **Log into Salesforce.**
2. **Create a new "Record-Triggered" Flow.**
3. **Choose "Task" as the Object.**
4. **Pick "A record is created or updated" as the trigger.**
5. **Choose "Any Condition Is Met (OR)" as the Condition Requirements.**
6. **Choose the "CallDisposition" field and set the operator to "Does Not Equal" and the value to "{!$GlobalConstant.EmptyString}".**
7. **In the Flow editor, click the plus button.**
8. **Pick "Update Records".**
9. **Give the Flow node a label name.**
10. **Select "Lead" or "Contact" in the "Object" field, depending on what kinds of reports you make.**
11. **Select "Id" for the field, "Equals" for the Operator and `{!$Record__Prior.WhoId}` for the value.**
12. **In the "Set Field Values for the Contact Records" section, select "Contact\_Status\_\_c" (or "Lead\_Status\_\_c" if using Leads), and set the value to whatever the lead status is that you want the contact to switch to after the call is logged.**
13. **Save your flow and activate it.**
14. **Update your reports to filter out any leads or contacts that are in the state you selected in step 12.**


# Shopify

Rep.ai can integrate with Shopify to allow you to engage visitors on your website.

To install Rep.ai on Shopify, you can use the instructions found on our [5 Minute Quick Start](https://docs.rep.ai/).

If you're interested in identifying logged in visitors on your Shopify site, you can use our [Identify API](/custom-user-identities).

You'll want to be sure to properly format the `RepAI.identify()` call to conform to Liquid syntax per the below example.

```javascript
if ("{{ customer.email }}") {
  RepAI("identify", "{{ customer.email | downcase }}", {
    displayName: "{{ customer.name }}",
    email: "{{ customer.email | downcase }}"
  })
}
```


# Slack

Get Slack messages in any channel for various user events

Rep.ai integration with Slack creates a bot that will post messages whenever a user interacts with the Rep.ai widget, or [triggers a custom alert](https://docs.getservicebell.com/controlling-the-widget#servicebell-alert-options). Messages will include quick links to view the visitor's session or start a call, and will update when sessions are joined or missed.

### Installing the Slack App

To add Rep.ai bot to your Slack channel, go to the [Integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Slack card, and click the toggle to enable it. You'll be redirected to Intercom to authorize the application and select which channel to have it post in.

![](/files/wlbaZVGRNEsbTtu3RDCa) ![](/files/x057Z4lIQOk991bHNCdk)

### Configuring the Slack App

You can change which channel the bot posts in, and which events will cause it to post by clicking the "Configure" button in the Integrations section after installing it.

![](/files/sISUsjMH8rJktwg0f24F) ![](/files/53DnQUa1rg3sop9fcM7s)

### Bot Messages

When a user dials or triggers an alert, a message will be posted with action buttons for immediately joining their session.

![](/files/-MbcFKHggE7PZxukQfud)

Once an admin joins the session, the buttons will be replaced with a note saying who joined.

![](/files/-MbcFTr8B1LmNS-NSUjx)

### Permissions

![](/files/LsflXYe0Nmjf2MIiMhVt)


# Microsoft Teams

Receive Rep.ai notifications in any Teams channel and create a Microsoft Teams meetings.

## Organization integration

Rep.ai integration with Teams will post messages to channels you specify each time a visitor requests help, triggers an alert, or books a meeting. Messages will include quick links to view the visitor's session or start a call.

### Setting Up Incoming Webhooks

Rep.ai uses the webhooks to send messages to a Teams channel. You will first need to set up Workflows for each channel you want to receive notifications in. There are 4 types of notifications (dials, alerts, meetings, chats) and you can set a separate channel for each, or use the same channel for all of them. If you want to set up advanced rule-based message routing, check the [Notification Routing](#notification-routing) section below.

1. **Navigate to the Channel:** Choose the channel where you want to add the incoming webhook and select 'More Options' (⋯) from the top-right corner of the screen.
2. **Select 'Workflows':** In the drop-down menu, select 'Workflows'.
3. **Choose the right Workflow:** Scroll through the list of workflows until you find 'Post to a channel when a webhook request is received', and click it.
4. **Name Your Workflow:** Enter a name for the workflow, you could use "Rep.ai" for clarity.
5. **Create the Workflow:** Click 'Next' and 'Add workflow' on the consecutive page.
6. **Finish Setup:** Copy the Workflow URL and click 'Done'.

For more detailed instructions, refer to the comprehensive guide provided by Microsoft at [Create incoming webhooks with Workflows for Microsoft Teams](https://support.microsoft.com/en-us/office/create-incoming-webhooks-with-workflows-for-microsoft-teams-8ae491c7-0394-4861-ba59-055e33f75498).

### Installing the Teams Integration

Go to the [integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Teams card, and click the toggle to enable it. You will be prompted to input the Workflow URLs for each notification type. You may use the same Workflow URL for multiple notifications. For example, if you wanted all notifications to go to the same channel you would paste in the same Workflow url for all four.

<figure><img src="/files/PDJju2NU8yZUJZLfYyl4" alt=""><figcaption><p>Open the Microsoft Teams integration settings on Rep.ai integration page</p></figcaption></figure>

<figure><img src="/files/ak7flTFtnl67qf9aUlFT" alt=""><figcaption><p>Paste a URL copied from the <strong>Incoming Webhook</strong></p></figcaption></figure>

### Notification Routing

Rep.ai allows you to set up rule-based notification routing by creating a Routing Rule automation. With the Routing Rule, you can define a set of conditions that are checked against every visitor on your website. If the conditions are met, the notification is routed to the users and channels you have specified.

<figure><img src="/files/DvkbITXN4BXzwqwN0jlI" alt=""><figcaption></figcaption></figure>

## Hosted Events

Rep.ai's integration with Microsoft Teams adds the ability to create events hosted using Microsoft Teams in the Scheduler. Events will automatically create a Microsoft Teams meeting linked to the event and email out the required information to join the event.

**Make sure your MS365 license covers Microsoft Teams.** Otherwise, it won't be possible to properly integrate Microsft Teams and Rep.ai's Scheduler.

### Installing the Microsoft Teams Integration

To activate the Rep.ai Microsoft Teams integration, go to the [user Integrations page](https://app.rep.ai/settings/user-integrations) in your Rep.ai settings, find the Microsoft Teams card, and click the toggle to enable it. You'll be redirected to authorize access.

<figure><img src="/files/RuDCKkGP7WwdUItuovSW" alt=""><figcaption><p>Enable Microsoft Teams integration</p></figcaption></figure>

<figure><img src="/files/1idVGnvP4p5DmFnxHVOJ" alt=""><figcaption><p>Authorize access</p></figcaption></figure>

### Adding a Microsoft Teams Event Type to your Scheduler

1. Go to the [Add Event Types](https://app.rep.ai/scheduling/event-types/add) page in the scheduling tool.
2. Click the "Location" drop-down menu and select "Microsoft Teams"

<figure><img src="/files/DUcwckmMwcnzZySvXCCj" alt=""><figcaption><p>Choose "Microsoft Teams" as the location of the meeting</p></figcaption></figure>

3. Fill out the rest of the fields for your new meeting type and save it.
4. All the meetings scheduled with this event type will now be hosted using Microsoft Teams.


# Zapier

Use Zapier to integrate Rep.ai with over 3,000 web apps

[Zapier](https://zapier.com/) moves information between your web apps automatically, so you can share data and create workflows without code. Through Zapier there are more than 3,000 apps available that can be integrated with Rep.ai including Microsoft Teams, SalesForce, Google Docs and more.

When you build a Zap (or workflow), you'll choose one of the Rep.ai triggers that provides data and pass it to one of your other applications. For example you could post a message in Microsoft Teams every time someone requests help on your site.

This feature is available to all customers.

## Set Up

### Get started with Zapier

The first step is getting logged into a Zapier and adding the Rep.ai integration to your account.&#x20;

1. If you already have a Zapier account go ahead and log in. If not, go to the Zapier [sign-up page](https://zapier.com/sign-up/) and follow the instructions to create an account and log in.

### Create an API Key

Zapier needs an API key to communicate with Rep.ai and get information. You can think of this as a special password Zapier uses to access Rep.ai and get information for your organization.

1. Go to the Rep.ai [API key creation page](https://app.servicebell.com/settings/api-keys). You must be an admin in order to access this page, if not please contact your Rep.ai admin.
2. Enter a name in the  "Create new API key" form. Choose a descriptive name so you'll remember what the key is used for. We suggest simply calling it "Zapier". Then click "Save"

![](/files/8Q5amzbaXd17xIDKvg8I)

3\. A message will appear with your API key. Leave this page open or store your API key in a secure place to be used later. You cannot retrieve API keys again after they have been created.

![](/files/RgVkAdl9HULFMYMZ5t2d)

### Connect Zapier to Rep.ai

The final step is to create a Rep.ai connection in Zapier using your API key.

1. Log in to your [Zapier account](https://zapier.com/sign-up).&#x20;
2. Navigate to "My Apps" from the top menu bar.&#x20;
3. Click on "Add connection" and search for "ServiceBell"
4. Select "ServiceBell" from the list.
5. Retrieve the API key you created in the previous step. Paste your API key in the form in the new window. Click the "Yes, Continue" button.&#x20;

![](/files/O5f6y5cxRJUeKPNF9ly0)

Success! You have an active connection to Rep.ai in Zapier and you can start creating Zaps. More information on what is possible with Zapier can be found on their [site](https://zapier.com/explore). You can also find instructions on creating your first Zap on the Zapier [help page](https://zapier.com/learn/zapier-quick-start-guide/).


# Zendesk

View support tickets associated with site visitors and help them immediately, face-to-face.

Rep.ai integration with Zendesk allows you to access tickets directly from the Rep.ai dashboard and initiate video calls immediately. While on a Rep.ai video call your Zendesk talk status will automatically be set to "away" so you'll never miss a Zendesk support call.

### Installing the Zendesk Integration

Go to the [integrations page](https://app.rep.ai/settings/integrations) in your Rep.ai settings, find the Zendesk card, and click the toggle to enable it. You will be prompted to provide your Zendesk URL, copy any URL while logged into your Zendesk account. Lastly, you will be redirected to Zendesk to authorize Rep.ai.

![](/files/7qgh85JgmaAuAXNJxmlL)

![](/files/75q4Gh3jGAYu9cFmzLIq)

![](/files/DNMtLDzvTFESNnpDEScM)

### Viewing Zendesk tickets associated with a visitor

A Zendesk button will be present in the sidebar when viewing visitor sessions in Rep.ai. If the visitor has an associated email address a link to that person's Zendesk tickets will be available.

![](/files/W6o3Uh19IKCzhmimgIGI)

### Zendesk Talk availability syncing

To prevent agents from missing Zendesk Talk calls the Rep.ai integration automatically sets  Talk status to "away" while on a Rep.ai video call. This feature requires the Rep.ai and Zendesk accounts use the same email address.


# Zoom

Add the ability for anyone to schedule Zoom meeting with your agents directly from Rep.ai.

Rep.ai's integration with Zoom adds the ability to create Zoom type events in the Scheduling tool. Zoom type events will automatically create a Zoom meeting linked to the event and email out the required information to join the event.

### Installing the Zoom Integration

To activate the Rep.ai Zoom integration, go to the [user Integrations page](https://app.rep.ai/settings/user-integrations) in your Rep.ai settings, find the Zoom card, and click the toggle to enable it. You'll be redirected to Zoom to authorize access.

![](/files/ZUXiBfYr028uYAOVKRHQ)![](/files/aoy2G2LpzqxWlv79O9rh)

### Removing the Zoom Integration

To disable the Zoom integration simply go to the [user Integrations page](https://app.rep.ai/settings/user-integrations) where you installed the integration and click the toggle. This will disable the integration.

If you want to completely remove the app from your Zoom account do the following:

1. Login to your Zoom Account and navigate to the Zoom App Marketplace.
2. Click **Manage** >> **Added Apps** or search for the "Rep.ai" app.
3. Click the "Rep.ai" app.
4. Click **Remove**.

### Adding a Zoom Meeting Event Type to your Scheduler

The Rep.ai scheduling tool gives each agent their own homepage where anyone can schedule time to talk. Enabling the Zoom integration allows you to create meeting types in the Scheduling tool that automatically create Zoom meetings.&#x20;

1. Go to the [Add Event Types](https://app.servicebell.com/scheduling/event-types/add) page in the scheduling tool.
2. Click the "Location" drop-down menu and select "Zoom".

   <figure><img src="/files/OeEo4L4ZZnNi2clOhHmJ" alt=""><figcaption></figcaption></figure>
3. Fill out the rest of the fields in the form and click "Save".

   <figure><img src="/files/fnaDKIuC0L5JPTeLnbG8" alt=""><figcaption></figcaption></figure>

Your Scheduling homepage will now have a meeting type available where anyone can schedule a Zoom meeting with you.

![](/files/LkBHdGArbepPsm3Kbo98)


# Outlook Calendar

Keep your Rep.ai availability up to date by integrating with Google Calendar

Rep.ai integration with Outlook Calendar automatically sets your Rep.ai availability based on Outlook Calendar meetings. Having all your agents activate will prevent your team from ever missing a call because agents are in another meeting.

{% hint style="warning" %}
Only events from your default Outlook calendar get synced into Rep.ai.
{% endhint %}

## Installing the Outlook Calendar Integration

To give Rep.ai access to your Outlook Calendar, go to the [user Integrations page](https://app.rep.ai/settings/user-integrations) in your Rep.ai settings, find the Outlook Calendar card, and click the Manage button. You'll be redirected to Outlook's to authorize access.

<figure><img src="/files/IPXL37hQHZ01Pp1ALeOw" alt=""><figcaption><p>User integrations page</p></figcaption></figure>

\
For the Rep.ai Outlook Calendar integration to function correctly, it must be granted access to the Microsoft Graph with the following permissions: `Calendars.ReadWrite` and `User.Read`. Please ask your Microsoft Outlook administrator to follow these steps to whitelist the Rep.ai Outlook app:

## Whitelisting Rep.ai app in Azure Conditional Access

1. **Identify the Application ID**: The Rep.ai Outlook integration app has the ID `dc61d5cb-8275-42f1-b339-2f67f059add1`.
2. **Access Conditional Access in Azure AD**:
   * Go to the Azure portal ([portal.azure.com](https://portal.azure.com/)).
   * Navigate to **Azure Active Directory** > **Security** > **Conditional Access**.
3. **Create or Edit a Conditional Access Policy**:
   * To create a new policy, click on **+ New policy**.
   * To edit an existing policy, select the policy from the list.
4. **Configure the Policy to Exclude the App**:
   * In the **Assignments** section, under **Users and groups**, select the users, groups, or roles this policy will apply to. While you can apply the policy to all users, you may choose to exclude certain users or groups if necessary.
   * Under **Cloud apps or actions**, select **Include** to choose which apps the policy applies to. You have the option to apply the policy to **All cloud apps** or select specific apps.
   * To whitelist (exclude) the Rep.ai Outlook app, switch to the **Exclude** tab within the **Cloud apps or actions** section. Click on **Select excluded apps** and then search for and select the Rep.ai app using its Application ID. This configuration instructs Azure AD to apply the policy to all selected apps except the ones you've excluded, effectively whitelisting the Rep.ai app.


# Salesloft

## Overview

Org admins can connect their Rep.ai organization with Salesloft via OAuth to begin syncing contacts and accounts from Salesloft to Rep.ai. Salesloft call tasks and cadences can also be used as a dial list in the Rep.ai dialer, with the ability to log call dispositions back to Salesloft.

## Shared Data

The integration allows the user to connect Salesloft via OAuth from their Rep.ai account. Once connected, we create a mapping between Salesloft and Rep.ai accounts, then sync accounts and people from Salesloft to Rep.ai using an initial sequential sync via the API and then we keep the data in sync going forward using webhooks. The Rep.ai user can then use the Rep.ai dialer to call prospects in a cadence either one-at-a-time or using the parallel dialing feature.<br>

<figure><img src="/files/uPZqQelq6AyPDMXxyTdk" alt=""><figcaption></figcaption></figure>

## OAuth Connection

Rep.ai uses OAuth to connect to your Salesloft account. Currently, connection requires the following scopes:

* Accounts: Manage
* Accounts: Read
* Activities: Read
* Activities: Write
* Admin: Read
* Audit Reports: Manage
* Audit Reports: Read
* Audit Reports: Write
* Cadences: Delete
* Cadences: Manage
* Cadences: Read
* Calls: Manage
* Calls: Read
* Crm: Read
* Dialer Recordings: Read
* Emails: Read
* Emails: Write
* External Id: Manage
* External Id: Read
* External Id Configuration: Manage
* External Id Configuration: Read
* Groups: Write
* Notes: Delete
* Notes: Read
* Notes: Write
* Notifications: Write
* People: Delete
* People: Read
* People: Write
* Signal Registrations: Manage
* Signal Registrations: Read
* Signals: Write
* Tasks: Read
* Tasks: Write
* Workflow: Delete
* Workflow: Read
* Workflow: Write

## Salesloft configuration

Salesloft requires specific configuration to function properly with Rep.ai. In particular, neither Dispositions nor Sentiments should be set as required fields when submitting a call record. You can review and modify your configuration settings via the appropriate [Salesloft dashboard section.](https://app.salesloft.com/app/settings/disposition_sentiment/dispositions)

## FAQ

* **Q: Does Rep.ai overwrite any Salesloft?**\
  A: No, the Rep.ai integration with Salesloft only syncs data down from Salesloft.
* **Does the Rep.ai dialer support parallel dialing?**\
  Yes, Rep.ai supports dialing up to nine numbers at a time.

## How Sync Works

Once connected, Rep.ai will perform an initial sync from Salesloft. The following items are pulled from Salesloft and associated with records in Rep.ai, creating new records in Rep.ai as needed:

* Salesloft People -> Rep.ai Contact
* Salesloft Account -> Rep.ai Account

Rep.ai also maintains associations between Salesloft users and Rep.ai users in your org where possible.

Additionally, webhooks are registered for all of the above items, allowing Rep.ai to be notified of any changes or new data in your Salesloft account and sync from Salesloft to Rep.ai as needed.

## Dialer Integration

Once connected, Salesloft call tasks and cadences will be available for use as dial lists in the Rep.ai dialer. These items aren't stored in Rep.ai, but are read from Salesloft when you start a new dialer session. When using a dial list from Salesloft, calls are logged back to Salesloft using Salesloft call dispositions.


# Gong

## Overview

Org admins can connect their Rep.ai organization with Gong via OAuth to begin syncing recordings from cold calls made via Rep.ai's AI parallel dialer. When enabled, Rep.ai will push recordings from made within its dialer to Gong.

This integration does not support Gong Engage (sequencing), or syncing recordings from Gong to Rep.ai.<br>

## FAQ

* **Q: Does Rep.ai overwrite any data in Gong?**\
  A: No, the Rep.ai integration with Gong only syncs new recordings into Gong.&#x20;
* **Q: Does this integration bring any data from Gong into Rep.ai**\
  A: No, the Rep.ai integration with Gong only pushes recordings into Gong, not vice versa.


# Introduction

Utilize Rep.ai public API to automate common requests!

Rep.ai offers a limited REST API for our customers to use in order to help automate certain actions. All responses from the API will return JSON-encoded responses and use standard HTTP response codes.

The root URL for all API requests is `https://api.rep.ai`

Get started with the API by [requesting an API Key](/api/authentication#get-an-api-key).

{% code title="Request" %}

```bash
# List all users of my Organization
curl https://api.rep.ai/public/api/v1/org/team \
-H "Accept: application/json" \
-H "X-Api-Key: BGFEUUEr.YmGIxL9maFhPtapAQW9RK5RX1MX3SjLRKaJJJ_96yVg"
```

{% endcode %}

{% code title="Response" %}

```json
[
  {
    "avatar":{
      "imageUrl":"https://uploads.servicebell.com/avatars/1663717201.cacecb44dce34a17aab93534f1c25fe6.png"
    },
    "displayName":"Zach Schipono",
    "emailAddress":"schipono@servicebell.com",
    "emailVerified":true,
    "id":7926718459,
    "onCall":true,
    "orgRoles":[
      "ADMIN"
    ],
    "title":"Developer"
  }
]
```

{% endcode %}


# Authentication

Get an API Key for your Organization

API Keys are used to authenticate with the API. All requests to the Rep.ai API must be authenticated by including an HTTP header with your API Key.&#x20;

* API Keys are tied specifically to your Organization.
* Multiple API Keys can be created for different uses.
* API Keys can be deactivated when no longer needed.
* API Keys are irretrievable, so when one is issued, please keep it safe!

## Get an API Key

To request an API Key, send an email to <sales@rep.ai> specifying the Organization you're requesting an API Key for.&#x20;

## Using your API Key

All requests must include the `X-Api-Key` HTTP Header, set to the value of your API Key.

&#x20;

{% code title="Example API KEY Usage" %}

```bash
# List all users of my Organization
curl https://api.rep.ai/public/api/v1/org/team \
-H "Accept: application/json" \
-H "X-Api-Key: BGFEUUEr.YmGIxL9maFhPtapAQW9RK5RX1MX3SjLRKaJJJ_96yVg"
```

{% endcode %}


# Scrub Visitor Data

To satisfy GDRP, CCPA and similar requests

You can remove personally identifiable information (PII) for any website visitors that you have identified to Rep.ai using our [Identification API](/custom-user-identities).

For detailed information on the endpoints used, refer to the [Organization Resource](/api-resources/organization) page.&#x20;

{% tabs %}
{% tab title="Example Script" %}
This script assumes Python3 and that the Python [`requests`](https://docs.python-requests.org/en/latest/) library has been installed.&#x20;

{% code title="scrub\_visitors.py" %}

```python
import requests


# Setup re-usable values
# Note: The API Key value here is a fake example, storing 
#       in code is not recommended
base_url = "https://api.rep.ai"
headers = {
    "X-Api-Key": "vMLmfTyh.uN4C-cBme8iBfHqmMSkOwdlH_gdFipxglxEdOS7pKSU",
    "Content-Type": "application/json"
}


# Get the Organization ID tied to your API Key
response = requests.get(f"{base_url}/public/api/v1/org", 
                        headers=headers)
assert response.ok

# Save the Organization ID from the response
org_id = response.json()["id"]


# Setup the Visitors we'd like to search/scrub
# Can be customId's or email addresses
visitors = ["766554", "julie@gmail.com"]

# POST request to redact the information for those two visitors
# Note: Takes a JSON body with a list of the visitor identities
url = f"{base_url}/public/api/v1/org/{org_id}/visitorscrub"
response = requests.post(url, json={"identities": visitors},
                         headers=headers)
assert response.ok

# Response body example:
# [{'customId': None,
#   'customMetadata': {'displayName': 'REDACTED'},
#   'id': '747a2bd8-d1aa-4736-beb5-1ebe142439f0',
#   'orgId': 1222456005},
#  {'customId': None,
#   'customMetadata': {'displayName': 'REDACTED'},
#   'id': 'b81085e2-ae40-4303-9050-9c38784c7454',
#   'orgId': 1222456005}]
```

{% endcode %}
{% endtab %}
{% endtabs %}


# Nightly Data Dumps

Raw data for custom in-house analysis

For Enterprise customers, Rep.ai offers nightly data dumps of all visitor activity we logged for that day. Data will be uploaded to your storage provider of choice with a consistent format and naming scheme so that you can automate integrating the data into your own custom tooling.

Contact our sales team at <hello@rep.ai> to get your organization set up with data dumps.

### Example Data

```javascript
{
  "version": "1.0.0",
  "start_time": 1632787200000,
  "end_time": 1632873600000,
  "users": {
    "1495955663": {
      "id": "1495955663",
      "email_address": "will@rep.ai",
      "display_name": "Will O'Beirne",
      "title": "Sales Representative",
      "active": true
    }
  },
  "unique_visitors": {
    "e63fbcf8-6be1-4f5b-bd1c-023db6afc4fb": {
      "id": "e63fbcf8-6be1-4f5b-bd1c-023db6afc4fb",
      "custom_id": "83493423",
      "custom_metadata": {
        "display_name": "Visitor Name",
        "email": "email@email.com",
        "any_other_custom_key": 123
      }
    }
  },
  "unique_visitor_sessions": {
    "00a631ba-ccba-4994-a52f-0d6c2bb69608": {
      "id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "session_group": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "unique_visitor_id": "e63fbcf8-6be1-4f5b-bd1c-023db6afc4fb",
      "referrer": "http://google.com/",
      "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15",
      "start_time": 1632937435000,
      "end_time": 1632937477000
    }
  },
  "unique_visitor_session_actions": [
    {
      "id": "2147483409",
      "action": "REQUESTED_HELP",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "timestamp": 1632937436000
    },
    {
      "id": "1058988876",
      "action": "ALERT",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "timestamp": 1632937437000
    },
    {
      "id": "2085049932",
      "action": "PAGE_VISIT",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "timestamp": 1632937438000,
      "data": {
        "url": "https://website.com",
        "url_title": "Test Website - Homepage"
      }
    },
    {
      "id": "1256524328",
      "action": "FEEDBACK",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "timestamp": 1632937439000,
      "data": {
        "stars": 5
      }
    }
  ],
  "unique_visitor_session_interactions": [
    {
      "id": "1056417425",
      "kind": "SPYING",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "user_id": "1495955663",
      "start_time": 1632937436000,
      "last_seen": 1632937436000,
      "accepted": true,
      "accept_time": 1632937439000
    },
    {
      "id": "77869321",
      "kind": "VIDEO",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "user_id": "1495955663",
      "start_time": 1632937437000,
      "last_seen": 1632937457000,
      "accepted": true,
      "accept_time": 1632937438000
    },
    {
      "id": "325040803",
      "kind": "TAKEOVER",
      "session_id": "00a631ba-ccba-4994-a52f-0d6c2bb69608",
      "user_id": "1495955663",
      "start_time": 1632937436000,
      "last_seen": 1632937436000,
      "accepted": false
    }
  ]
}

```

### Additional Notes

#### Semantic versioning

Data dumps provide a version number that you can use to determine if your processor is able to handle the data. We use semantic versioning, with the following justifications:

* Patch - Fixes to issues in our reporting. The schema did not change in any meaningful way, but issues that were present in past exports may have been fixed.
* Minor - New keys or types of entries were added that provide more information, but the data is fully backwards compatible.
* Major - Meaningful and potentially breaking changes have happened in the structure of the schema.

#### Treat IDs as Strings

Despite some IDs being numeric, they should all be treated as strings as we may update their format in the future, and any numeric operations may break as a result.

#### Sessions & Session Groups

Sessions are single socket connections to the Rep.ai widget. Any full page load or disruption in the socket connection (e.g. going offline, being load balanced to a different server) will start a new session.

Session groups are collections of sessions that happened close together. Session groups are identified by using the ID of the earliest occurring session in the group, for instance sessions `"A"` and `"B"` that happened in close succession would both have `session_group: "A"`.

#### Midnight Cutoff

Sessions that span the gap of the midnight cutoff may be in two days worth of dumps. A session that was ongoing at midnight will have an unset `end_time`.&#x20;

#### Interaction Acceptance

All `unique_visitor_session_interaction`s have an accept and accept\_time field, even if there is no UX flow for "accepting" the interaction (e.g. answering a proactive call, allowing a takeover.) This is to allow for granular permissions and compatibility with all UX flows in case we change what a user can or cannot accept in the future.

Interactions that have no acceptance UX will always be `accept: true` with an `accept_time` that matches `start_time`.

#### New Actions & Interactions

New types of `unique_visitor_session_action` and `unique_visitor_session_interaction` will be added in the future as Rep.ai provides more ways to interact with visitors. These will result in minor version bumps, but should be backwards compatible if you filter or ignore unknown actions and interactions out.


# Organization

## Retrieve the data for your Organization

<mark style="color:blue;">`GET`</mark> `https://api.rep.ai/public/api/v1/org`

{% tabs %}
{% tab title="200: OK " %}

```json
{
  "allowRecording":true,
  "autoRecording":false,
  "clientKey":"7a87199a22634140a0d8a8aa4359081c",
  "enableDevDomains":false,
  "enableRecaptcha":false,
  "hippaMode":"None",
  "id":1527322543,
  "isWorkingHours":true,
  "name":"Service Bell",
  "status":"ACTIVE",
  "timezone":"US/Central"
}
```

{% endtab %}
{% endtabs %}

## Retrieve the listing of Users in your Organization

<mark style="color:blue;">`GET`</mark> `https://api.rep.ai/public/api/v1/org/team`

{% tabs %}
{% tab title="200: OK List of Users" %}

```json
[
  {
    "avatar":{
      "imageUrl":"https://uploads.servicebell.com/avatars/1663717201.cacecb44dce34a17aab93534f1c25fe6.png"
    },
    "displayName":"Zach Schipono",
    "emailAddress":"schipono@servicebell.com",
    "emailVerified":true,
    "id":7926718459,
    "onCall":true,
    "orgRoles":[
      "ADMIN"
    ],
    "title":"Developer"
  },
  ...
]
```

{% endtab %}
{% endtabs %}

## Scrub the Visitor records for users matching the given IDs & emails

<mark style="color:green;">`POST`</mark> `https://api.rep.ai/public/api/v1/org/<ID>/visitorscrub`

#### Request Body

| Name                                         | Type       | Description                         |
| -------------------------------------------- | ---------- | ----------------------------------- |
| identities<mark style="color:red;">\*</mark> | List\<str> | List of customId and email strings. |

{% tabs %}
{% tab title="200: OK " %}

```json
[
  {
    "customId":"None",
    "customMetadata":{
      "displayName":"REDACTED"
    },
    "id":"747a2bd8-d1aa-4736-beb5-1ebe142439f0",
    "orgId":1222456005
  },
  {
    "customId":"None",
    "customMetadata":{
      "displayName":"REDACTED"
    },
    "id":"b81085e2-ae40-4303-9050-9c38784c7454",
    "orgId":1222456005
  }
]j
```

{% endtab %}
{% endtabs %}


# Spotlight

## Retrieve accounts from an account list

<mark style="color:blue;">`GET`</mark> `https://api.rep.ai/public/api/v1/spotlight/account_lists/<ID>/accounts`

{% tabs %}
{% tab title="200: OK " %}

```json
{'accounts': [{'domain': 'lincolnlawyer.com',
               'firstVisitDate': None,
               'id': 1,
               'industry': 'law',
               'intent': 'cold',
               'intentScore': None,
               'intentScoreHistory': {},
               'intentScoreTrend': 0.0,
               'lastVisitDate': None,
               'location': 'Los Angeles, CA',
               'name': 'Haller & Asscoiates',
               'ownerId': None,
               'revenue': 1000000,
               'segments': [],
               'sizeEstimateHigh': 10,
               'sizeEstimateLow': 1,
               'trend': 'neutral'}],
 'total': 1}
```

{% endtab %}
{% endtabs %}

## Retrieve contacts from a contact list

<mark style="color:blue;">`GET`</mark> `https://api.rep.ai/public/api/v1/spotlight/contact_lists/<ID>/contacts`

{% tabs %}
{% tab title="200: OK " %}

```json
{'contacts': [{'alert': None,
               'associatedServices': [],
               'company': {'country': None,
                           'customMetadata': {'county': 'LA'},
                           'description': None,
                           'domain': 'lincolnlawyer.com',
                           'firstVisitDate': None,
                           'id': 1,
                           'idealCustomerProfileTier': None,
                           'industry': 'law',
                           'lastVisitDate': None,
                           'location': 'Los Angeles, CA',
                           'name': 'Haller & Asscoiates',
                           'revenue': 1000000,
                           'sizeEstimateHigh': 10,
                           'sizeEstimateLow': 1,
                           'source': 'journey',
                           'syncHubspot': True,
                           'syncSalesforce': True,
                           'targetAccount': False,
                           'utmCampaign': None,
                           'utmContent': None,
                           'utmMedium': None,
                           'utmSource': None,
                           'utmTerm': None},
               'customMetadata': {'defense': True},
               'dateCreated': '2025-09-26T12:33:37.386305',
               'email': 'mickey@lincoln.com',
               'firstName': 'Mickey',
               'id': 1,
               'lastName': 'Haller',
               'name': 'Mickey Haller',
               'originalVisitorId': None,
               'otherPhoneNumbers': [{'label': 'Other Phone Number',
                                      'number': '+16264295426'}],
               'phone': '+16264295426',
               'phoneNumbers': [{'countryCode': 1,
                                 'doNotCall': False,
                                 'isValid': True,
                                 'kind': 'OTHER',
                                 'label': 'Other Phone Number',
                                 'nationalNumber': '(626) 429-5426',
                                 'number': '+16264295426',
                                 'regionCode': 'US',
                                 'type': 'FIXED_LINE_OR_MOBILE'}],
               'pipeline': None,
               'pipelineStage': None,
               'segments': [],
               'source': 'journey',
               'syncHubspot': True,
               'syncSalesforce': True,
               'timezone': None,
               'title': None,
               'updateVisitorData': True,
               'utmCampaign': None,
               'utmContent': None,
               'utmMedium': None,
               'utmSource': None,
               'utmTerm': None}],
 'total': 1}   
```

{% endtab %}
{% endtabs %}


# Performance

Rep.ai can be loaded asynchronously in order to improve page speed performance.\ <br>

{% hint style="info" %}
You can always grab your CLIENT\_KEY from the [Widget Install directions](https://app.rep.ai/settings/widget?expand=install) in your Organization's Widget Settings page.
{% endhint %}

```
var scriptsLoaded = false;

var loadScripts = function () {
  if (scriptsLoaded) { return }
  scriptsLoaded = true;
  !function(w,d){function e(e,n){w.RepAI.q=w.RepAI.q||[],w.RepAI.q.push([e,n])}if(!w.RepAI){var i=function(n){for(var i=arguments.length,r=new Array(i>1?i-1:0),c=1;c<i;c++)r[c-1]=arguments[c];e(n,r)};["init","identify","dial","alert","bookMeeting","hide","show","expand","collapse","connect","disconnect"].forEach((function(r){i[r]=function(){for(var i=arguments.length,r=new Array(i),c=0;c<i;c++)r[c]=arguments[c];e(n,r)}})),w.RepAI=i}var s=d.createElement("script");s.id="service-bell-script",s.src="https://cdn.rep.ai/main.js",s.async=1;var r=d.getElementsByTagName("script")[0];r.parentNode.insertBefore(s,r)}(window,document);
  RepAI("init", "<YOUR_CLIENT_KEY_HERE>", { mode: "iframe-jit" });
}

setTimeout(function () {
  loadScripts()
}, 7000);
window.addEventListener('scroll', function () {
  loadScripts()
}, {once: true});
```

&#x20;


# Overview

In this section you'll find experimental features in various states of completion and stability. We'd love for you to use these and provide feedback.&#x20;

#### Warning

There are no guarantees as to the stability or longevity of these features. They may experience downtime, bugs or stop being supported at any time. Experimental features should not be relied upon for mission-critical processes.


# Zendesk App

Instructions on how to install, set up and use the Rep.ai Zendesk app.

## Overview

The Rep.ai Zendesk is a native Zendesk application that allows you to view visitors actions on your site directly from Zendesk. When viewing a visitor's session you can annotate the screen, takeover their mouse and keyboard and request a full screen share.

<figure><img src="/files/BKIiP0GXIpXBy3nJdBN1" alt=""><figcaption></figcaption></figure>

## Install

### Prerequisites

* Administrator access to Zendesk
* Zendesk widget installed on your website.
* Ability to add/update script tags and on your website.&#x20;
* Mechanism for identifying visitors on your website and assigning them an id or email address.

### Install the app in your Zendesk instance.

1. Download the Rep.ai Zendesk App zip file from [here](https://servicebell-zendesk-app.s3.amazonaws.com/servicebell-zendesk-app-20220922-1.zip)
2. Follow the instructions [here](https://developer.zendesk.com/documentation/apps/getting-started/uploading-and-installing-a-private-app/#uploading-and-installing-a-private-app-in-zendesk) to install the application in your Zendesk instance.

### Install and configure Rep.ai widget.

1. Follow the [Quickstart Instructions](/) to install the Rep.ai widget on your site.
2. Configure the display and location of the widget so it does not conflict with the Zendesk widget. The Rep.ai widget can be positioned in the opposite corner or hidden altogether. Configure the display in the "Position & Visibility" section of the Rep.ai [settings page](https://app.rep.ai/settings/widget?expand=position-visibility).

### Identify Rep.ai Visitors

You'll need to inform Rep.ai of a website visitor's identity. This is how Rep.ai associates website visitors with Zendesk users. There are two pieces of metadata Rep.ai can use to associate a visitor with a Zendesk user, email address and external\_id. If your Zendesk installation is already assigning external\_ids that is the best way to make the association. For more information on assigning an external ID in Zendesk see their [docs](https://developer.zendesk.com/documentation/custom-data/profiles/using-external-id-with-profiles/).

Go to [Custom Visitor Identities](/custom-user-identities) to learn how to use the Rep.ai api to identify visitors.

When identifying visitors add their "email" to the metadata and use the Zendesk external\_id as the "Custom ID". If you are not assigning an external\_id use a [UUID](https://www.npmjs.com/package/uuid) or other unique id for "Custom ID"

#### Code Sample

```javascript
RepAI("identify",
  ZENDESK_EXTERNAL_ID_OR_UUID, // String or integer, replace with Zendesk external_id or your own custom unique value
  {
    email: "daniel@rep.ai", // Changes the email of the visitor in the dashboard
  },
);
```

## Usage

1. Ask your Rep.ai administrator to invite you to the Rep.ai organization if you are not already a member.

2. Accept the invitation and follow the instructions or log in to Rep.ai if you were already a member.

3. Close the Rep.ai dashboard and open Zendesk.

4. Navigate to a ticket. If possible choose a ticket for a user that is currently on the site, active chat conversations are a good candidate.

5. Click the grid icon on the right side of the ticket.

   <figure><img src="/files/3lfyeUfwc4NEzu5J3h4q" alt=""><figcaption></figcaption></figure>

6. Click the down chevron next to the Rep.ai app. If the chevron is pointed up then the app is already open and loading.

   <figure><img src="/files/1qaFI4ohuA6q74eAQIzu" alt=""><figcaption></figcaption></figure>

7. If the Zendesk user is currently on the site you can now view their browser session and interact with them in real time. Use the toolbar at the top to:
   1. Control - request permission to take over their mouse & keyboard remotely.
   2. Draw - Annotate the page with a drawing tool. Be your own[ John Madden](https://www.wired.com/1999/01/john-madden-on-gridiron-tech/).
   3. Request Screenshare - Ask the visitor to share their entire desktop when seeing their browser session is not enough.

<figure><img src="/files/hrSEvsdHVdLOivJxwwI7" alt=""><figcaption></figcaption></figure>


# Getting Started with Rep.ai Outbound (Dialer)

This walkthrough will help you get started with your first dial session on power or parallel dial mode.

1\. Once you have integrated your CRM or sales engagement platform with Rep.ai, it's time to begin your first dial session.

Navigate to <https://app.rep.ai/outbound>

2\. Create a new phone number if you do not already have one.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/42387fe7-7d27-4fbe-9cdc-57cc64e03db4/ascreenshot.jpeg?tl_px=0,0\&br_px=1892,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=298,105)

3\. Click "New Number"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/ca31cab9-e453-41a7-8027-389cbe1fcaca/ascreenshot.jpeg?tl_px=0,212\&br_px=1892,1269\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=400,277)

4\. Click the "Area Code / Prefix" field.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/824ab16b-a2e1-40f8-9331-07bdc702cb36/ascreenshot.jpeg?tl_px=505,463\&br_px=2398,1520\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,277)

5\. Type in an area code you want to dial from.

6\. Click "Generate number"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/e1e9e4bf-c3c1-4876-acaa-46f039125d7a/ascreenshot.jpeg?tl_px=1028,676\&br_px=2921,1733\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,277)

7\. Click "Add Number"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/d9f81380-571a-430d-a604-94142fb0158c/ascreenshot.jpeg?tl_px=1079,775\&br_px=2972,1832\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,277)

8\. Decide whether you want to dial in Power Dial mode (one at a time)...

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/45feeb49-cdbb-417b-b653-1544d1010e77/ascreenshot.jpeg?tl_px=287,0\&br_px=2180,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,122)

9\. or Parallel Dial mode (multiple lines at once).

Don't worry, Rep.ai's AI will detect if a person picks up and hand the live connection to you, while terminating other dials.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/7cd214e7-1a28-42c1-937d-8f5145f7fd2b/ascreenshot.jpeg?tl_px=571,0\&br_px=2464,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,230)

10\. When in Parallel Mode, select the number of lines you want to dial from.

Our team likes to use between 3 and 5 at a time, but you can select up to 9 lines at once.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/96c56578-9b31-431e-8da5-36d255417f44/ascreenshot.jpeg?tl_px=421,355\&br_px=2314,1412\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,277)

11\. Now it's time to pick a list to dial.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/82dffcbb-8815-467d-9a61-70de16cc4e18/ascreenshot.jpeg?tl_px=58,0\&br_px=1951,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,103)

12\. Select the source for your call list.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/ea146164-6ec2-4dd3-ae85-e51e4681bdb9/screenshot.jpeg?tl_px=360,293\&br_px=1220,774\&force_format=png\&width=860)

13\. Click the list. If the lists don't look up-to-date, click Sync Lists.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/759d31a9-50ed-4fa6-b0fe-01dcdaf92ee7/ascreenshot.jpeg?tl_px=0,654\&br_px=1892,1711\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=371,277)

14\. Click "Start Session" - this will begin dialing the number of lines you have selected in Parallel Dial.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/73a8cc4d-3b9a-4efb-a387-f9bfdd78e56a/ascreenshot.jpeg?tl_px=0,0\&br_px=1892,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=207,221)

:warning: **Alert: You are now in a live dial session!**

If you are parallel dialing, be prepared with a good opener that gives you a second to get oriented to the connection.

If you are power dialing, you'll probably want other tabs up with context on the person you're calling.

If you get bored, consider investing in higher quality numbers, or try our [Virtual Salesfloor](https://app.rep.ai/salesfloor).

15\. Click "End session" when you are finished.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-02-27/c1a70162-7c3f-4d9e-a686-8f20788cfb46/ascreenshot.jpeg?tl_px=0,0\&br_px=1892,1057\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=193,228)


# How to Create and Manage Custom Columns (Properties) in Rep.ai Outbound (Dialer)

Supported with Current Integrations: Outreach, Salesforce, HubSpot. Coming soon: Salesloft, Apollo.

Part 1: Create a Custom Property in Rep.ai Properties Settings

1\. Click "Properties" or navigate to <https://app.rep.ai/settings/properties>

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/f125fffc-570b-44ba-9b12-5734632e14b4/ascreenshot.jpeg?tl_px=0,466\&br_px=859,947\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=111,212)

2\. Click "Add Property"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/eb0feb2f-df63-430e-9831-d537e8a8b1e4/ascreenshot.jpeg?tl_px=208,0\&br_px=1068,481\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=746,212)

3\. Click the "Display Name" field.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/6dec0dea-c9e7-46c6-a908-aa923d5fdd4f/ascreenshot.jpeg?tl_px=208,4\&br_px=1068,485\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=434,212)

4\. Type the name of your property (here "Lifecycle Stage")

5\. Click "Map"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/49d82c9e-84c8-471a-8076-57234054c695/ascreenshot.jpeg?tl_px=208,255\&br_px=1068,736\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=539,212)

6\. Click "Select a property"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/42f985dc-9480-44bb-a2d5-c759d5392490/ascreenshot.jpeg?tl_px=77,252\&br_px=936,733\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=402,212)

7\. Type the name of your property (here "lifecycle stage")

8\. Select the right system property from the dropdown (here "Lifecycle Stage" from HubSpot)

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/00439a21-d2ed-4caf-8e16-16fd6bf5863b/ascreenshot.jpeg?tl_px=14,343\&br_px=874,824\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=402,212)

9\. Click "Both Ways" if you want to change the Sync direction

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/84ab0797-983a-432f-afb7-4de4613cf964/ascreenshot.jpeg?tl_px=208,259\&br_px=1068,740\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=416,212)

10\. Here we'll pick "From HubSpot" because we want the sync to only occur from HubSpot to Rep.ai

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/82ad844a-0188-4ee9-9014-bc318698bb1f/ascreenshot.jpeg?tl_px=208,334\&br_px=1068,815\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=408,212)

11\. Click "Add Property"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/bc2d6de3-6481-48b0-86c2-1c6be6f2a406/ascreenshot.jpeg?tl_px=208,403\&br_px=1068,884\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=486,212)

12\. Now you can see your property in the list

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/faa969da-4ea4-4e67-b1a1-2072e4d5abd7/ascreenshot.jpeg?tl_px=0,461\&br_px=859,942\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=356,212)

### Part 2: Map the Custom Property in CRM or Sequencer Settings

For instance, if you're calling out of HubSpot lists or sequence tasks, map the property in HubSpot integration settings, visible in the left sidebar under Integrations. Here, we're going to map the custom property in Outreach integration settings.

13\. Click "Outreach"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-08-08/b976164e-c4a9-4693-a9c5-c3cba5a2c788/ascreenshot.jpeg?tl_px=0,119\&br_px=1719,1080\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=139,277)

14\. Click "Add Property" under Contact/Prospect

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-08-08/6d2579f1-55ca-410c-8bf3-bb6ec008801d/ascreenshot.jpeg?tl_px=164,461\&br_px=1883,1422\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,277)

15\. Select the property you just created in Rep.ai from the left side dropdown.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-08-08/00bc8261-1a05-4c1c-ba9e-f099f67a6eb1/ascreenshot.jpeg?tl_px=190,595\&br_px=1909,1556\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=524,276)

16\. Then select the property you want to map it to in Outreach.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-08-08/0ba57537-ff71-471e-8a8c-912b2ded63ae/ascreenshot.jpeg?tl_px=442,689\&br_px=2162,1650\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=728,277)

17\. Click "Save"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-08-08/9c95a420-dea9-460d-80a3-8e6180244351/ascreenshot.jpeg?tl_px=442,0\&br_px=2162,961\&force_format=png\&width=1120.0\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=955,9)

### Part 3: Enable the Custom Property as a Column in a Dial List

18\. Navigate to the Dialer (dialpad icon on left sidebar)

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/2c416fa5-096b-49c9-85be-b886cbd75cfd/ascreenshot.jpeg?tl_px=0,228\&br_px=859,709\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=9,212)

19\. Click "Columns" on the right of the second toolbar

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/66ddda88-a9a4-4926-856d-359d6bb2336e/ascreenshot.jpeg?tl_px=208,0\&br_px=1068,480\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=657,164)

20\. Scroll down to find the property you just created. Click to toggle on.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/d6c3aa3d-84b3-4307-8a2c-97c91728d4c0/ascreenshot.jpeg?tl_px=208,506\&br_px=1068,987\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=412,231)

21\. Pick a list that has the property in it.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/ef9540c4-416e-49f4-9d28-134a6c297e4e/ascreenshot.jpeg?tl_px=0,0\&br_px=859,480\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=377,95)

22\. Here we'll grab our "Cold Call Test List" in HubSpot

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/4211499f-7381-48f3-bee9-0a4f3613d75c/ascreenshot.jpeg?tl_px=0,294\&br_px=859,775\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=291,212)

23\. And we can see our new property - "Lifecycle Stage" - shows as a column

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/cb034f9a-ab05-4408-bd51-88ffcbbda6d5/ascreenshot.jpeg?tl_px=208,16\&br_px=1068,497\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=569,212)

### Part 4: Show the Custom Property in the Popup Profile that Displays on Connected Calls

24\. Let's also add this to the popup profile when a call gets connected. To do this, hover over a Contact in the list and click "Open profile".

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/3299f2d8-baee-414d-b56f-a53c02148f1b/ascreenshot.jpeg?tl_px=0,0\&br_px=859,480\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=304,168)

25\. Click "Manage" on the left side of the popup.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/f3da4f92-aff9-4fda-ae31-b492205f6a10/ascreenshot.jpeg?tl_px=0,100\&br_px=859,581\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=272,212)

26\. Click "Add property" at the bottom.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/f6af41c4-a682-4823-bd0d-b9339f1ff070/ascreenshot.jpeg?tl_px=0,474\&br_px=859,955\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=241,212)

27\. Click "Select a property" and scroll or search to find your new property.

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/2c3f7453-f65e-4935-afb6-f2db3efdadc6/ascreenshot.jpeg?tl_px=0,462\&br_px=859,943\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=262,212)

28\. Select your property (here "Lifecycle Stage")

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/43c88c51-3dc2-4152-b6ed-e7e79e857c03/ascreenshot.jpeg?tl_px=0,506\&br_px=859,987\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=264,217)

29\. Click "Save"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/218b7970-1e32-460d-ade1-59d2e8592251/ascreenshot.jpeg?tl_px=208,506\&br_px=1068,987\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=559,309)

30\. Now you will see your new property in the popup when you connect to a prospect "Lifecycle Stage"

![](https://ajeuwbhvhr.cloudimg.io/colony-recorder.s3.amazonaws.com/files/2024-07-25/076d258f-a66e-407d-bf47-a999e44a044c/ascreenshot.jpeg?tl_px=0,278\&br_px=859,759\&force_format=png\&width=860\&wat_scale=76\&wat=1\&wat_opacity=0.7\&wat_gravity=northwest\&wat_url=https://colony-recorder.s3.us-west-1.amazonaws.com/images/watermarks/FB923C_standard.png\&wat_pad=22,212)


# How to Mark a Number as "Do Not Call" in Rep.ai Outbound (Dialer)

The FCC requires that anyone who requests to not be called again be marked as [Do Not Call](https://www.fcc.gov/general/do-not-call).

To do this in Rep.ai, when you are connected in a call, click the "Do Not Call" button in the bottom left of the live call popup.

<figure><img src="/files/RvBKoxKtyPp0QFusiM6N" alt=""><figcaption></figcaption></figure>


# FAQs

###

#### My Outreach tasks aren't showing up. What should I do?

\
Make sure your tasks are set to being due "today". Please review the following [tutorial for more information](<https://www.loom.com/share/a11bd680f42a4c71a7ac4e8cd6ec97fc&#xA;>).


# How to set high-intent page preferences for intent scoring

Spotlight scores the intent of detected accounts based on frequency of visitors and which pages are visited.

In order to determine which pages contribute to intent scoring:&#x20;

1. navigate to <https://app.rep.ai/spotlight/preferences>
2. click "New Intent Signal"

<figure><img src="/files/6ofHPwFCPpaShfSuwFoK" alt=""><figcaption></figcaption></figure>

* Name the Signal (can be a single page or multiple pages)
* Select "High" or "Low" intent (see below for the difference between the two)
* Select the "contains" or "equals" operator. "Contains" is recommended for most use cases.
* Type in the value Spotlight will look for in the session (e.g. "pricing")

<figure><img src="/files/rgBwuNkjia7efFIrzSXS" alt=""><figcaption></figcaption></figure>

* Now you can save the signal.&#x20;
* If you want to track multiple pages, click "OR" and add one or more additional pages.

<figure><img src="/files/Y8dI0PcLWGB9BwRPyzle" alt=""><figcaption></figcaption></figure>

High-intent pages contribute more than low-intent pages.

High-intent pages will also be captured in your CRM based on the High-Intent Pages Visited value here [CRM Fields for Rep.ai Influence (Account)](/spotlight/crm-fields-for-rep.ai-influence-account).


# How to toggle auto-create companies based on visitor identification

By default, Spotlight uses first party intent providers (for instance, Clearbit and 6sense) to automatically create account/company records in your CRM, and populate them with the properties noted in [CRM Fields for Rep.ai Influence (Account)](/spotlight/crm-fields-for-rep.ai-influence-account).

If you would like to ensure new company records don't get created when companies are detected on the site, go to <https://app.rep.ai/spotlight/preferences> and toggle off the Revealed Company Sync setting.

<figure><img src="/files/UDOlZTGokw9x3tJPTZqY" alt=""><figcaption></figcaption></figure>


# CRM Fields for Rep.ai Influence (Contact)

Rep.ai creates the following properties on your Salesforce Contact and HubSpot Contact objects, and updates them per the logic described below.

* Field Name: Engagement Status
  * Field Type: Long text (comma separated) or multi-picklist field
  * Salesforce “multi picklist” (Multi-select picklist)
  * Description: Populates values that signify any engagement a Contact has had with the website or Rep.ai.
  * Values
    1. Detected - Contact was detected on the website.
    2. Chat - Contact submitted text in the chat widget.
    3. Video Chat - A live video call within the chat widget occurred with Contact.
    4. Audio Chat - A live audio call within the chat widget occurred with Contact.
    5. User Viewed Session - A user from your team viewed a visitor session attached to Contact.
    6. Inbound Call - Contact requested help from the chat widget.
    7. Outgoing Call - A user from your team called Contact using the chat widget.
    8. Journey Presented - Contact was presented a chat journey.
    9. Journey Engaged - Contact engaged (clicked, responded to, or watched a video within) with a chat journey.
    10. Form Filled - Contact filled out a form in. the chat widget.
    11. Meeting Booked - Contact booked a meeting through the Rep.ai scheduler, either within the chat widget or through a dedicated booking page.
* Field Name: Web URLs Visited
  * Field Type: Long text field (separated via single space) (Salesforce = “textarea”)
  * Description: A raw capture of all marketing site URLs visited by Contact, including query strings.
  * Values: Any URL visited displayed as “[https://rep.ai/?utm\_source=](https://servicebell.com/?utm_source=)\[remainder of URL] [https://rep.ai/pricing/](https://servicebell.com/pricing/) https\://\[remainder of URL and other URLs separated by single space]”
* Field Name: High-intent URLs Visited
  * Field Type: mutli-select picklist
  * Description: This field shows picklist values based on a list maintained by the user in Rep.ai Spotlight for high-intent pages. These are custom, where the list includes pages the user has identified in Rep.ai Spotlight.
  * Values (for example):
    * Pricing
    * Demo
* Field Name: First Detected
  * Description: This field reflects the first date Contact was detected on the website.
  * Field Type: Date
* Field Name: First Engaged
  * Description: This field reflects the first date the Contact was engaged either with a live chat or a journey. Requires that the Contact took action in some way.
  * Field Type: Date
* Field Name: Last Detected:
  * Description: This field reflects the last date a Contact was detected on the website.
  * Field Type: Date
* Field Name: Last Engaged:
  * Description: This field reflects the last date the Contact was engaged either with a live chat or a journey. Requires that the Contact took action in some way.
  * Field Type: Datect C
* Field Name: Last UTM Source Detected:
  * Description: Take last detected *?utm\_source=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Medium Detected:
  * Description: Take last detected *?utm\_medium=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Campaign Detected:
  * Description: Take last detected *?utm\_campaign=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Term Detected:
  * Description: Take last detected *?utm\_term=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Content Detected:
  * Description: Take last detected *?utm\_content=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]


# CRM Fields for Rep.ai Influence (Account)

Rep.ai creates the following properties on your Salesforce Account and HubSpot Company objects, and updates them per the logic described below.

* Field Name: Engagement Status
  * Field Type: Long text (comma separated) or multi-picklist field
  * Salesforce “multi picklist” (Multi-select picklist)
  * Description: Populates values that signify any engagement an Account has had with the website or Rep.ai.
  * Values
    1. Detected - Account was detected on the website.
    2. Chat - A visitor from this Account submitted text in the chat widget.
    3. Video Chat - A live video call within the chat widget occurred with a visitor from this Account.
    4. Audio Chat - A live audio call within the chat widget occurred with a visitor from this Account.
    5. User Viewed Session - A user from your team viewed a visitor’s session from this Account.
    6. Inbound Call - A visitor from this Account requested help from the chat widget.
    7. Outgoing Call - A user from your team called a visitor from this Account using the chat widget.
    8. Journey Presented - A visitor from this Account was presented a chat journey.
    9. Journey Engaged - A visitor from this Account engaged (clicked, responded to, or watched a video within) with a chat journey.
    10. Form Filled - A visitor from this Account filled out a form in. the chat widget.
    11. Meeting Booked - A visitor from this Account booked a meeting through the Rep.ai scheduler, either within the chat widget or through a dedicated booking page.
* Field Name: Web URLs Visited
  * Field Type: Long text field (separated via single space) (Salesforce = “textarea”)
  * Description: A raw capture of all marketing site URLs visited by visitors from the Account, including query strings.
  * Values: Any URL visited displayed as “[https://rep.ai/?utm\_source=](https://servicebell.com/?utm_source=)\[remainder of URL] [https://rep.ai/pricing/](https://servicebell.com/pricing/) https\://\[remainder of URL and other URLs separated by single space]”
* Field Name: High-intent URLs Visited
  * Field Type: mutli-select picklist
  * Description: This field shows picklist values based on a list maintained by the user in Rep.ai Spotlight for high-intent pages. These are custom, where the list includes pages the user has identified in Rep.ai Spotlight.
  * Values (for example):
    * Pricing
    * Demo
* Field Name: First Detected
  * Description: This field reflects the first date an Account was detected on the website.
  * Field Type: Date
* Field Name: First Engaged
  * Description: This field reflects the first date the Account was engaged either with a live chat or a journey. Requires that the Account visitor took action in some way.
  * Field Type: Date
* Field Name: Last Detected:
  * Description: This field reflects the last date an Account was detected on the website.
  * Field Type: Date
* Field Name: Last Engaged:
  * Description: This field reflects the last date the Account was engaged either with a live chat or a journey. Requires that the Account visitor took action in some way.
  * Field Type: Date
* Field Name: Number of unique visitors
  * Description: This is the total number of unique website visitors from the account visiting the site. Use this to gauge how many people form one account are interested in your offering.
  * Type: Number
  * Values: \[Number of unique visitors]
* Field Name: Last UTM Source Detected:
  * Description: Take last detected *?utm\_source=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Medium Detected:
  * Description: Take last detected *?utm\_medium=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Campaign Detected:
  * Description: Take last detected *?utm\_campaign=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Term Detected:
  * Description: Take last detected *?utm\_term=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]
* Field Name: Last UTM Content Detected:
  * Description: Take last detected *?utm\_content=xyz* and write to this field as *xyz* and overwrite previous values when new ones are detected
  * Field Type: short text
  * Values
    * \[Custom Value]


# Engage performance metric definitions

Engage performance analytics tracks your team's performance with key metrics. This doc explains what each one means and how it's calculated.

### Key Definitions

**Proactive** Events originated by a rep.

**Inbound** Events originated by a visitor.

**Visitor Session** A visitor's uninterrupted visit on your website.

### Live Website Calls Metrics

#### Proactive Website Calls (Rep → Visitor)

**Proactive Website Calls Attempted** Counts every time a rep initiates a website call with a visitor, regardless of the outcome. This metric tracks proactive rep engagement intent and is available for an organization, individual users, and pages.

**Proactive Website Calls Accepted** Counts proactive website calls that visitors accept when offered by a rep. This metric validates successful proactive rep behavior and is available for an organization, individual users, and pages.

#### Inbound Website Calls (Visitor → Rep)

**Inbound Website Calls Requested** Counts when a visitor initiates a website call, even if later canceled. This metric tracks genuine visitor intent to connect and is available for an organization and pages.

**Inbound Website Calls Missed** Counts instances where a visitor waits for a website call connection but no rep answers. This represents a failure to connect with an engaged visitor. This metric is available for an organization and pages.

**Inbound Website Calls Answered** Counts when a rep answers an inbound website call. The website call is considered answered once the rep clicks "Answer," regardless of whether the visitor accepts the subsequent connection. This metric is available for an organization, individual users, and pages.

#### All Website Calls

**Website Calls Held** Sum of Proactive Website Calls Attempted and Inbound Website Calls Answered. This metric is available for an organization, individual users, and pages.

### Live Chat Conversation Metrics

#### Proactive Live Chat Conversations (Rep → Visitor)

**Proactive Live Chat Conversations Attempted** Counts when a rep sends a message to a visitor before the visitor has sent a message. Each visitor session can have at most one proactive live chat conversation attempt. This metric tracks rep-initiated engagement efforts and is available for an organization, individual users, and pages.

**Proactive Live Chat Conversations Accepted** Counts when the visitor responds to the rep's message. Each visitor session can have at most one proactive live chat conversation acceptance. This metric represents successful proactive engagement and is available for an organization, individual users, and pages.

#### Inbound Live Chat Conversations (Visitor → Rep)

**Inbound Live Chat Conversations Requested** Counts when a visitor sends a chat message before being messaged by a rep, regardless of response or outcome. Each visitor session can have at most one inbound live chat conversation request. This metric tracks visitor-initiated contact attempts and is available for an organization and pages.

**Inbound Live Chat Conversations Missed** Counts when a visitor sends a message but does not receive a reply from a rep during the visitor session. This metric identifies lost engagement opportunities and is available for an organization and pages, but not for individual users.

**Inbound Live Chat Conversations Answered** Counts when a human rep responds to a visitor's message during the same visitor session. This metric is available for an organization, individual users, and pages.

#### All Live Chat Conversations

**Live Chat Conversations Held** Sum of Proactive Live Chat Conversations Accepted and Inbound Live Chat Conversations Answered. This metric is available for an organization, individual users, and pages.


