---
title: "Client portals: branded read-only call reporting"
description: "Create a ThunderPhone client portal, choose visible agents, add viewers, brand the experience, connect a custom domain, and share read-only call history."
---

**Client portals** give each client a branded, read-only view of calls handled
for them. A portal can include selected agents, its own viewers, a logo and
accent color, and an optional custom domain.

Organization admins manage portals at **Client portals**
(`/dashboard/client-portals`). Viewers use the hosted portal URL and never gain
access to the ThunderPhone dashboard.

## Create a portal

<Steps>
  <Step title="Choose New portal">
    Enter the client-facing name. ThunderPhone creates a unique URL slug from
    it; you can edit the slug later.
  </Step>
  <Step title="Assign agents">
    Add the agents whose calls the client should see. A portal with no assigned
    agents has no visible calls.
  </Step>
  <Step title="Add viewers">
    Add each approved viewer's email address. Viewers request their own login
    code from the portal sign-in page.
  </Step>
  <Step title="Share the URL">
    Copy the portal URL or choose **Open** to test it. The list page also shows
    each portal's active status, agent count, and viewer count.
  </Step>
</Steps>

## Portal details and availability

The **Portal details** card controls:

- **Name** — displayed on the portal login and header; maximum 255 characters.
- **Slug** — the hosted URL segment; maximum 100 characters. Use lowercase
  letters, numbers, and single hyphens. Slugs must be unique and cannot use a
  reserved platform route.
- **Agents** — the exact set of agent call histories visible in the portal.
- **Portal active** — turn this off to prevent every viewer from opening it
  without deleting configuration.

Only calls belonging to an assigned agent are in scope. Viewers cannot edit
agents, place calls, manage billing, or see other organization data.

## Branding

Upload a **PNG**, **JPEG**, or **WebP** logo up to **2 MB**. Choose a full
six-digit hexadecimal accent color such as `#2e8fff`; it controls the primary
buttons and highlights. Reset either value to return to the default branding.

Branding appears on both the sign-in page and authenticated portal header.

## Viewer access

Add viewers by email. On the portal login page, an active viewer can:

- Request a six-digit code by email. A code is valid for 10 minutes.
- Sign in with a password if they have created one.
- Create a password of at least 8 characters after signing in.

You can deactivate a viewer without removing their row, or delete them to
remove access. Portal sessions are separate from dashboard sessions.

## What viewers can see

The portal has two sections: **Overview** and **Calls**.

**Overview** shows five numbers for the last 7, 14 or 30 days. Comparison
indicators show changes from the previous period of the same length. An
indicator is omitted when the previous value was zero and the current value
is positive. Colour shows whether a change is good or bad, not which way it
points:

1. **Calls answered**: inbound and web calls that reached the agent, plus
   outbound calls the other side answered, and how many started after
   hours.
2. **Start to finish**: calls that left nothing for the client to do.
3. **Didn't go well**: calls where the caller hung up mid-conversation or
   after the agent asked for information, the agent struggled to capture
   details, a booking failed, or a transfer did not connect. The most
   common cause is shown. Hanging up at the greeting alone does not count.
4. **Frustrated callers**: callers who showed frustration, with the most
   common cause. Fewer is better.
5. **Appointments set**, and how many were with new clients.

Below the numbers, Overview lists up to eight calls that need a follow-up;
**View all flagged calls** opens the filtered Calls list. When more than
one agent has answered calls in the selected period, a table shows calls,
after-hours calls,
start-to-finish calls, calls that did not go well, appointments and flagged
calls for each agent. The five headline numbers also appear on the dashboard
Home page and in each agent's **Calls** tab.

**Calls** lists inbound, outbound and widget calls for the assigned
agents; browser tests and simulations are left out. Each row shows the
date, the **From** number with any
[label](/guides/review-calls#label-a-phone-number) your organization gave
it, the one-line summary, the outcome label (the agent's own list, or
Success / Failure), any **Needs attention** flag and reason, the agent and
the duration. Flagged calls sort to the top; the **Sort** filter
switches to newest first. Filters also cover date range, call type, needs
attention and business hours. **Export CSV** downloads up to 5,000
matching calls with the report columns, flagged calls first. If more than
5,000 calls match, the file is truncated.

Opening a call shows the flag, outcome, summary and caller experience
above the recording. For a frustrated caller, caller experience shows the
frustration cause; otherwise the caller-experience note appears when
available. When the flag has a recorded time and the call has a
recording, **Jump to …** starts playback at that moment. The transcript
follows.

Calls from or to the organization's excluded test numbers are left out of
portal lists, Overview numbers and CSV exports, and cannot be opened in the
portal. After-hours counts use the organization's time zone and business
hours ([Organization settings](/guides/organization-settings#reporting)),
or an agent's own when set under **Reporting** in the agent builder.

The interface is read-only. It does not expose agent prompts, organization
settings, keys, billing, tools, or internal issue workflows.

## Connect a custom domain

<Steps>
  <Step title="Add the hostname">
    Under **Custom domains**, enter a full hostname such as
    `calls.client.com`. A hostname can belong to only one portal.
  </Step>
  <Step title="Point traffic to the portal">
    Add the displayed **CNAME** record at the DNS provider.
  </Step>
  <Step title="Prove domain ownership">
    Add the displayed **TXT** record at
    `_tp-portal-verify.<hostname>` with the generated verification value.
  </Step>
  <Step title="Allow Azure hostname validation">
    Add the displayed **TXT** record at `asuid.<hostname>` with the Azure
    verification value. Keep it in place while the hostname is connected.
  </Step>
  <Step title="Verify">
    Choose **Verify now**. DNS can take time to propagate; the setup screen can
    check again every 20 seconds. After verification succeeds, the TXT record
    can be removed while the CNAME must remain.
  </Step>
</Steps>

Remove a domain from the portal before reusing that hostname elsewhere.

## Delete a portal

Deleting a portal permanently removes its viewer access and custom-domain
configuration. It does not delete the organization's agents or calls, but the
portal cannot be recovered. Use the **Portal active** switch for a reversible
pause.

For admin automation, see the
[Client Portals API](/api-reference/client-portals).
