Deployments
How to deploy your AI agent as a website chat widget, an internal team chat, or a phone agent. Covers channels, models and failover, access control, widget customization, voice settings, phone numbers, and data residency.
A deployment is how your AI agent reaches the people who talk to it. It connects a configured Agent to a specific channel, gives you channel-specific settings (look and feel, voice, access control), and assigns the AI model that powers that channel.
You manage deployments from an Agent's Deploy tab. All deployments for an agent are listed there, each on its own card. They share the same Agent configuration and Knowledge Base: changes to the system prompt or knowledge base apply to every deployment instantly.
Who can manage deployments
| Action | Required role |
|---|---|
| View deployments | Builder, Admin, Owner |
| Create, edit, delete | Admin, Owner |
| Manage phone numbers (buy, assign, release) | Admin, Owner |
Members cannot see the Deploy tab's deployment controls. Builders can view deployments but cannot change them.
Channels
botts.ai has three live channels today. Three more appear in the channel picker but are not yet available: they are greyed out with a Coming Soon badge.
| Channel | Status | What it is |
|---|---|---|
| Website | Live | A chat widget embedded on your public website. |
| Chat (Internal) | Live | A chat for your own organization members, with access controls. |
| Phone | Live | A voice agent reachable on a real phone number. |
| Telegram | Coming soon | Greyed out in the picker. |
| Coming soon | Greyed out in the picker. | |
| Coming soon | Greyed out in the picker. |
Creating a deployment
- Open your Agent and go to the Deploy tab.
- Click New Deployment to open the channel picker.
- Pick a channel tile.

