> For the complete documentation index, see [llms.txt](https://docs.birdie.so/birdie-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.birdie.so/birdie-docs/helpdesk/salesforce-service-cloud/analytics.md).

# Analytics

If you want to track or report on Birdie usage inside Salesforce, the **Birdie Links** object (API name `Birdie_Recording__c`) gives you a record for every Birdie screen-recording link or recording-request link used in a Case.

Whenever a Birdie link appears in:

* a Case Feed post
* a Case Comment (public or private)
* an EmailMessage
* a Case field (e.g., Description)
* a form submission synced into Salesforce

…Birdie automatically creates a **Birdie Link** record to capture that usage.

This gives admins and managers a simple, reliable way to build metrics, dashboards, and adoption reports.

***

### Object Summary

| Property        | Value                                         |
| --------------- | --------------------------------------------- |
| **Label**       | Birdie Link                                   |
| **API Name**    | `Birdie_Recording__c`                         |
| **Purpose**     | Track each Birdie URL usage inside Salesforce |
| **Created By**  | Birdie managed package                        |
| **UI Location** | **Birdie Links** tab (added by the package)   |

***

### What URLs Are Detected?

Birdie automatically detects:

#### **Outgoing Birdie recordings (agent → customer)**

```
https://share.birdie.so/o/<id>
```

#### **Incoming Birdie recordings (customer → agent)**

```
https://share.birdie.so/i/<id>
```

#### **Birdie recording request links**

```
https://<your-birdie-subdomain>.birdie.so/rec/<id>
```

Direction is computed automatically from these patterns.

***

### Key Fields

<table><thead><tr><th width="162.18975830078125">Label</th><th width="156.021728515625">Type</th><th>Description</th><th data-hidden>API Name</th></tr></thead><tbody><tr><td><strong>Link URL</strong></td><td>Text</td><td>The actual Birdie link detected <em>(replaces the deprecated RecordingUrl__c field).</em></td><td><code>LinkUrl__c</code></td></tr><tr><td><strong>Direction</strong></td><td>Text</td><td>One of: <code>incoming</code>, <code>outgoing</code>, <code>request</code>, based on URL pattern.</td><td><code>Way__c</code></td></tr><tr><td><strong>Source</strong></td><td>Text</td><td>Where the link was found (<code>FeedItem</code>, <code>EmailMessage</code>, <code>CaseField</code>, <code>CaseCommentPublic</code>, <code>CaseCommentPrivate</code>).</td><td><code>Source__c</code></td></tr><tr><td><strong>Case</strong></td><td>Lookup(Case)</td><td>Case associated with the usage (when applicable).</td><td><code>Case__c</code></td></tr><tr><td><strong>Last Used At</strong></td><td>Date/Time</td><td>Timestamp of the detection.</td><td><code>LastUsedAt__c</code></td></tr><tr><td><strong>First Viewed At</strong></td><td>Date/Time</td><td>Timestamp of the first time the video has been played across both authenticated and anonymous viewers.</td><td><code>FirstViewedAt__c</code></td></tr><tr><td><strong>Last Viewed At</strong></td><td>Date/Time</td><td>Timestamp of the last time the video has been played across both authenticated and anonymous viewers.</td><td><code>LastViewedAt__c</code></td></tr><tr><td><strong>Birdie Auth View Count</strong> <mark style="color:$warning;">*</mark></td><td>Number</td><td>Number of times an authenticated Birdie user (i.e. an Agent) played the video.</td><td><code>BirdieAuthViewCount__c</code></td></tr><tr><td><strong>First Birdie Auth Viewed At</strong> <mark style="color:$warning;">*</mark></td><td>Date/Time</td><td>First datetime an Agent viewed the video.</td><td><code>FirstBirdieAuthViewedAt__c</code></td></tr><tr><td><strong>Last Birdie Auth Viewed At</strong> <mark style="color:$warning;">*</mark></td><td>Date/Time</td><td>Last datetime an Agent viewed the video.</td><td><code>LastBirdieAuthViewedAt__c</code></td></tr><tr><td><strong>Anonymous View Count</strong> <mark style="color:$warning;">**</mark></td><td>Number</td><td>Number of times an un authenticated user (i.e. a customer) played the video.</td><td><code>AnonymousViewCount__c</code></td></tr><tr><td><strong>First Anonymous Viewed At</strong> <mark style="color:$warning;">**</mark></td><td>Date/Time</td><td>First datetime a customer viewed the video.</td><td><code>FirstAnonymousViewedAt__c</code></td></tr><tr><td><strong>Last Anonymous Viewed At</strong> <mark style="color:$warning;">**</mark></td><td>Date/Time</td><td>Last datetime a customer viewed the video.</td><td><code>LastAnonymousViewedAt__c</code></td></tr></tbody></table>

{% hint style="info" %}
**Meaning of&#x20;*****Birdie Auth*****&#x20;\<vs>&#x20;*****Anonymous***\ <mark style="color:$warning;">\*</mark> ***Birdie Auth*** means an authenticated Birdie user (i.e. an Agent) who opened the video in his Birdie authenticated workspace.\ <mark style="color:$warning;">\*\*</mark> ***Anonymous*** means a user that was not authenticated in a Birdie workspace (applies only for videos that are publicly shared).
{% endhint %}

***

### How Birdie Creates These Records

Birdie includes four managed triggers:

| Trigger                  | Detects Links In           | When It Fires                 |
| ------------------------ | -------------------------- | ----------------------------- |
| **FeedItem Trigger**     | Case feed posts            | After insert                  |
| **EmailMessage Trigger** | Emails on a Case           | After insert                  |
| **CaseComment Trigger**  | Public or private comments | After insert                  |
| **Case Trigger**         | Any text field on Case     | After insert and after update |

#### What happens when a link is detected?

1. Salesforce extracts all Birdie URLs from the text.
2. For **each link**, it creates a **new Birdie Link record**.
3. It assigns the correct **Direction** and **Source**.
4. It links the record to the Case (when appropriate).
5. It stores the detection time.

Everything is 100% automated.\
Admins do not need Flows, Processes, or custom triggers.

#### 8 fields maintained by Birdie and may change over time

* First Viewed At,&#x20;
* Last Viewed At,&#x20;
* Birdie Auth View Count,&#x20;
* First Birdie Auth Viewed At,&#x20;
* Last Birdie Auth Viewed At,&#x20;
* Anonymous View Count,&#x20;
* First Anonymous Viewed At,&#x20;
* Last Anonymous Viewed At&#x20;

***

### Notes for Salesforce Developers

#### API Names

| Label                       | API Name                     |
| --------------------------- | ---------------------------- |
| Birdie Link                 | `Birdie_Recording__c`        |
| Direction                   | `Way__c`                     |
| Link URL                    | `LinkUrl__c`                 |
| Source                      | `Source__c`                  |
| Case                        | `Case__c`                    |
| First Viewed At             | `FirstViewedAt__c`           |
| Last Viewed At              | `LastViewedAt__c`            |
| Birdie Auth View Count      | `BirdieAuthViewCount__c`     |
| First Birdie Auth Viewed At | `FirstBirdieAuthViewedAt__c` |
| Last Birdie Auth Viewed At  | `LastBirdieAuthViewedAt__c`  |
| Anonymous View Count        | `AnonymousViewCount__c`      |
| First Anonymous Viewed At   | `FirstAnonymousViewedAt__c`  |
| Last Anonymous Viewed At    | `LastAnonymousViewedAt__c`   |

{% hint style="warning" %}
**Note on API names:**\
This document shows field API names *without* the managed package namespace for readability (for example `LinkUrl__c`).\
In Apex, SOQL, and formulas, these are prefixed with the Birdie namespace `sfbirdiecx__`, e.g. `sfbirdiecx__LinkUrl__c` on `sfbirdiecx__Birdie_Recording__c`.
{% endhint %}

#### Note about Direction and Source values

{% columns %}
{% column %}
`Way_cc` (Direction) is always one of:

* `incoming`
* `outgoing`
* `request`
  {% endcolumn %}

{% column %}
`Source__c` (Source) is always one of:

* `FeedItem`
* `EmailMessage`
* `CaseCommentPublic`
* `CaseCommentPrivate`
* `CaseField`
  {% endcolumn %}
  {% endcolumns %}

#### Example SOQL

```sql
SELECT LinkUrl__c, Direction__c, Source__c, Case__c, CreatedDate
FROM Birdie_Recording__c
WHERE Case__c = :caseId
ORDER BY CreatedDate DESC
```

***

### Automatic Feed Item Creation (Optional)

In some Salesforce orgs, creating a **Birdie Link** record may automatically generate a new **Case Feed item** in the Case's activity feed. This behavior depends entirely on your org’s **Feed Tracking settings** and is not controlled by Birdie.

If you prefer **not** to show these automatic feed entries:

1. Go to **Setup → Feed Tracking**
2. Select **Case**
3. Scroll to **“Select Fields to Track”**
4. Uncheck **“All Related Objects”**
5. Click **Save**

After disabling this option, Birdie Link creation will no longer produce new Case feed posts.

<details>

<summary>Reporting Examples</summary>

### How Salesforce Admins Can Use Birdie Links

#### Measure Recording Traffic

Build reports such as:

* Number of incoming vs outgoing recordings
* Number of recording requests sent
* Link usage volume by week or month

#### Evaluate Agent Behavior

Report on:

* Which support agents send the most recordings
* Which agents receive the most recordings
* Team-wide Birdie adoption

#### Understand Customer Activity

See which customers:

* Send the most Birdie recordings
* Require more async assistance
* Engage often with recording workflows

#### Case-by-Case Insights

For any Case:

* How many Birdie URLs were exchanged?
* Who initiated recordings (agent or customer)?
* Did the customer respond using a Birdie link?

***

### Recommended Report Types

#### **1. “Cases with Birdie Links”** (Custom Report Type)

**Primary Object:** Case\
**Related Object:** Birdie Links

Use this for:

* Birdie activity per Case
* Agent performance
* Team dashboards

***

#### **2. “All Birdie Links”** (Custom Report Type)

**Primary Object:** Birdie Links

Use this to build:

* Birdie usage dashboards
* Direction funnels (incoming vs outgoing vs request)
* Source-channel analytics (email vs feed vs comments vs fields)

***

### Example Dashboard Widgets

Here are great starting points:

{% hint style="info" %}

#### Birdie Usage Over Time

Count of Birdie Links per week/month.
{% endhint %}

{% hint style="info" %}

#### Incoming vs Outgoing vs Request

Pie chart grouped by **Direction**.
{% endhint %}

{% hint style="info" %}

#### Sources of Birdie Links

Bar chart grouped by **Source**\
(`EmailMessage`, `FeedItem`, `CaseCommentPublic`, `CaseCommentPrivate`, `CaseField`)
{% endhint %}

{% hint style="info" %}

#### Agent Leaderboard

Group by: Case Owner → Count of Birdie Link
{% endhint %}

{% hint style="info" %}

#### Birdie Activity by Case

List view showing:

* Case Number
* Number of Birdie Links
* % incoming vs outgoing
* Last recorded usage
  {% endhint %}

</details>

***

#### What if the `Birdie_Recording__c` object is not created?&#x20;

Birdie automatically creates `Birdie_Recording__c` records using Salesforce Triggers at Case creation time. However, depending how you setup your Case creation, if the Birdie Link is not visible to the trigger, the link may not be detected and as a result, the `Birdie_Recording__c` record is not created.

In these cases, you can create the record manually at the time of recording — for example, when submitting a Case through a Digital Experience Flow.
