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

# Interactions console

> The per-feature reference for the /interactions console: what the unified list unions, the filter vocabulary and combination rules, read versus export permissions, the visible columns, and the empty and loading states the page renders.

# Interactions console

The **Interactions** console at `/interactions` puts every conversation and every call across your messaging and voice channels into one recency-ordered list. Open it when the question is "what happened with this customer recently, on any channel?" — the same unified record powers the Inbox and Customer 360, so a row you find here is the same thread an agent works in the queue.

This page is the reference companion to the task guides: it describes what the console shows and how each control behaves, and links out to the guides that walk through the workflows.

## What the list unions

Two record types share one list:

* **Conversations** — messaging threads on SMS, WhatsApp, email, RCS, Viber, Instagram, Messenger, Telegram, video, web chat, and the other connected channels.
* **Calls** — voice legs, inbound and outbound.

The backend merges both record types and returns them already sorted by last activity, newest first, so messaging and voice interleave in the order they actually happened; the list never re-sorts in the browser, and **Load more** appends the next page in that same order. The console is a read surface: it reports activity only, and outbound messages and calls themselves exit through the Devotel softswitch regardless of channel.

Pagination is keyset-stable on `(last_activity_at, id)`: **Load more** resumes from the last row you saw, ties broken by row id, so a new message or call arriving while you read cannot shift or duplicate the rows above the cursor. Changing any filter returns you to the first page.

## The filter strip

The strip carries four controls, and controls from different groups AND together — a row must match the search term, the type, the channel set, and the recency window all at once to appear.

**Free-text search** matches the contact identifiers carried on the interaction: contact name, phone number, and email address. Leading and trailing whitespace is ignored, and an empty field applies no search at all.

**Type chips** are single-select. Picking **Calls** or **Conversations** narrows the list to that record type; picking the active chip again, or pressing **All types**, clears back to both.

**Channel chips** are multi-select. Each lit chip adds its channel to the set, and chips inside this group OR together — a row on any selected channel matches. **All channels** clears the set.

**Recency presets** — **All time**, **Last 24h**, **Last 7 days**, **Last 30 days** — bound the list to interactions last active inside the window. Pressing the preset that is already active is a no-op, so a second click never flashes the list away.

While a changed filter set loads, the rows you were looking at stay on screen until the refreshed list lands.

## Reading versus exporting

Every dashboard role — owner, admin, developer, and viewer — can open the console and read the list.

**Export CSV** downloads the currently filtered list as CSV, with timestamps rendered in your own timezone. Export is gated one step tighter than read: it requires an owner, admin, or developer role together with the `contacts:read` permission. A viewer who presses the button gets a friendly inline notice that export is not available to their role, never a raw error page. See [Interactions export permissions](/guides/interactions-export-auth-model) for the full read-versus-export matrix.

## Columns

| Column | What it shows |
| - | - |
| **Type** | A **Conversation** or **Call** badge; call rows add a direction arrow for inbound or outbound. |
| **Channel / Status** | The channel the interaction ran on, with its lifecycle status pill beneath — active or closed for conversations; ringing, busy, no answer, declined, or transferred for calls. Conversation rows add a second pill for the latest message's delivery state (delivered, undelivered, failed), so lifecycle and delivery health read as two labelled indicators, not one conflated badge. |
| **Contact** | The contact's name as a link to their contact record, with the phone number beneath when both are known. A thread with no linked contact still shows the best identifier it carries — a phone number or email — as plain text, so the column never blanks; only a row with no identifier at all renders a dash. |
| **Preview** | The first line of the latest message with markup stripped, or **Voice call** for call rows that have no snippet. |
| **Last activity** | When the interaction was last active, in your timezone. |

## Empty and loading states

* **First load** renders an eight-row skeleton while the first page fetches.
* **No interactions yet** appears when nothing is on record and no filter is set, with the hint that everything lands here once you start messaging or calling.
* **No matches** appears when filters are set and zero rows match, with a one-click **Clear filters** that resets search, chips, and range together.
* **Load failure** shows a retry card instead of an empty list, so a transient error never reads as "no interactions."

## Where to go next

* [Interactions console](/guides/interactions-console) — the end-to-end walkthrough of the surface.
* [Find a conversation](/guides/interactions-find-a-conversation) — locating one specific thread fast.
* [Unified interactions model](/concepts/interactions-unified-model) — the data model behind the merged list.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.