docs/main/administration-guide/configure/calls-deployment-guide.mdx
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
<PlanAvailability slug="all-commercial" />This guide walks System Administrators step-by-step through deploying Mattermost Calls, from preparation and network readiness through to pilot testing and production rollout. You'll find clear decision points, verification checks, and troubleshooting tips to help you confirm each phase of the deployment is working before you move on.
No prior experience with Mattermost Calls is required - this guide assumes you're starting fresh and will introduce essential concepts and best practices.
Mattermost Calls offers self-hosted audio calling and screen sharing, enabling sovereign real-time collaboration fully contained within your infrastructure. This means no call media or metadata traverses third-party systems.
Calls is uniquely suited for mission-critical operations across defense, intelligence, security and critical infrastructure - where data sovereignty, control, and compliance are non-negotiable. It is designed to function in isolated networks without internet access, supporting deployments that demand full airgap compliance.
Functionality includes:
This guide is organized into sequential deployment phases with numbered steps. Each phase begins with prerequisites and ends with verification checks. Before you begin any phase, make sure the listed prerequisites are met, then move to the next phase only after the verification checks are passing. This structure helps you catch and fix issues early, when they are easiest to isolate.
Deployment Phases:
Choose your deployment architecture, make networking decisions, provision required servers, and confirm the required network ports and paths are open before deployment.
Complete the installation and configuration for the deployment architecture you selected in Phase 1. You will only follow one path:
Path A: Configure Integrated Calls
Use the built-in Calls service on the Mattermost server for simpler deployment at small scale.
Path B: Install and Configure RTCD (Optional)
Use the RTCD (Real-Time Communication Daemon) service for larger scale production deployments. RTCD offloads media processing tasks from the Mattermost server for optimized performance and scalability.
Install and Configure Recording (Optional)
Calls Offloader is a service required to deliver recording, transcription and live captions.
Expand testing to a small group of pilot users to watch for client, network, and environment-specific issues under real usage.
Rollout to all users in controlled waves with appropriate communication and monitoring, and be ready to pause or roll back if needed.
Use this checklist to confirm you have the infrastructure, skills, and access required before you begin deploying Calls. Completing these prerequisites now helps prevent delays caused by missing dependencies later in the deployment process.
You have a running Mattermost server on v10.0+.
See System Information to check your Mattermost edition and version.
Your Mattermost server is configured to use HTTPS.
See Configure TLS if you need to set up HTTPS.
You know how many active users you have in your current Mattermost deployment
See Site Statistics to access usage metrics.
You can provision at least one dedicated Linux server or VM if you plan to use the RTCD service.
See Infrastructure Decisions (Step 1.2) if you're unsure if you need RTCD.
You can provision a dedicated Linux server or VM for the calls-offloader service if you need recording, transcription, or live captions.
You are prepared to deploy a TURN server if your users cannot reliably reach the media service on UDP or TCP 8443.
See Networking Decisions (Step 1.3) if you're unsure if you need a TURN server.
You have the appropriate Mattermost edition and license for the features you need:
You are comfortable with basic Linux administration, or you have someone available who is. You will need to connect to servers over SSH, edit configuration files, manage systemd services, inspect logs, and run shell commands.
You have System Admin access to your Mattermost server.
See Mattermost roles to learn about roles and permissions.
You know how end users will connect to Calls (From private networks, VPN, or from the public internet)
This impacts your networking decisions (Step 1.3)
You can open the required inbound and outbound firewall rules, or you can engage the network or security team that manages them.
You know how to open a request with Mattermost support if you encounter issues.
Please include the exact step number (e.g. 2A.2.1) that failed, along with your Mattermost support packet and Calls logs.
If you need expert help deploying Calls, contact your Account Manager or talk to a Mattermost expert to learn about professional service offerings.
</Note>Before you start, confirm the following:
You know how many active users you have in your current Mattermost deployment.
You know whether recording, transcription, or live captions are required for your deployment.
You can provision additional servers if your chosen architecture requires RTCD or Recording services.
You can open inbound and outbound network ports on the servers involved in your deployment.
If a network or security team manages your firewalls, you'll need to involve them before continuing.
Here you will make two important infrastructure decisions: First you'll choose your media processing architecture, then decide whether you need recording. Reference topology for each architecture is provided.
Integrated
This is the simplest deployment model, since you do not need to provision a separate service to handle media processing. In Integrated mode, the Calls plugin runs its built-in media service directly on the Mattermost server.
RTCD
RTCD is a dedicated real-time communications service for Mattermost Calls that processes call media outside the main Mattermost server. In most production deployments, RTCD is the recommended deployment model because it improves performance, scalability, and stability by isolating call traffic and reducing load on the Mattermost server.
To determine if you'll need RTCD, start by answering the following questions about your deployment:
Use the tabs below to view the reference architecture for each deployment model:
<Tabs> <TabItem value="integrated" label="Integrated">An Integrated deployment does not require any additional infrastructure:
When to use it
Components
License
The Recording service (calls-offloader) can optionally be added to an Integrated Calls deployment if you need to enable recording, transcription, and live captions.
Reference architecture when using the Recording service with Integrated Calls:
Components
License
An RTCD Server is added as a dedicated media service that processes all call audio and screen sharing media.
The Mattermost server is still responsible for signaling (setting up, managing, and ending calls) and channel state (who is joining or leaving, who has muted, and overall call status), but the call media itself flows directly between clients and the RTCD server, completely bypassing the Mattermost server.
When to use it
Use RTCD if you need optimized performance, scalability, and the best possible user experience for Mattermost Calls. Specifically:
Components
License
The Recording service (calls-offloader) can optionally be added to an RTCD Calls deployment if you need to enable recording, transcription, and live captions.
Reference architecture when using the Recording service with RTCD:
Components
License
For most production deployments that need recording, RTCD plus calls-offloader is the recommended combination because it keeps call media off the Mattermost server and scales more predictably.
STUN is a protocol that helps the media server discover its public IP address automatically so remote clients can connect to Calls.
Mattermost provides a default STUN server (stun.global.calls.mattermost.com). No call media or signaling traffic is sent through this service; it is used only for STUN lookups. Use this decision tree to determine if you need to allow outbound access from your media server to the Mattermost global STUN service for public IP discovery.
Your media server is the Mattermost server in the case of an Integrated Calls deployment, or it's the RTCD server in the case of an RTCD Calls deployment.
</Note>STUN Decision Tree
Are all users and your media server in the same private network, VPN, or air-gapped environment, with no outside clients?
Does your media server have a stable public IP address or DNS name that clients on the public internet can reach?
stun.global.calls.mattermost.com.If your deployment requires STUN for public IP discovery, note that now so you can include it when opening ports in Step 1.5.
TURN is a relay service used only when clients cannot reach the Calls media service directly. If STUN helps clients discover where to connect, TURN acts as a backup route when direct connectivity is not possible.
Provisioning a TURN server is necessary if both of these conditions are true:
8443 for media traffic.8443 for media traffic.TURN is typically a last resort as it adds latency and infrastructure complexity. Only plan to deploy TURN if your answers indicate that you cannot rely on UDP or TCP for media, and users need an alternative route.
TURN is a fallback service, not a default requirement. If clients can reliably reach the media service over UDP or TCP 8443, do not deploy TURN. If you do deploy TURN, only open the TURN listener ports and transports you actually use, and scope client access according to your organization's network policy.
Now you'll provision the servers or VMs required to support your Calls deployment. You are only preparing infrastructure here; software installation and service configuration happen in later phases. This step matters because you need the IP addresses or DNS names of these servers before you can finish the networking configurations in the next step.
Infrastructure requirements depend on the deployment infrastructure you selected in Step 1.2. If you provision additional hardware, write down the IP addresses or DNS names now because you will use them in Step 1.5:
Integrated
Since the Mattermost server is handling all media processing, you can skip this step and proceed to network configuration in Step 1.5.
RTCD
You will need to provision a new server for RTCD. Use the performance baselines for benchmark examples of hardware sizing. The RTCD service supports horizontal scaling, but we recommend starting with one server and then scaling out if your expected workload requires it.
Recording
You will need to provision a new server for the calls-offloader service. The recommended starting point is 8 vCPU / 16 GB RAM, or you can use these performance benchmarks to estimate recording capacity and transcription load.
TURN Server
If you've determined in Step 1.3.2 that your users cannot reliably reach the media server over UDP or TCP 8443, you will need to provision your TURN server now.
Mattermost recommends installing coturn.
Before moving to Step 1.5, confirm the following:
ssh <user>@<SERVER_IP>)This section lists the network ports that must be opened for each server involved in your Calls deployment. The server instances must exist before you can configure these rules, which is why provisioning in Step 1.4 comes first.
How you open ports depends on your environment:
firewalld (RHEL, Rocky Linux, AlmaLinux) or ufw (Ubuntu/Debian) commands directly on each server.Work through one server at a time so you can verify nothing is missed before moving on.
Only open the ports relevant for your chosen deployment architecture (Integrated or RTCD):
<Tabs> <TabItem value="integrated" label="Integrated">| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 443 | TCP | Inbound | Mattermost clients | Mattermost server | HTTPS and WebSocket signaling. |
| 8443 | UDP | Inbound | Mattermost clients | Mattermost server | Media traffic (Integrated mode). |
| 8443 | TCP | Inbound | Mattermost clients | Mattermost server | Media traffic fallback (Integrated mode). |
| 3478 | UDP | Outbound | Mattermost server | stun.global.calls.mattermost.com | (Optional - Step 1.3.1) Public IP discovery using STUN. |
If you use NGINX as a reverse proxy in front of Mattermost, it should not be used to forward UDP traffic. Port 8443 must be opened directly on the server running the media service (RTCD or Integrated) - not on NGINX. Port 443 is the only port NGINX needs to handle for Calls.
If you deployed a calls-offloader server in Step 1.4, open these ports:
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 4545 | TCP | Inbound | Mattermost server | calls-offloader server | Job service API (Internal only. Restrict this rule to the Mattermost server or approved application subnet only.) |
| 8443 | UDP | Outbound | calls-offloader server | Mattermost server | Recorder and transcriber jobs connect to the media service as call participants. |
| 8443 | TCP | Outbound | calls-offloader server | Mattermost server | Media traffic fallback. |
| 443 | TCP | Outbound | calls-offloader server | Mattermost server | Recorder and transcriber jobs post results back to Mattermost. |
If you deployed a TURN server in Step 1.4, open only the ports required by the transports you actually configure. If you are using coturn, these are common defaults:
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 3478 | UDP / TCP | Inbound | Mattermost clients | TURN server | TURN relay. |
| 5349 | TCP | Inbound | Mattermost clients | TURN server | (Optional) If you configure TURN over TLS. Do not open this port unless you are explicitly using it. |
| 49152-65535 | UDP | Inbound | Mattermost clients | TURN server | TURN relay port range required to relay media. |
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 443 | TCP | Inbound | Mattermost clients | Mattermost server | HTTPS and WebSocket signaling. |
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 8443 | UDP | Inbound | Mattermost clients and calls-offloader server | RTCD server | Media traffic. |
| 8443 | TCP | Inbound | Mattermost clients and calls-offloader server | RTCD server | Media traffic fallback. |
| 8045 | TCP | Inbound | Mattermost server | RTCD server | RTCD API (Internal only. Restrict this rule to the Mattermost server or approved application subnet only.) |
| 3478 | UDP | Outbound | RTCD server | stun.global.calls.mattermost.com | (Optional - Step 1.3.1) Public IP discovery using STUN. |
If you use NGINX as a reverse proxy in front of Mattermost, it should not be used to forward UDP traffic. Port 8443 must be opened directly on the server running the media service (RTCD or Integrated) - not on NGINX. Port 443 is the only port NGINX needs to handle for Calls.
If you deployed a calls-offloader server in Step 1.4, open these ports:
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 4545 | TCP | Inbound | Mattermost server | calls-offloader server | Job service API (Internal only. Restrict this rule to the Mattermost server or approved application subnet only.) |
| 8443 | UDP | Outbound | calls-offloader server | RTCD server | Recorder and transcriber jobs connect to the media service as call participants. |
| 8443 | TCP | Outbound | calls-offloader server | RTCD server | Media traffic fallback. |
| 443 | TCP | Outbound | calls-offloader server | Mattermost server | Recorder and transcriber jobs post results back to Mattermost. |
If you deployed a TURN server in Step 1.4, open these ports. If you are using coturn, these are the common defaults:
| Port | Protocol | Direction | Source | Destination | Notes |
|---|---|---|---|---|---|
| 3478 | UDP / TCP | Inbound | Mattermost clients | TURN server | TURN relay. |
| 5349 | TCP | Inbound | Mattermost clients | TURN server | (Optional) If you configure TURN over TLS. Do not open this port unless you are explicitly using it. |
| 49152-65535 | UDP | Inbound | Mattermost clients | TURN server | TURN relay port range required to relay media. |
These checks validate firewall rules and network reachability. They do not require the production Calls, RTCD, or calls-offloader services to be installed yet. To get reliable results before those services exist, start a temporary listener on the target host before each applicable scan below. This is especially important for UDP checks, where a blocked port and an allowed-but-idle port can otherwise look the same.
First, install nmap on each source machine or client you will run checks from, and install ncat on each target host where you will start a temporary listener. For example:
sudo apt install nmap ncatsudo dnf install nmap nmap-ncatWhen you execute each check below, nmap returns open, closed, or filtered.
Pass:
open: Port is reachable, and the target host was able to bind a temporary listener on that port.Fail:
closed: Traffic reached the target host, but nothing is listening on that port. Confirm the temporary listener is still running, the port is correct, and the port was not already in use by another process.filtered: Firewall is blocking the port. Revisit your networking configuration in Step 1.5 before continuing.In the commands below, replace TARGET_IP with the actual IP address of the server you are testing. Start the server-side ncat listener on the target host first, then run the client-side nmap command from the source machine. Stop the temporary listener with Ctrl+C after the check completes.
Integrated deployments
Start the temporary listeners on the Mattermost Server, then run nmap from any client machine on the same network as your users:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.1 | Mattermost Server: sudo ncat -u -l -k -p 8443 -c '/bin/cat' | ||
Client: sudo nmap -sU -p 8443 TARGET_IP | Mattermost server IP | Clients can send UDP media to the Mattermost server | |
| 1.6.2 | Mattermost Server: sudo ncat -l -k -p 8443 | ||
Client: nmap -p 8443 TARGET_IP | Mattermost server IP | Clients can reach the Mattermost server for TCP media fallback |
RTCD deployments
Start the temporary listeners on the RTCD Server, then run nmap from any client machine on the same network as your users:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.3 | RTCD Server: sudo ncat -u -l -k -p 8443 -c '/bin/cat' | ||
Client: sudo nmap -sU -p 8443 TARGET_IP | RTCD server IP | Clients can send UDP media to the RTCD server | |
| 1.6.4 | RTCD Server: sudo ncat -l -k -p 8443 | ||
Client: nmap -p 8443 TARGET_IP | RTCD server IP | Clients can reach the RTCD server for TCP media fallback |
Start the temporary listener on the RTCD Server, then run nmap from the Mattermost server:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.5 | RTCD Server: sudo ncat -l -k -p 8045 | ||
Mattermost Server: nmap -p 8045 TARGET_IP | RTCD server IP | Mattermost can reach the RTCD API |
Recording deployments
Start the temporary listener on the Recording Server (calls-offloader), then run nmap from the Mattermost server:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.6 | Recording Server: sudo ncat -l -k -p 4545 | ||
Mattermost Server: nmap -p 4545 TARGET_IP | calls-offloader server IP | Mattermost can reach the calls-offloader API |
Start the temporary listeners on the media server (RTCD or Mattermost server if using Integrated mode), then run nmap from the Recording server (calls-offloader):
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.7 | RTCD or Mattermost Server: sudo ncat -u -l -k -p 8443 -c '/bin/cat' | ||
Recording Server: sudo nmap -sU -p 8443 TARGET_IP | RTCD server IP (or Mattermost server IP if using Integrated mode) | Calls Offloader can send UDP media to the media service to join calls for recording | |
| 1.6.8 | RTCD or Mattermost Server: sudo ncat -l -k -p 8443 | ||
Recording Server: nmap -p 8443 TARGET_IP | RTCD server IP (or Mattermost server IP if using Integrated mode) | Calls Offloader can reach the media service for TCP media fallback |
For the next check, use the existing HTTPS listener on your running Mattermost server instead of starting a temporary ncat listener:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.9 | Recording Server: nmap -p 443 TARGET_IP | Mattermost server IP | Calls Offloader can post recordings back to Mattermost |
TURN deployments
Start the temporary listeners on the TURN Server, then run nmap from any client machine on the same network as your users:
| Check | Command | TARGET_IP | Description |
|---|---|---|---|
| 1.6.10 | TURN Server: sudo ncat -u -l -k -p 3478 -c '/bin/cat' | ||
Client: sudo nmap -sU -p 3478 TARGET_IP | TURN server IP | Clients can reach the TURN server on UDP 3478 | |
| 1.6.11 | TURN Server: sudo ncat -l -k -p 3478 | ||
Client: nmap -p 3478 TARGET_IP | TURN server IP | Clients can reach the TURN server on TCP 3478 | |
| 1.6.12 | TURN Server: sudo ncat -u -l -k -p 49152 -c '/bin/cat' | ||
Client: sudo nmap -sU -p 49152 TARGET_IP | TURN server IP | Spot check of the TURN relay port range |
Before proceeding to Phase 2, confirm all of the following:
open, but not closed or filtered).3478 is allowed to stun.global.calls.mattermost.com.Do not proceed to Phase 2 until all checks in this section relevant to your deployment architecture are passing. If any check fails, go to Appendix A: Troubleshooting.
Now you will configure Calls following the relevant path for your deployment architecture. Do not complete both paths for the same deployment.
Select your path in the tab below to follow the appropriate installation and configuration instructions:
<Tabs> <TabItem value="path-a-integrated" label="Path A: Integrated">The Calls plugin is prepackaged with Mattermost self-hosted deployments. Go to System Console > Plugins > Calls > Settings and complete the following steps:
2A.2.1: Enable the plugin
Set Enable Plugin to true. This enables editing for the rest of the configuration settings on the page.
2A.2.2: Enable test mode
Set Test mode to on, so Calls stays restricted during initial validation. In this mode, System Admins control where Calls is available and can enable it in specific channels for testing.
2A.2.3: Configure the host media address
Set ICE Host Override to the IP address or DNS name clients will use to reach the media service. ICE (Interactive Connectivity Establishment) is the protocol your users' devices use to find a path to the media server. The ICE Host Override tells Calls which address to advertise to them. Base this value on the STUN decision tree from Step 1.3.1.
2A.2.4: Configure TURN Servers
If TURN is being used, replace or extend the ICE server configurations array with your TURN server details:
[
{
"urls": ["turn:turn.example.com:3478"],
"username": "<USERNAME>",
"credential": "<PASSWORD>"
}
]
If your TURN deployment uses short-lived generated credentials, also set TURN Static Auth Secret and TURN Credentials Expiration.
2A.2.5: Save configuration
Click Save on the Calls settings page. It is also recommended that you restart the plugin after changing media server settings:
Now smoke test your Calls deployment with your test accounts:
calls-test.| Check | Action | Pass criteria |
|---|---|---|
| 2A.3.1 | Start a call from the test channel with a second user | Both users are in the call |
| 2A.3.2 | Speak during the call | Both users can hear each other clearly |
| 2A.3.3 | Share your screen from a desktop app or supported browser | Screen sharing is visible to the other user |
| 2A.3.4 | End the call | The call indicator disappears from the channel |
Do not continue until all of the checks pass. If any check fails, go to Appendix A: Troubleshooting.
</TabItem> <TabItem value="path-b-install-and-configure-rtcd" label="Path B: Install and Configure RTCD">Follow the RTCD Setup and Configuration guide for the actual installation. The guide covers:
rtcd.toml configurationIf you are deploying on Kubernetes, also use the Calls Deployment on Kubernetes guide for cluster-specific installation and Helm-based configuration.
</Note>Before proceeding, run these checks from the Mattermost server to confirm RTCD is running and reachable:
| Check | Command | Pass criteria |
|---|---|---|
| 2B.2.1 | nmap -p 8045 YOUR_RTCD_SERVER | open - RTCD is running and accepting connections. |
| 2B.2.2 | curl http://YOUR_RTCD_SERVER:8045/version | Returns a JSON version string |
Once RTCD is installed, configured, and reachable, update the Calls plugin to use it:
Go to System Console > Plugins > Calls > Settings.
Set Enable Plugin to true. This enables editing for the rest of the Calls settings on the page.
Set Test mode to on, so Calls stays restricted during initial validation. In this mode, System Admins control where Calls is available and can enable it in specific channels for testing.
Set RTCD Service URL to your RTCD address. If RTCD credentials were generated during setup, embed them directly in the URL:
http://clientID:[email protected]:8045
Replace clientID and authKey with the values generated during RTCD setup. The first connection to RTCD self-registers the client and stores the authentication key in the database.
Alternatively, set credentials via environment variables on the Mattermost server: MM_CALLS_RTCD_CLIENT_ID and MM_CALLS_RTCD_AUTH_KEY.
Click Save and restart the Calls plugin so the change takes effect.
Before your pilot, set up Calls monitoring so you can see sessions, errors, CPU, and memory while real users are testing.
Calls monitoring uses Prometheus (a tool that collects metrics from your servers) and Grafana (a dashboard that visualizes those metrics). If you don't have these set up yet, see Mattermost monitoring setup before continuing. If you already have Prometheus and Grafana running, add the following scrape targets and import the dashboard:
http://YOUR_RTCD_SERVER:8045/metricshttp://YOUR_MATTERMOST_SERVER:8067/plugins/com.mattermost.calls/metrics23225See Calls Metrics and Monitoring for full configuration details.
Now smoke test your RTCD deployment with your test accounts:
calls-test.| Check | Action | Pass criteria |
|---|---|---|
| 2B.5.1 | Start a call from the test channel with a second user | Both users are in the call |
| 2B.5.2 | Speak during the call | Both users can hear each other clearly |
| 2B.5.3 | Share your screen from a desktop app or supported browser | Screen sharing is visible to the other user |
| 2B.5.4 | End the call | The call indicator disappears from the channel |
If these checks fail, try these troubleshooting techniques first:
2B.2.1 and 2B.2.2 to confirm RTCD is listening and responding.8045, and review RTCD logs before changing other settings.Do not continue until all of the checks pass. If any check fails, go to Appendix A: Troubleshooting.
</TabItem> </Tabs>Now we will install and configure the calls-offloader job service that handles call recording, transcription, and live captions.
You can skip this phase if you do not need recording, transcription, or live captions.
calls-offloader server is provisioned (1.4) and relevant networking checks passed (1.6.6-1.6.9)Follow the Calls Offloader Setup and Configuration guide for installation. The guide covers:
config.toml configurationBefore proceeding, run these checks from the Mattermost server to confirm calls-offloader is running and reachable:
| Check | Command | Pass criteria |
|---|---|---|
| 3.2.1 | nmap -p 4545 YOUR_OFFLOADER_SERVER | open - calls-offloader is running and accepting connections. |
| 3.2.2 | curl http://YOUR_OFFLOADER_SERVER:4545/version | Returns a JSON version string |
http://calls-offloader.internal:4545 on a trusted internal network.Now smoke test recording-related features with your test accounts:
| Check | Action | Pass criteria |
|---|---|---|
| 3.4.1 | Start recording as a call host | Recording starts without error. |
| 3.4.2 | End the call or stop the recording | An MP4 file appears in the call thread after processing completes. |
| 3.4.3 | With transcription enabled, end a recorded call | An MP4 file and transcript file appear in the call thread after processing completes. |
| 3.4.4 | With live captions enabled, start a recorded call | Captions appear during the call within 1-3 seconds after participants speak. |
If a recording-related check fails, isolate the problem before retrying:
calls-offloader service is running, and the Mattermost server can reach port 4545.Do not continue until all of the checks pass. If any check fails, go to Appendix A: Troubleshooting.
Now that the technical configuration is complete and validated, run a small pilot with real users before broad rollout. The goal is to confirm Calls works reliably across the clients and locations your organization uses, and that your servers stay healthy under normal usage.
For a successful pilot, make sure pilot users know what to test, how to start a call, and how to report problems.
After inviting your pilot users into the calls-test channel, post a short message there so everyone is testing the same things. A template is provided below:
## Mattermost Calls pilot
Thank you for volunteering to test Mattermost Calls before a wider rollout. After 3-5 days of pilot testing, we will ask everyone to share their findings and experiences. Please keep track of any issues or feedback so you can summarize them when requested.
**How to start**
Calls is enabled in this channel for pilot testing. You can select **Start call** in the channel header to begin, or join an existing call if one is already started.
You can learn more about Mattermost Calls in the [documentation](https://docs.mattermost.com/end-user-guide/collaborate/make-calls.html).
**Test Cases**
| Test | Action | Pass criteria | Client Types |
|---|---|---|---|
| T1 | Group call with 3-5 participants | All participants can hear each other clearly | Web, Desktop, Mobile |
| T2 | Group call lasting 15 minutes or longer | No unexpected drops or audio degradation | Web, Desktop, Mobile |
| T3 | Participants join calls from outside the main office network | Call quality is acceptable from that network | Web, Desktop, Mobile |
| T4 | Participants share screen during a call | Screen sharing works and is visible to all participants | Desktop, Web |
| T5 | Record a group call, if recording is enabled | MP4 and transcription file appear in the call thread after processing completes | Web, Desktop, Mobile |
| T6 | Enable Live Captions during a group call, if captions are enabled | Captions appear during the call within 1-3 seconds after participants speak | Web, Desktop |
**Reporting Issues**
If you encounter an issue, please report it by posting in this channel and including:
- Test number
- Reproduction steps
- What you expected to happen
- What actually happened (with screenshots)
- Your client type (desktop, browser, or mobile)
Monitoring
| Check | Action | Pass criteria |
|---|---|---|
| 4.3.1 | Check your metrics dashboard during a pilot call | Active sessions and participants are visible and counted correctly |
| 4.3.2 | If using RTCD, check RTCD error metrics after pilot calls (rtcd_rtc_errors_total) | No elevated error counts |
| 4.3.3 | If using RTCD, check CPU and memory metrics during a pilot call (rtcd_process_cpu_seconds_total, rtcd_process_resident_memory_bytes) | No CPU or memory spikes observed |
| 4.3.4 | Review Mattermost logs, plus RTCD and calls-offloader logs if those services are deployed | No recurring ERROR lines, and no unexpected WARN patterns |
Production readiness
Collect feedback from your pilot users after 3-5 business days and use it to evaluate production readiness:
| Check | Requirement |
|---|---|
| 4.3.5 | Audio quality rated acceptable by 80%+ of pilot users |
| 4.3.6 | No blocking issues found in the pilot test cases |
| 4.3.7 | All pilot users confirm readiness for production rollout |
If the pilot users find issues, do not expand the rollout yet:
You can also run /call stats in the Mattermost message area after a failed test for additional diagnostic clues.
Do not continue to a production rollout until all relevant checks are passing. If any check fails, go to Appendix A: Troubleshooting.
Now you will execute a broader rollout to all users in production.
You should be familiar with your rollback options before you begin the staged production rollout. If something goes wrong, choose the smallest rollback that solves the problem:
Per-channel rollback
Disables Calls in specific channels.
Test mode rollback
Restricts Calls to channels where it has been enabled by a System Admin.
on.Full rollback
Disables Calls completely for everyone.
If you have an existing conferencing tool, keep it available until Calls is stable in production.
Before announcing Calls to users, create a calls-support public channel. This gives users a clear place to report issues and gives your admins a single place to track rollout problems.
Also prepare a short announcement to share in an all-hands channel or similar high-visibility location. A template is provided below:
<details open> <summary>Production rollout communication template</summary>## Mattermost Calls rollout
We're enabling Mattermost Calls across this server. Starting today, you can start audio calls in select channels directly within Mattermost - no need to switch to a separate tool.
We're rolling out gradually, starting with a select set of channels before expanding to everyone.
**Calls features**
- Start or join 1:1 and group audio calls
- Share your screen from the desktop app or browser
- Record calls and generate transcripts, if enabled
- Use live captions during recorded calls, if enabled
You can learn more about Mattermost Calls in the [documentation](https://docs.mattermost.com/end-user-guide/collaborate/make-calls.html).
**How to start a call**
Select **Start call** in the channel header. Anyone in the channel can join.
**Things to know**
- We recommend updating your [desktop and mobile apps](https://mattermost.com/apps/) to the latest version
- Your browser or desktop app may ask for microphone permission the first time you join a call.
- Screen sharing may also require a screen capture permission prompt.
**Need help?**
Post in `~calls-support` and include what you were trying to do, what happened, and a screenshot if possible.
We recommend enabling Calls in stages instead of enabling it everywhere at once. This way you can watch real usage, catch problems early, and rollback cleanly if needed.
| Stage | Channels / departments | Suggested timeline | Rollback approach |
|---|---|---|---|
| Stage 1 | IT and Admin channels | Days 1-3 | Per-channel rollback |
| Stage 2 | Engineering or power user channels | Days 4-7 | Per-channel rollback |
| Stage 3 | Full organization | Day 8+ | Test mode (if issues are isolated) or full rollback |
If a rollout stage introduces problems, pause the rollout, use the rollback option listed for that stage, fix the issue, and repeat the same stage before moving to the next one.
Once Calls is live, monitor it actively for the first two weeks and tune based on what you see.
5.5.1: Watch server health during peak call hours
Monitor CPU and memory on the media server (RTCD or Mattermost server) daily during peak usage. If CPU utilization consistently exceeds 70%, consider increasing hardware specs, or adding RTCD nodes before the next rollout stage.
5.5.2: Review logs daily
Check Mattermost, RTCD, and calls-offloader logs each day for recurring ERROR or WARN lines. Address any patterns before they become user-facing problems.
5.5.3: Tune Max Call Participants
If you see resource pressure during large calls, lower Max Call Participants in System Console > Plugins > Calls. By default, there is no participant limit (configured as 0, which means unlimited). A practical ceiling for most deployments is 50.
5.5.4: Track user-reported issues
Monitor ~calls-support for recurring complaints.
Check Appendix A: Troubleshooting for common issues and fixes.
| Cause | Fix |
|---|---|
| The Calls plugin is disabled | Go to System Console > Plugins > Plugin Management and enable Calls |
| The deployment is in test mode | Go to System Console > Plugins > Calls > Settings and check the deployment state - Calls must be enabled in specific channels by System Admins in test mode |
| Calls is not enabled for the channel | When test mode is enabled, open the channel menu and select Enable calls |
| The user is on an older client | Ask the user to update to the current Mattermost desktop or mobile app |
| Cause | Fix |
|---|---|
UDP 8443 is blocked | Repeat the UDP connectivity check from Phase 1 (check 1.6.1 or 1.6.3) and confirm the firewall rule is applied |
TCP 8443 is also blocked and fallback is failing | Repeat the TCP check (1.6.2 or 1.6.4) - clients need at least one path to the media service |
| The wrong media address is being advertised | Re-check ICE Host Override in Phase 2A (Integrated) or ice_host_override in rtcd.toml in Phase 2B (RTCD) - the address must be reachable by clients |
| Browser or desktop microphone permissions were denied | Ask the user to check browser or OS microphone permissions and reload the app |
| Cause | Fix |
|---|---|
External firewall rules are blocking UDP 8443 | Confirm external reachability to UDP 8443 on the media server - cloud security groups and on-prem firewalls both need to allow inbound traffic from the internet |
| The advertised media address is a private IP | Set ICE Host Override (Integrated) or ice_host_override in rtcd.toml to the correct public IP or use STUN (1.3.1) |
| Client networks are too restrictive for direct UDP or TCP | Deploy a TURN server and add it to ICE server configurations |
| Cause | Fix |
|---|---|
| calls-offloader is not running | Run nmap -p 4545 YOUR_OFFLOADER_SERVER from the Mattermost server - if the result is closed, the service is not running; check the systemd service logs |
| Mattermost cannot reach the Job Service URL | Run curl http://YOUR_OFFLOADER_SERVER:4545/version from the Mattermost server and confirm it returns a version string |
| The offloader service account cannot use Docker | Confirm the service account is in the docker group on the calls-offloader server |