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

# WebChat

> Set up, customize, and embed the BoundBot WebChat website chat widget.

export const BrowserWrapper = ({src, alt, title, description, height = '280px', caption, imgStyle = {}, children, imagePadding = '0px'}) => {
  const legacyDocsImagePrefix = '/images/';
  const productionDocsImagePrefix = '/docs/images';
  const rawSrc = typeof src === 'string' ? src : src && (src.src || src.default) || '';
  const imageSrc = rawSrc.startsWith(legacyDocsImagePrefix) ? `${productionDocsImagePrefix}/${rawSrc.slice(legacyDocsImagePrefix.length)}` : rawSrc;
  return <Frame caption={caption || alt || title} width="100%">
      <div style={{
    border: '1px solid #e2e8f0',
    borderRadius: '12px',
    overflow: 'hidden',
    boxShadow: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
    width: '100%'
  }}>
        <div style={{
    backgroundColor: '#f8fafc',
    padding: '10px 15px',
    borderBottom: '1px solid #e2e8f0',
    display: 'flex',
    gap: '6px'
  }}>
          <div style={{
    width: '10px',
    height: '10px',
    borderRadius: '50%',
    backgroundColor: '#ff5f56'
  }} />
          <div style={{
    width: '10px',
    height: '10px',
    borderRadius: '50%',
    backgroundColor: '#ffbd2e'
  }} />
          <div style={{
    width: '10px',
    height: '10px',
    borderRadius: '50%',
    backgroundColor: '#27c93f'
  }} />
        </div>
        <div style={{
    overflow: 'hidden',
    background: '#ffffff',
    width: '100%',
    padding: imagePadding
  }}>
          {src ? <img src={imageSrc} alt={alt || ''} data-docs-screenshot style={{
    ...imgStyle,
    width: '100%',
    minWidth: '100%',
    height: 'auto',
    display: 'block',
    borderRadius: '0px'
  }} /> : children ? children : null}
        </div>
      </div>
    </Frame>;
};

WebChat is the fastest way to put BoundBot in front of customers. It creates an embeddable widget backed by a public key, optional origin restrictions, and a customizable UI.

## Create a channel

<BrowserWrapper src="../images/webchat-create.png" alt="WebChat create channel modal: bot, display name, and allowed origins." caption="Set up your bot, display name, and allowed origins." />

Open <a href="https://www.boundbot.com/dashboard/channels/webchat" target="_blank" rel="noopener noreferrer"><b>Channels</b> -> <b>WebChat</b></a> and click **Connect WebChat**.

Set these fields:

* **Bot**: the bot that should answer on this widget
* **Widget display name**: the channel label shown inside setup and UI flows
* **Allowed origins**: optional list of domains that are allowed to embed the widget. If you are **unsure** of the exact origins or you are **testing locally**, leave this field **empty** so the widget is not blocked by a mismatch—this avoids connectivity and **Origin not allowed** issues until you lock in production domains.

If you finished onboarding, you may already have a default WebChat channel ready to review instead of creating a new one.

<Tip>
  If you saved an incorrect origin or you are testing locally, keep **Allowed origins** empty to avoid **Origin not allowed** errors. Add origins only when you are ready to restrict embedding to specific production domains.
</Tip>

## What you manage on the channel page

From the WebChat channel table, you can manage:

* the bot assignment
* channel status
* public key usage
* allowed origins
* key rotation on supported plans

<BrowserWrapper src="../images/webchat-connect.png" alt="WebChat channel table: public keys, status, and allowed origins." caption="Manage your public keys, status, and origins from the WebChat dashboard." />

## Customize the widget

Open <a href="https://www.boundbot.com/dashboard/settings/general" target="_blank" rel="noopener noreferrer"><b>Settings</b></a> -> <a href="https://www.boundbot.com/dashboard/settings/customize-widget" target="_blank" rel="noopener noreferrer"><b>Customize Widget</b></a> or <a href="https://www.boundbot.com/dashboard/chat-experience/customize" target="_blank" rel="noopener noreferrer"><b>Chat Experience</b> -> <b>Customize</b></a>.

You can change:

* theme
* height
* position
* border radius
* primary color
* bubble label
* bubble text color
* starter suggestions

The current customization flow also generates production iframe embed code for the selected WebChat channel.

## Test before embedding

Use <a href="https://www.boundbot.com/dashboard/playground" target="_blank" rel="noopener noreferrer"><b>Playground</b></a> to test the exact bot and WebChat combination before you install the widget on a live site.

If a conversation is muted for human handoff, WebChat will stop sending AI replies in that thread until your team turns auto reply back on from <a href="/guides/inbox">Inbox</a>.

## Embed on your site

When you are ready to install, use the embed guide in <a href="/developers/embed-webchat">Embed WebChat</a>. If your site runs on WordPress, you can also use the <a href="/developers/wordpress-plugin">WordPress plugin</a>.

<Tip>
  When your production domains are known and stable, add them to **Allowed origins** early so only those sites can embed the widget. Until then, leaving the field empty keeps local and staging tests working without origin errors.
</Tip>

## Related pages

<CardGroup cols={2}>
  <Card title="Embed WebChat" icon="code" href="/developers/embed-webchat">
    Install the widget on your site with the iframe or script pattern.
  </Card>

  <Card title="Playground" icon="flask-conical" href="/guides/playground">
    Test the live WebChat pipeline before you publish it.
  </Card>

  <Card title="Quickstart" icon="rocket" href="/quickstart">
    Follow the fastest setup path from onboarding to a working website chat.
  </Card>

  <Card title="Website sources" icon="globe" href="/guides/websites">
    Keep the bot aligned with your site content before you send production traffic.
  </Card>
</CardGroup>
