# Configure Chat locations, coverage, and widgets

> Enable Chat and configure every location, widget, appearance, behavior, file, and installation setting.

Language: en-US. Product guide: https://customer.help/help/chat-settings/.

Reviewed by Customer Help Product Support on July 23, 2026. Verified for release 2026.07.

<span id="portal-chat-settings"></span> Use Chat Settings to choose which locations offer Chat, set human coverage hours, and customize and install each brand's customer-facing widget.

## Prerequisites

- Chat must be available for the business. If the Chat area is unavailable, [contact support to confirm Chat availability](/help/reference.md#reference-support).
- The business needs a saved brand and at least one active, billable location.
- Billing must show **Active** or **Trial**. After changing a location, wait for its status to confirm the change.
- Each Chat location should have a confirmed city or region time zone, such as `America/Chicago`, before scheduled coverage is saved.

## Enable Chat for locations

<span id="chat-locations-enabled"></span> **Chat locations** selects the active, billable locations where Chat should be available. Select the intended rows and **Save changes**. Chat is available at a location when its row reports **Enabled**.

A row can show:

| Status | Meaning |
| --- | --- |
| **Enabled** | Chat is on for the location. |
| **Pending** | The change is waiting for billing confirmation. |
| **Retry needed** | The change could not be confirmed. The previous setting remains in use. |
| **Off** | Chat is off for the location. |

A checkbox is disabled when the location is inactive, is not billable, or the main subscription is not active. Chat costs the displayed price for each enabled location. Disabling Chat may create a prorated billing adjustment; it does not delete conversation history.

## Configure location coverage

<span id="chat-coverage-mode"></span> **Availability mode** controls when the expanded location offers human service:

- **Always available** — humans are considered available at all times, subject to actual agent presence and capacity.
- **Weekly schedule** — coverage uses the enabled day windows in the location's saved time zone.
- **Unavailable** — live human coverage is never offered; the widget follows its offline behavior.

For a weekly schedule:

1. <span id="chat-coverage-enabled"></span> **Day enabled** includes that weekday in human coverage. A disabled day remains outside human coverage even when time inputs contain old values.
2. <span id="chat-coverage-open"></span> **Open time** starts a coverage window in the location's local time. Up to four windows can represent split shifts.
3. <span id="chat-coverage-close"></span> **Close time** ends the window and must be later than Open. Windows must be ordered and non-overlapping. Overnight windows are unsupported; split them across two calendar days.
4. Select **Save and confirm**. A missing time zone disables that action—fix it in [Locations](/help/locations.md#location-time-zone-override).

<span id="chat-coverage-copy-to"></span> **Copy coverage to** copies the saved weekly schedule to another location. Confirm the destination's time zone: copying `09:00–17:00` sets 9 a.m.–5 p.m. in the destination's local time.

If a widget still shows an older brand-level schedule, keep it accurate until you have confirmed a time zone and coverage schedule for every Chat location.

## Open a brand widget

Each brand has a public widget ID that stays the same when you edit its name, path, or theme. **Preview** opens the experience without publishing a change. **Copy code** copies the installation snippet. **Edit** opens six settings tabs. Changes update the preview immediately but do not reach customers until **Save Chat Widget** succeeds. If another Administrator saved first, reload the latest settings and reapply your edits.

## Experience fields

Copy is authored separately for each enabled business language. A blank secondary-language field falls back to authored primary-language copy; Customer Help does not invent a translation.

| Field | Limit and effect |
| --- | --- |
| <span id="chat-copy-header-title"></span> **Chat header** | Up to 80 characters; the title at the top of the panel. Keep it recognizable at every location. |
| <span id="chat-copy-welcome-title"></span> **Welcome headline** | Up to 100 characters; the main prompt before a conversation starts. State what help is available. |
| <span id="chat-copy-greeting"></span> **Greeting** | Up to 240 characters; the introductory customer message. Do not imply that a human is online outside coverage. |
| <span id="chat-copy-online-label"></span> **Online message** | Up to 60 characters; the availability label during human coverage. |
| <span id="chat-copy-offline-label"></span> **Offline status** | Up to 80 characters; a compact status shown outside human coverage. |
| <span id="chat-copy-offline-title"></span> **Unavailable headline** | Up to 100 characters; the heading of the offline panel. |
| <span id="chat-copy-offline-message"></span> **Unavailable message** | Up to 240 characters; directs visitors to alternatives. Do not promise a response time the team cannot meet. |
| <span id="chat-copy-composer-placeholder"></span> **Message placeholder** | Up to 100 characters; the hint inside the composer. It disappears when the visitor starts typing. |
| <span id="chat-copy-launcher-label"></span> **Launcher label** | Up to 40 characters; text used by a pill-style launcher. Keep the localized action short. |
| <span id="chat-copy-starter-prompts"></span> **Suggested questions** | One per line, up to 500 characters total and at most six questions. Selecting one starts a visitor message; it does not change AI behavior. |
| <span id="chat-copy-privacy-notice"></span> **Privacy note** | Optional, up to 300 characters. Show a concise collection notice and link to fuller policy where needed. |
| <span id="chat-experience-visitor-name-mode"></span> **Ask for a name** | Choose **Do not ask**, **Optional**, or **Required** before starting. Requiring it can reduce starts; collect only what the service needs. |
| <span id="chat-experience-privacy-url"></span> **Privacy policy link** | Optional absolute HTTPS URL to the business's public policy. Test it without signing in. |

## Appearance fields

| Field | Values and consequence |
| --- | --- |
| <span id="chat-experience-launcher-style"></span> **Launcher style** | **Icon** or **Icon and label**. The latter displays the launcher label and takes more page space. |
| <span id="chat-experience-launcher-label"></span> **Appearance launcher label** | Up to 40 characters. Keep the same localized intent as the Experience label and check that it fits the selected style. |
| <span id="chat-experience-panel-size"></span> **Panel size** | **Compact**, **Standard**, or **Spacious**. Test small screens and zoom before choosing Spacious. |
| <span id="chat-experience-header-style"></span> **Header style** | **Minimal**, **Solid color**, or **Gradient**. Review logo and text contrast in the resulting header. |
| <span id="chat-appearance-launcher-position"></span> **Launcher position** | Bottom right or bottom left. Check for overlap with cookie, accessibility, support, and navigation controls. |
| <span id="chat-experience-color-mode"></span> **Color source** | **Use brand colors** follows the saved brand palette; **Custom colors** lets this widget use different values. |
| <span id="chat-experience-primary-color"></span> **Primary color** | Hex color used for main actions and identity. Maintain readable text and focus contrast. |
| <span id="chat-experience-accent-color"></span> **Accent color** | Hex emphasis color for interactive details. Do not rely on color alone to communicate state. |
| <span id="chat-experience-background-color"></span> **Background color** | Hex surface color behind widget content. Verify contrast with text, fields, and disabled controls. |
| <span id="chat-experience-corner-radius"></span> **Corner roundness** | Integer from 8 through 28 pixels applied to widget surfaces. Preview the extremes before saving. |
| <span id="chat-experience-show-logo"></span> **Show the brand logo** | Uses the public logo already configured for the brand. A private or broken logo URL cannot render in the widget. |
| <span id="chat-experience-show-powered-by"></span> **Show “Powered by Customer Help”** | On by default. Turning it off removes the footer attribution and has no billing effect. |

## Behavior fields

| Field | Values and consequence |
| --- | --- |
| <span id="chat-behavior-concurrent-chat-limit"></span> **Concurrent chats per agent** | Integer 1–100; defaults to 3. This is the maximum number of active conversations assigned to one available agent. |
| <span id="chat-behavior-offline-mode"></span> **Offline behavior** | **Show contact options** prevents message collection; **Collect a message** lets a visitor start a conversation outside human coverage. Review the offline text for the selected behavior. |
| <span id="chat-behavior-transcript-mode"></span> **Visitor transcripts** | **Off** or **Visitor opt-in**. Opt-in is off by default. A visitor can request one emailed transcript after the conversation closes. |
| <span id="chat-behavior-visitor-idle-prompt"></span> **Prompt an inactive visitor** | **Never** (the default), 5, 10, 15, 30, or 60 minutes. The clock starts after the latest agent or AI reply—not while the team or AI owes the visitor a response. A new agent or AI reply restarts it; a visitor message clears it. |
| <span id="chat-behavior-visitor-idle-close"></span> **Close if they do not confirm** | 1, 2, 5, 10, or 15 minutes after the prompt; defaults to 5. This field is disabled when prompting is Never. The durable deadline continues through page reloads, sleeping connections, and temporary network loss. Closure keeps the transcript under the normal retention policy. |
| <span id="chat-behavior-coverage-timezone"></span> **Time zone for older schedules** | Appears only for widgets that still use an older brand-level schedule. Choose the correct city or region time zone, then set coverage for each location when ready. |

## Visitor form, verification, and messages

- <span id="chat-visitor-open"></span> **Open Chat** expands the launcher into the panel, clears its displayed unread count, and marks the latest visible conversation activity as read. It restores an available saved conversation instead of creating a new one.
- <span id="chat-visitor-close"></span> **Close Chat** collapses the panel back to the launcher and stops the visitor's typing indicator. It does not end, delete, or unassign the conversation; opening the panel again returns to the same available session.
- <span id="chat-visitor-location"></span> **Choose a location** appears when the widget has more than one available location. The selection is required and sends the conversation to the team for that location; it does not change the visitor's browser location or any business setting.
- <span id="chat-visitor-name"></span> **Your name** follows the configured Ask for a name mode and accepts up to 80 characters. Optional may be left blank; Required must be completed before the chat starts. The name is saved with the conversation, so visitors should not enter private information.
- <span id="chat-security-verification"></span> **Security verification** is a one-time anti-spam check before a new conversation starts. Start Chat remains disabled until the check completes. If it expires or is rejected, complete it again. If it does not load, allow `https://challenges.cloudflare.com` in network and content filters, reload the widget, and retry once.
- <span id="chat-visitor-message"></span> **Visitor message** accepts required text up to 4,000 characters. Enter sends; Shift+Enter adds a line. Wait for the delivery state before resending after a connection interruption.
- <span id="chat-visitor-attachment"></span> **Visitor attachment** is available only when attachments are enabled. The same type and size rules apply to visitors and agents. Empty, oversized, and unsupported files are not accepted, even if their extension is changed.
- <span id="chat-transcript-email"></span> **Transcript email** appears after closure only when Visitor opt-in is enabled. It requires a valid address of up to 254 characters. The request sends at most one automatic transcript for that conversation; verify the address before submitting because the form does not change the account or conversation owner.
- <span id="chat-visitor-start"></span> **Start chat / Leave a message** validates the selected location, required name, and security check before creating the conversation. Leave a message follows the configured offline behavior; selecting the action does not promise an immediate human response.
- <span id="chat-visitor-handoff"></span> **Talk to an agent / Leave for an agent** appears only when the active AI mode permits human support. It records a human request and moves the conversation toward the eligible team; it does not guarantee that an agent is immediately available. Do not press repeatedly while the first request is pending.
- <span id="chat-transcript-send"></span> **Email transcript** submits the transcript address once. Wait for confirmation instead of repeating the request. If delivery cannot be confirmed, [contact support with the conversation time, brand, and location](/help/reference.md#reference-support).
- <span id="chat-visitor-new-chat"></span> **Start a new chat** leaves the closed conversation and returns to the start form. It does not delete the conversation history, and a new security check may be required.
- <span id="chat-visitor-retry"></span> **Try again** reloads Chat after a load error. Correct connection, allowed-origin, or content-blocking problems first; repeated retries do not fix an incorrect setting.
- <span id="chat-visitor-send"></span> **Send message** is enabled only for nonblank text in an open conversation. Wait for the Delivered or Failed status before deciding whether to retry.
- <span id="chat-visitor-still-here"></span> **I’m still here** appears only after the configured inactive-visitor interval. Selecting it confirms activity, hides the warning, and restarts the full prompt interval without adding a transcript message. Sending a regular visitor message has the same keep-open effect. If neither happens before the displayed grace period ends, Chat closes the conversation and offers a new chat.

While AI is thinking or streaming, Chat shows the AI typing state and does not replace it with a reconnect warning during brief socket changes. A reconnect warning means both live delivery and its short recovery window are unavailable; if a completed AI answer does not appear, keep the panel open, verify the network allows `wss://widget.customer.help`, and retry after connectivity returns.

## File fields

<span id="chat-files-enabled"></span> **Allow file attachments** controls visitors and agents together. When off, neither side can add a new file, but previously retained conversation files are not deleted.

<span id="chat-files-max-size"></span> **Maximum file size (MB)** accepts an integer from 1 through 25 and defaults to 10. Accepted types are JPG/JPEG, PNG, PDF, HEIC, and WebP. Renaming a file does not change its type.

## Availability tab

Most widgets manage coverage by location. A widget that still uses an older brand-level schedule may show these controls:

| Older schedule control | Effect |
| --- | --- |
| <span id="chat-widget-coverage-always-open"></span> **Use availability all hours** | Makes the widget available at every hour and ignores its day rows. |
| <span id="chat-widget-coverage-enabled"></span> **Day enabled** | Includes that weekday in the schedule. A disabled day has no coverage. |
| <span id="chat-widget-coverage-start"></span> **Start time** | Starts availability in the selected time zone. |
| <span id="chat-widget-coverage-end"></span> **End time** | Ends availability and must be later than Start. Split an overnight period across two days. |

Keep these settings accurate while they are visible. Confirm every location's time zone and set coverage by location when that option is available.

<span id="chat-installation-requirements"></span>

## Installation and approved origins

<span id="chat-installation-allowed-origin"></span> **Allowed origin** authorizes an external website to load this brand widget. Customer Help-managed pages are approved automatically. Enter the exact HTTPS origin, such as `https://www.example.com`, with scheme, hostname, and any nonstandard port, but no path, query, fragment, wildcard, sign-in information, or trailing content. `https://example.com` and `https://www.example.com` are different origins.

Install the copied snippet once, normally before `</body>`:

```html
<script
  async
  src="https://widget.customer.help/v1/loader.js"
  data-widget-id="chw_public_...">
</script>
```

### Content Security Policy requirements

If the external site sends a Content Security Policy (CSP), merge these sources into its existing policy. Do not replace the site's other directives.

| Directive on the site that installs Chat | Required source | Why it is needed |
| --- | --- | --- |
| `script-src` | `https://widget.customer.help` | Loads `/v1/loader.js`. Keep the site's existing sources, nonces, and hashes. |
| `script-src-elem`, when the policy defines it | `https://widget.customer.help` | A defined `script-src-elem` governs the loader `<script>` instead of `script-src`, so the widget host must also appear here. |
| `frame-src` | `https://widget.customer.help` | Displays the Chat panel. Add `frame-src` explicitly when a restrictive policy currently relies on `child-src` or `default-src` instead. |

A minimal host-page example is:

```http
Content-Security-Policy: default-src 'self'; script-src 'self' https://widget.customer.help; frame-src https://widget.customer.help
```

If the policy already defines `script-src-elem`, merge the same host into that directive as well:

```http
script-src-elem 'self' https://widget.customer.help
```

For a nonce-based policy using `'strict-dynamic'`, place the site's current per-response nonce on the copied loader element. Generate a new unpredictable nonce for every response; never paste the placeholder or reuse a fixed value:

```html
<script
  nonce="{{CURRENT_RESPONSE_NONCE}}"
  async
  src="https://widget.customer.help/v1/loader.js"
  data-widget-id="chw_public_...">
</script>
```

The host page does **not** need to add Customer Help to `connect-src`, `img-src`, `font-src`, or `style-src`, and it does not need to add Cloudflare Turnstile to its own `script-src` or `frame-src`. Do not add `'unsafe-inline'` solely for Customer Help. If the site sends more than one enforced CSP header, every applicable policy must permit the loader and Chat panel; one permissive header does not override another restrictive header.

### Network and content-filter allowlist

The parent-page CSP and a firewall, secure web gateway, DNS filter, browser extension, or privacy tool are separate controls. Network controls used by visitor browsers must permit:

| Scheme and host | Used for |
| --- | --- |
| `https://widget.customer.help` | Chat loading, messages, transcripts, and attachments. |
| `wss://widget.customer.help` | Live Chat updates after a conversation starts. |
| `https://challenges.cloudflare.com` | The one-time anti-spam check before a new conversation. |
| The public HTTPS host of the configured brand logo, when used | Loading that logo inside Chat. |

Chat does not request camera, microphone, or geolocation permission. Do not approve a wildcard origin or add a private key to make a blocked installation work.

### Verify the installation

1. Save the site's exact HTTPS origin under **Allowed origin**, including a nonstandard port when one is present.
2. Open a real page in a private browser window and confirm that the Chat launcher and panel appear. If the browser reports `403` for the Chat panel, verify the page's exact Allowed origin; loosening CSP will not approve an incorrect origin.
3. Confirm that security verification completes, then start a test conversation and send and receive a message. Test an attachment too when attachments are enabled.
4. Return to Chat Settings and confirm **Last seen** updates for the installed widget.
5. Read CSP console errors literally: a blocked loader points to `script-src` or `script-src-elem`; a blocked Chat panel points to `frame-src`; a security-check failure points to access to `challenges.cloudflare.com`; and repeated reconnecting may indicate that `wss://widget.customer.help` is blocked. Use `Content-Security-Policy-Report-Only` to evaluate a proposed policy before enforcing it, but remember that a report-only policy does not grant access blocked by an enforced policy.

Chat remembers an active conversation when the visitor closes and reopens the panel. It receives the page title and path, but not query strings or page fragments. Never add a password, secret, or private key to the snippet. **Last seen** updates after a real page at an approved origin successfully loads the widget.

## Permissions, billing, and customer visibility

Only Administrators can configure Chat. Enabling a location adds the displayed Chat charge after confirmation. Saved widget text, appearance, coverage, offline behavior, attachment availability, and transcript choice can affect customers immediately. Allowed origins and widget IDs may be shared with the people installing Chat, but never publish passwords, secrets, or private account details.

## Troubleshooting

- **Location checkbox disabled:** confirm the location is active and billable and the main subscription shows **Active** or **Trial**.
- **Save and confirm disabled:** set a valid location time zone.
- **Widget does not appear:** confirm the exact Allowed origin, copied widget ID, HTTPS, CSP permissions, and whether **Last seen** updates.
- **Pending or Retry needed:** the billing change has not been confirmed. Follow the action shown with the status without repeatedly changing the checkbox.
- **Offline at the wrong time:** verify the location time zone, coverage mode and hours, saved confirmation, agent availability, and any older schedule still shown in Availability.
- **Save conflict:** reload the newest widget settings, reapply changes, and save once.