Some tiles can be disabled for your org:
- On the Personal plan, every channel except Chat (Internal) is disabled with an Upgrade to Business badge. External deployments that already exist show the same badge on their card. They can't be opened or switched back on (only deleted), and they don't answer until the organization is on Business or higher.
- Phone is disabled with a No quota badge when you have no remaining phone-number quota and no spare pooled number.
- Chat (Internal) is disabled with an already configured badge once the agent has an internal chat. Each agent can have only one internal chat.
There is also an overall deployment limit tied to your plan. If you reach it, creating a deployment is blocked with a message to upgrade your plan to add more.
Each card in the deployment list shows the channel, the deployment name (hidden for internal chat), the model name, a data-assessment shield badge, the deployment ID, and an active/inactive toggle plus a delete button. Phone cards also show the access-mode badge and the assigned number (or "No phone number assigned").
Choosing a model
Every deployment runs on one primary AI model, which is required. You pick it from a model picker when you create or edit the deployment. Model text rates are shown per 1,000 words in the picker, and usage is billed in credits.
A few rules govern which models you can choose:
- The list is filtered by your organization's data-residency setting. Under a strict setting the list can be short or even empty. See Data residency below.
- Phone deployments require a voice model. Every other channel requires a text model. The pickers pre-filter accordingly, and the backend rejects a mismatched model (for example, "Phone deployments require a GPT Live voice model" or "Voice models can only be used for phone deployments").
- Changing the model takes effect immediately, with no downtime, for website and phone deployments. In Chat (Internal), new chats use the new model, while conversations that already exist keep the model they started on. A changed backup model applies to all of them right away.
If a model you already selected later becomes non-compliant with your residency setting, the deployment keeps running on it but is flagged with an amber Server location badge on its card (see below). botts.ai never silently changes your model.
Backup model and failover
Website and Chat (Internal) deployments can also have an optional backup model, chosen from a second picker. When the primary model's provider is unreachable, requests transparently fail over to the backup, so a provider outage doesn't take your chat down.
Failover is text-only. Phone deployments have no backup model because voice failover is not supported.
A few constraints apply to the backup:
- It must be a different model from the primary.
- It must be a text model (not voice).
- It must satisfy the same data-residency setting as the primary, because it serves real traffic during an outage.
- If the primary can read images and the backup can't, the picker warns: "This backup can't see images. A message with an image attached won't fail over to it." Such messages are answered by the primary only.
Choosing a backup on the same provider as the primary gives you little protection: if that provider is down, both models are down. The picker shows an amber warning in this case.
Failover triggers only when the provider fails to answer:
- HTTP 5xx server errors
- HTTP 429 rate-limit / quota errors
- Connection-level failures: timeouts, network unreachable, DNS failures
- The specific case of a 400/404 saying the model itself was decommissioned or is invalid (a different backup model can still serve the request)
- An empty generation: the provider returns success but no reply at all. This is retried first, and failed over if it happens again.
- A stalled model: the provider accepts the request but sends no first word within 30 seconds. This is not retried on the same model and goes straight to the backup.
- A conversation that has grown past the primary model's context window but still fits a backup with a larger one is answered by the backup.
It does not fail over on other client errors (bad requests, authentication, validation). Those would fail the same way on the backup, so retrying would only add latency.
A model that fails in one of these ways three times in a row is skipped for several minutes. Requests go straight to the backup, or, without a backup, end at once with an error that the model isn't responding, instead of waiting for another timeout. After the pause, the next request tries the model again. Failover happens before the reply starts to appear. Once words have reached the reader, the answer is not switched. Scheduled task runs are the exception: nobody reads along, so they can switch to the backup mid-turn unless the agent already ran a tool that changes something outside botts.ai.
Why empty generations count
A provider that answers with nothing used to end the turn silently, which reads to the customer as the agent ignoring them. Treating it as a failure means it is retried, and then answered by the backup model, instead of being lost.
Website widget
The website widget is a customizable chat bubble that sits on your public site, by default in the bottom-right corner. Visitors click it to chat with your agent. Website deployments are public. There is no access mode; access is controlled by the embed/API key.
Create
When you pick Website, a short form asks for the Deployment Name (defaults to Website <date>), the Model (text-only) and an optional Backup Model. Click Create Deployment. The widget starts with default styling: an indigo header and user bubble (#6366f1), a white chat background, a light-grey bot bubble, bottom-right position, and no welcome message or suggested messages. Open the deployment from the list to customize it in the editor.
Edit: the split-pane editor
Opening a website deployment shows a split-pane editor.
The left panel is one page of collapsible sections, in the style of the agent's Configure screen. Only the first section is open at the start; the others can be opened independently. A closed row shows a short badge with its current setting (the model, the launcher style, the number of suggested messages) and an amber dot when it holds unsaved changes. The right panel is a live preview that updates as you change styling. Opening Launcher, Placement & extras or Install switches the preview to the closed widget; opening any other section opens the widget in its configured default opening mode. The Expand / Widget View button switches it by hand.
The sections, top to bottom:
| Section | Options |
|---|---|
| Model | Model, optional backup model, deployment name |
| Look | Title, logo, header, chat-area and message-bubble colors, then under Advanced settings fonts, header and footer details, including Footer Text and Privacy Link |
| Text | Welcome message, suggested messages |
| Launcher | Style (Bubble, Bubble with message, Card with buttons), launcher message and colors, initial state |
| AI voice | Enable (opt-in), default opening mode, voice, hold sound, welcome message |
| Placement & extras | Position (left / right), size (s / m / l), link previews, feedback, language, loading animation |
| Install | Embed snippet with the API key |
The onboarding editor and the public sandbox keep their Design / Behaviour tabs; the sections above apply to the dashboard.
Link previews can be enabled and limited to a list of allowed domains, so links the agent sends render as rich previews in the widget.
Footer. Under Look, Advanced settings holds the footer. Footer Text replaces the default line, "Powered by" with the botts.ai logo, and is shown as plain text. Privacy Link is where the footer's Privacy link points. Set it to your own privacy policy, using the full address that starts with https://: as the website operator, you are the data controller for your visitors' chats. If it is empty, the link opens botts.ai's generic chat-widget privacy notice.
Important
Widget changes are not auto-saved. The live preview updates instantly, but you must click Save Changes in the sticky footer to persist them. Cancel closes the editor and discards unsaved edits, except a logo upload or removal, which is applied the moment you do it.
Launcher
The Launcher section decides what visitors see while the widget is closed:
- Bubble (default): the round button. With AI voice on, visitors reach voice from the Talk | Chat switch in the chat window header.
- Bubble with message: the round button plus a message that pops out until the visitor opens the chat or dismisses it. Clicking the message opens the chat. The message text and its colors are set here; on desktop it is skipped when the initial state is Open, since the chat is already open.
- Card with buttons: the avatar, the launcher message as headline, and a Chat button, plus Talk when AI voice is on. Visitors can minimise the card to the round button; the browser remembers that choice, so test in a private window.
The Initial State (closed or open on first visit) lives in the same section.
AI voice (optional)
Visitors can talk to the agent instead of typing. The option is off by default and is switched on per widget, under AI voice in the editor (the public sandbox editor does not offer it).
With voice enabled:
- The Card with buttons launcher gains a Talk button next to Chat (see Launcher above; the bubble styles are unchanged). The open widget's header shows a Talk | Chat switch when voice is on, and a More menu (the three dots) with Start a new conversation, Expand chat (not shown on phones) and Close on every widget.
- The start step is titled with the assistant's name ("Talk to Sam", from the widget title, else the bot name) and reads "Speak instead of typing." Nothing is recorded until the visitor clicks Start voice. Only then is the microphone requested and the voice service contacted. The Default opening mode "Voice, ready to start" opens the widget on that start step; it never starts the microphone on its own. Voice processing runs outside Switzerland: GPT Live is a Microsoft Azure OpenAI resource in Sweden Central deployed as a global deployment, so audio may be processed in Azure regions worldwide, including outside the EU, while transcripts are stored in Switzerland. The operator is told so when enabling the option and is responsible for informing visitors in the site's privacy notice, which the widget links to. The deployment card's data assessment (the green shield) lists the voice model's hosting and company when voice is on. A launcher choice always wins: Chat opens the chat, Talk opens the voice start step.
- The Voice picker chooses which of the eight voices visitors hear (samples play in the editor; the phone form has the same picker). The Hold sound plays while the agent looks something up (see Hold sound), and the Welcome message is spoken as soon as a visitor starts voice on a new conversation. Leave it empty and the AI waits for the visitor to speak first. Its language sets the language of the voice session. Like the phone greeting, it is recorded in the background when you save, and then plays the moment a visitor starts voice. With Language on Automatic, the greeting is recorded per visitor language the first time someone starts voice in that language, so that first session hears it spoken live.
- The voice panel is a single row: what is happening on the left, the buttons on the right. Before a session it shows Start voice; while talking, Mute and End voice. End voice closes the session and returns to the start step; switching the header to Chat returns to text at any time and ends a running session.
- Text and voice share one conversation. What was typed earlier is context for the voice session, and what is said appears in the same history, so the conversation can continue by text afterwards.
- Voice sessions run on GPT Live (Microsoft Azure OpenAI, Sweden Central, global deployment) and are billed per minute of voice plus the backend model's tokens, separately from text. Voice needs a plan with external channels and available credits; the widget's own model stays a text model. A voice session ends after 10 minutes, or after 90 seconds in which the visitor says nothing. The visitor can start it again or continue in text. Because voice is hosted in Sweden by a US company, it is not available when your server location is set to Swiss server by Swiss company, Swiss server, any company or European server by European company. Visitors then see "Voice is temporarily unavailable" and can continue in text.
- Dictation in the composer (the microphone icon that transcribes a single message) is a separate feature and is unchanged.
With AI voice on, the privacy policy behind your Privacy Link should describe the voice processing. botts.ai's generic notice, used when the link is empty, already does.
Language
The widget's own labels and buttons exist in English, German, French and Italian. Language under Placement & extras is Automatic by default: the widget follows the language of the page it is on (the page's lang attribute), then the visitor's browser, and falls back to English. Pick a fixed language for sites that do not set the page language. The welcome message, suggestions and launcher message are shown exactly as written, so a multilingual site uses one widget per language.
Embed code
Copy the embed snippet from the editor and paste it into your site's HTML, just before the closing </body> tag:
<script async src="https://api.botts.ai/widget/chat-widget.js?key=YOUR_API_KEY"></script>
The snippet is keyed by the deployment's unique API key (the key query parameter), loads asynchronously, and works on any platform: WordPress, Shopify, Squarespace, Wix, or custom HTML. A copy button is provided. Step-by-step guides for WordPress, Wix, Squarespace, Shopify, Webflow, Jimdo, TYPO3 and Google Tag Manager are under Add to Your Website. If someone else maintains the site, send them the code.
A visitor's conversation is restored when they return to the site. Links in answers get a preview card; parameters that look like tokens or keys are stripped from the address before the preview is fetched, and the card still links to the original address.
API key
A website deployment has a unique API key (prefixed bts_) that authenticates widget requests. The key is public by design: it sits in your site's page source and only works for this deployment's widget. The dashboard has no way to replace it; if you want a fresh key anyway, create a new website deployment and swap the embed code. The key is revealed on request rather than listed with the rest of the deployment, so it is not handed out with every read of your deployments.
Note
Keys exist only for public channels, which today means the website widget. Internal chat and phone deployments have no API key and never need one: internal chat reaches signed-in members, and phone calls arrive over the telephony network, which a widget key plays no part in. Asking for a key on those channels returns "not applicable for this channel", and a key can never be used to reach them.
Chat (Internal)
Chat (Internal) is a chat channel for your own organization members rather than the public, for example a team-facing assistant over your knowledge base. Each agent can have only one internal chat.
Configuration:
- Model (text-only) and optional backup model.
- Chat Picture (optional): a round picture shown in the internal chat header for this agent.
- Description: optional text shown below the title when a chat starts.
- Show Tool Use: a toggle (on by default) that shows members which tools the agent is using as it works.
- File upload: a toggle that lets members attach documents to the chat for the agent to read. See Attaching documents.
- Access control: see below.
The default name is Chat Internal and is hidden on the deployment card.
Access control
Access modes apply to Chat (Internal) and Phone. Website deployments have no access mode (they're public via the embed key).
| Mode | Who can use it |
|---|---|
| Public | Anyone. Offered for Phone only. |
| Organization | Any member of your organization. |
| Role-based | Members at or above a minimum role (Admin or Builder). |
| Invite-only | Only the specific members you select. |
- Phone offers all four modes and defaults to Public.
- On Phone, every mode except Public identifies the caller by caller ID. The number must match the Work Phone or Personal Phone on a member's profile (Your account settings). Callers who withhold their number, match no member, or lack the role or invitation the mode requires hear a short spoken "Access denied" message in English, and the call ends.
- Chat (Internal) offers Organization, Role-based, and Invite-only (no Public) and defaults to Organization.
- Role-based reveals a minimum-role picker (default Builder).
- Invite-only reveals a member checkbox list.
Phone agent
A phone deployment answers real phone calls with a voice model. Customers dial the assigned number and speak with the agent. The voice model is GPT Live 1: full duplex, so it listens while it speaks, keeps talking while tools run and handles interruptions itself. Calls are billed per minute of call plus the tokens of the text model that runs the agent's tools.
Create
Selecting Phone creates the deployment immediately; there's no create form first. You'll see a brief "Creating phone deployment…" spinner, then the edit view. botts.ai auto-picks a voice model (the one you selected if it's a voice model, otherwise the first available voice model). If your org has no voice model available, creation fails with "No voice model is available for phone deployments." The default name is Phone <date>, and the default access mode is Public.
Voice and model settings
The phone edit form shows a voice-only model picker, a voice picker with samples, and a single-line welcome message (the agent's opening line). The default voice is Gleam; all eight voices are on the voices page. There are no turn-detection or noise settings: GPT Live 1 decides when the caller has finished speaking. Leave the welcome message empty and the agent waits for the caller to speak first. When you save a change to the welcome message, the voice or the language, botts.ai records the greeting in the background. From then on, the recording plays the moment a call connects, so callers hear the greeting without a pause. A call that comes in before the recording is ready hears the greeting spoken live. A greeting that takes longer than 20 seconds to say is not recorded and is spoken live on every call. The recording is a short GPT Live session and is billed like a call. It is spoken with the agent's instructions, in the line's language or, on Auto, the language the welcome is written in. Under the welcome message, Recorded greeting plays the recording of the welcome as it is in the form, saved or not. Generate 3 samples records three takes of it, each billed like the recording on save; listen to them and click Choose on the one that sounds best. A take chosen for the saved welcome plays on calls right away. One chosen for an edited welcome goes live when you save, and the save then records nothing extra. An organization can record up to 12 greetings per hour.
Advanced settings
| Setting | Options / default |
|---|---|
| Language | Auto, English, German, French, Italian (Auto by default). The language the call is expected in: the greeting and the first turns start in it, the agent still follows a caller who clearly speaks another language, and recordings are transcribed in it. |
| Hold sound | Keyboard typing (default), Futuristic loading 1, Futuristic loading 2, or None. See Hold sound. |
| Record calls | Off by default |
| Max call duration | In minutes, 10 by default. 0 removes your own limit, but a call still ends after about 58 minutes, the longest a GPT Live session runs. |
The live transcript comes from GPT Live 1 itself. Recording is off unless you enable Record calls.
Hold sound
While the agent looks something up (a knowledge search or another tool), the caller hears the hold sound instead of silence, so the line does not seem dead. The agent's own "one moment" plays first, the sound fills the wait after it, pauses while the caller speaks, and stops as soon as the answer starts. It never delays the answer.
Choose it under Advanced settings on a phone line and under AI voice in the widget editor: Keyboard typing (the default), Futuristic loading 1, Futuristic loading 2, or None for silence. The play button next to each sound plays the loop as callers hear it; all of them play at the same quiet level.
How a call ends
The agent ends the call only when the caller says goodbye or asks to hang up. It says goodbye once, then hangs up. It never ends a call on its own initiative. Otherwise the call runs until the caller hangs up or Max call duration is reached. On the phone, the agent does not read out long links, tokens or codes. It tells the caller where to find them instead.
Call transfer
Turn on Transfer calls to your team in the phone edit form to let the agent put a caller through to a person. It is off by default.
- Who can take calls: up to 10 people or teams, each with a name, a phone number and a short "when to transfer" description. The agent only sees the names and descriptions, never the numbers, so a caller can't make it dial anything else.
- When nobody picks up: if the call isn't answered, or it's outside opening hours, the agent either takes a message with a form (it lands in the agent's Forms tab, same as in chat) or ends the call after saying nobody is available right now. Pick the form under the option: the Contact template or one of the agent's own forms from Form / Lead Capture. The number the caller is calling from is attached to the message. While the agent has no form, the call ends instead.
- Opening hours: the weekdays and times transfers are offered, in the time zone shown under the times. Mark a destination under Still transfer outside opening hours to to keep it reachable around the clock, for example an emergency line.
- More options: how long it rings (15, 20 or 30 seconds), and Tell your team who's calling, a one-sentence summary played to the team member before the caller is connected. Your team always sees this line's number, not the caller's: carriers reject transferred calls that show the caller's own number.
If the team member's phone forwards to voicemail, the caller reaches the voicemail. Transferred calls end after 60 minutes.
Phone numbers
Phone numbers are an org-level resource managed by Admins and Owners. You buy numbers into an organization pool, then assign a pooled number to a phone deployment. Managing numbers is blocked for Builders and Members. Manage the pool on Phone Numbers in the sidebar, or buy and assign a number directly from a phone deployment.
Supported countries
In the dashboard you can buy local phone numbers in Switzerland (the default) and the United States. Pick an area code from the list or leave it on Any area code. Only voice-capable numbers are shown. Before buying, you confirm that you commit to the number for at least 30 days.
Quota
Each organization has a phone-number limit. The picker shows used / limit. When you've used your full quota, buying a new number is blocked with "Phone number quota exhausted… Contact support to increase your limit."
Assign and unassign
- Assigning a pooled number to a deployment is free and instant. It wires the number's voice webhook to that deployment. A number can hold only one deployment, and a deployment can hold only one number.
- Unassigning returns the number to the pool and clears its webhook.
- Deleting a deployment automatically unassigns its number back to the pool (it is not released).
- Deleting an agent also returns its deployments' numbers to the pool.
Releasing a number
Releasing a number back to the carrier removes it from your pool entirely. A number must be unassigned first, and it cannot be released until 30 days after you bought it (the carrier's hold period). Numbers are released on Phone Numbers in the sidebar's Organization section (Owners and Admins; not shown on the Personal plan). The page lists every number with its country, status (Assigned or Available) and purchase date. From there you can Buy Number into the pool, Unassign a number or Release it. Release stays disabled until the hold period is over; hover it to see the date.
Data residency and transparency
Every deployment exposes where its data physically lives, and your organization can require models hosted in specific places.
Residency tiers
Your organization's Server Location setting (organization settings) filters which models you can pick.
| Tier | Requirement |
|---|---|
| Swiss server by Swiss company | Hosted in Switzerland by a Swiss company. |
| Swiss server, any company | Hosted in Switzerland (any company). |
| European server by European company | Hosted and operated in Switzerland or the EU. |
| European server, any company | Hosted in Switzerland or the EU. |
| Global (default) | No restriction. |
Switzerland counts as European but is not part of the EU. If a model violates a non-global tier, selecting it is rejected ("Selected model is not allowed by your organization's data-residency setting"). The backup model is checked against the same tier when you set it. A model you already chose is not re-checked on save. If it later becomes non-compliant it keeps running but is flagged.
GPT Live, the voice model for phone and widget voice, is hosted in Sweden by a US company. It is available only under European server, any company and Global. Under the other three settings, phone deployments can't be created ("No voice model is available for phone deployments.") and widget voice is switched off for visitors.
Data assessment badge
Each deployment shows a small emerald shield badge summarizing the countries where its data sits. Hovering reveals a transparency panel.

The panel lists:
| Row | Value |
|---|---|
| Model hosting | The model's hosting country |
| Hosting company | The model provider's country |
| Backup hosting / company | Shown only when the backup differs from the primary |
| Phone provider | United States (phone deployments only) |
| Voice model hosting / company | Sweden (Microsoft Azure), processed globally / United States, website widgets with AI voice on |
| Global Azure deployment | A note under Model hosting for GPT Live phone deployments: processed in Azure regions worldwide |
| Web search | France (Staan.ai), only when the agent has web search enabled |
| Appointment booking | USA (Cal.com), only when the agent has the calendar booking tool |
| botts.ai Server | Switzerland |
| Knowledge base | Switzerland, only when the agent has a knowledge base |
| Chat storage | Switzerland |
| Model training | Off, botts.ai does not train on your data |
The panel's How your data is handled link opens a data-residency explainer.
Four capabilities can leave Switzerland
Whatever model you choose, four capabilities route data abroad by their nature and are disclosed as their own rows: phone calls through a US telephony provider, web search through a French search provider, appointment booking through Cal.com in the US (only when the agent has the calendar booking tool), and AI voice (phone on GPT Live, or the website widget's voice option) through Microsoft Azure OpenAI in Sweden as a global deployment, where audio may be processed in Azure regions worldwide. Each appears only when the deployment actually uses it, so an agent with web search switched off has no French row, an agent without calendar booking has no USA (Cal.com) row, and a widget without voice has no Sweden row. Everything else, including your knowledge base and chat history, stays in Switzerland.
Managing multiple deployments
You can run several deployments on the same agent, for example a public website widget and an internal team chat, or separate phone numbers for different countries. Each deployment has its own channel, model, and settings (and, for the website widget, its own API key), but they all share the same Agent and Knowledge Base. Each card has an active/inactive toggle so you can pause a deployment without deleting it. An agent can only be deleted once all its deployments are inactive. Deleting it keeps those deployments with their conversation history and returns their phone numbers to the pool. If a deployment still holds a number, a Builder has to ask an Admin to unassign it first.
Last updated on October 28, 2026