mirror of
https://github.com/mattermost/mattermost.git
synced 2026-09-21 05:54:10 +08:00
* Fix leftover RST/malformed MDX admonition syntax Docusaurus/MDX admonitions use `:::type[Title]` for a custom title, not the old Sphinx `.. type::` RST directive or a bare `:::type Title` (which Docusaurus renders as a type with the literal text "Title" appended, not a real title). Fixed 12 files using the malformed `:::type Title` form, plus two leftover `.. image::` RST directives (converted to `<img>` tags, covered in the images commit's file but noted here since it's the same admonition-adjacent cleanup pass) in manage-your-security-preferences.mdx. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix broken images: port missing screenshots from legacy docs repo 26 files referenced screenshots/diagrams via relative paths (`../images/x`, `../../images/x`) that don't resolve anywhere in this repo — the assets were never migrated during the Sphinx-to-Docusaurus conversion, and in one file (ad-ldap-groups-synchronization.mdx) the filenames were also corrupted with a leftover `%0A` (encoded newline) prefix from the conversion. Ported the 46 missing image files from mattermost/docs (source/images/) into docs/site/static/images/ — the location every other working image reference in this repo already resolves against — and rewrote every relative reference to the root-absolute `/images/<file>` form used elsewhere in these same files (e.g. server-logout-indicator.png). Verified via a full scan: all 680 `/images/...` references across docs/main now resolve to a real file on disk. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix oversized/broken checkmark icons in EMM config table The EMM configuration reference table used bare <img src="../../_static/images/check-circle-green.svg" /> for ~24 "supported" checkmarks — a legacy Sphinx path that doesn't exist in this repo (broken image) and, with no explicit size, would render at native SVG size rather than as a small inline checkmark (oversized icon). Replaced with the actual migrated asset (/img/ui/checkmark.svg) plus explicit width/height and alt text. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix wide comparison table wrapping on the plans page The plans/pricing table (7 columns: Feature Category + 5 editions + Available From) had no table-layout or column-width rules, so the first ("Feature Category") column — which holds long, wrapping prose — ended up roughly the same rendered width as the edition columns, which only ever hold a short checkmark or version string. That forced every row onto several wrapped lines. Added `table-layout: fixed` with explicit per-column widths (28% category / 10% per edition / 22% for "Available From") so the category column gets the space it needs. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix images broken on non-root baseUrl deployments (PR previews) Docusaurus only rewrites image URLs for the site's baseUrl when using markdown image syntax (``) — that gets compiled to a webpack require() call. A raw HTML `<img src="/images/x.png" />` tag is left as a literal string, which the browser resolves from the domain root, ignoring baseUrl entirely. On production baseUrl is "/", so this silently worked by coincidence. But PR preview builds set BASE_URL to "/mattermost/pr-<N>/" (.github/workflows/docs-preview-template.yml), so every raw <img src="/images/..."> or src="/img/..."> 404s specifically on preview deployments — which is why images added/fixed earlier in this branch still showed as broken in the PR's docs preview. This is a pre-existing, repo-wide pattern (503 raw <img> tags across 103 files, most untouched by this PR otherwise) rather than something introduced by earlier commits here — those commits just added a few more instances of an existing broken pattern. Fixed all of them by importing @docusaurus/useBaseUrl and wrapping src={useBaseUrl('/images/...')} so the URL is correctly rewritten for whatever baseUrl the site is built with. Verified: all 503 useBaseUrl(...) calls resolve to a real file under docs/site/static, and every modified file was checked with @mdx-js/mdx compile() to confirm no syntax breakage from the added import statements. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix leftover RST list/table markup in notifications docs - mobile-troubleshooting.mdx: replace leading blockquote markers (>) under step 3 with list-content indentation so the nested numbered substeps and screenshots render as part of the ordered list instead of a blockquote. - manage-your-notifications.mdx: replace the mangled blockquote/dl header row (with literal RST separator runs and stray | and + characters) with a proper <thead><th scope="col"> row, and restore the "Icon badge (dot)" row as a normal <tbody> row. Co-authored-by: Cursor <cursoragent@cursor.com> * Rebuild mangled security preferences table from RST source Cross-checked against the legacy RST source to reconstruct the table correctly: proper <thead>/<th scope="col"> header, real ordered/ unordered lists instead of pipe-joined literal text, working internal links in place of unresolved mm-ref: URIs, and a <Note> block for the sign-in method callout (previously rendered as literal ".. note::" text). Also dropped a stray phantom third table column left over from conversion. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix typos and remaining markup issues in collaborate/notifications docs - message-priority.mdx: fix "acknowlegement" typo, add missing "the" before "message" in the acknowledgement description. - organize-conversations.mdx: split the Tip's two bullets onto separate lines and drop the escaped leading hyphen that was preventing the first item from rendering as a list. - organize-using-custom-user-groups.mdx: fix "preferreed" typo and add missing "to" in the archived-group restoration instructions. - schedule-messages.mdx: fix "dislays" typo. - manage-your-notifications.mdx: replace the leftover dl/dt/dd/ line-block markup in the Push notifications row with a plain anchor link, matching the Web/Desktop cells elsewhere in the table. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
158 lines
14 KiB
Plaintext
158 lines
14 KiB
Plaintext
---
|
|
title: "Connect Zoom to Mattermost"
|
|
---
|
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
|
import Tabs from '@theme/Tabs';
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
<PlanAvailability slug="all-commercial" />
|
|
|
|
Reduce friction and time lost to coordinating meetings and switching between apps by integrating Zoom with Mattermost. Make it easy for your teams to start spontaneous video calls directly from Mattermost channels. Receive Zoom cloud recordings and transcripts directly in Mattermost once they're available.
|
|
|
|
## Deploy
|
|
|
|
Setup starts in Zoom and configuration ends in Mattermost.
|
|
|
|
### Register an OAuth app in Zoom
|
|
|
|
A Zoom system admin must perform the following steps in Zoom.
|
|
|
|
Zoom supports OAuth authentication, and there are 2 types of OAuth Zoom Apps you can register: **Account-Level** and **User-Level**. You can use either type based on your organization's security and preferences.
|
|
|
|
- **Account-Level**: Individual users in Mattermost are verified by checking their Mattermost email and requesting their Personal Meeting ID via the Zoom API. The user's email address in both Mattermost and Zoom must match. Create a User Level Zoom app instead if you prefer that each user to authorize individually.
|
|
- **User-Managed**: Individual users in Mattermost are required to authorize the Mattermost App to access their Zoom account. Create an Account-Level app instead if you prefer that an admin authorizes access on behalf of the whole Zoom organization.
|
|
|
|
<Important>
|
|
|
|
For Account-Level apps, only Zoom users associated with the Zoom Account that created the app can use this integration. You can add users from the **Manage Users** section in the Zoom Account settings.
|
|
|
|
</Important>
|
|
|
|
<Tabs>
|
|
<TabItem value="account-level" label="Account-Level">
|
|
|
|
Complete the following steps to create an account-level Zoom app for Mattermost.
|
|
|
|
1. Go to [https://marketplace.zoom.us/](https://marketplace.zoom.us/) and log in as an admin.
|
|
2. In the top right, select **Develop** and then select **Build App**.
|
|
3. On top, select **Development**. We would choose **Production** if we were publishing to marketplace, but we won't be doing that here.
|
|
4. You can edit the name of your app from top left side by clicking on edit icon.
|
|
5. Choose **Admin-managed app** as the app type.
|
|
6. Next you'll find your **Client ID** and **Client Secret**. Please copy this as these will be needed when you set up Mattermost to use the plugin.
|
|
7. Enter a valid **Redirect URL for OAuth** (<code>https://SITEURL/plugins/zoom/oauth2/complete</code>) and add the same URL under **Add Allow List**. Note that <code>SITEURL</code> should be your Mattermost server URL.
|
|
8. To add user scopes to the app, select **Scopes**, and add the following scopes: `meeting:read:meeting` (retrieve meeting details), `meeting:write:meeting` (create and update meetings), `user:read:user` (read user profile info), `cloud_recording:read:recording` (access cloud recording files), `archiving:read:list_archived_files` (list archived files).
|
|
|
|
</TabItem>
|
|
<TabItem value="user-managed" label="User-Managed">
|
|
|
|
Complete the following steps to create a user-managed Zoom app for Mattermost.
|
|
|
|
1. Go to [https://marketplace.zoom.us/](https://marketplace.zoom.us/) and log in as an admin.
|
|
2. In the top right select **Develop** and then **Build App**.
|
|
3. On top, select **Development**. We would choose **Production** if we were publishing to marketplace, but we won't be doing that here.
|
|
4. You can edit the name of your app from top left side by clicking on edit icon.
|
|
5. Choose **User-managed app** as the app type.
|
|
6. Next you'll find your **Client ID** and **Client Secret**. Please copy this as these will be needed when you set up Mattermost to use the plugin.
|
|
7. Enter a valid **Redirect URL for OAuth** (<code>https://SITEURL/plugins/zoom/oauth2/complete</code>) and add the same URL under **Add Allow List**. Note that <code>SITEURL</code> should be your Mattermost server URL.
|
|
8. To add user scopes to the app, select **Scopes**, and add the following scopes: `meeting:read:meeting` (retrieve meeting details), `meeting:write:meeting` (create and update meetings), `user:read:user` (read user profile info), `cloud_recording:read:recording` (access cloud recording files), `archiving:read:list_archived_files` (list archived files).
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
|
|
### Configure webhook events
|
|
|
|
When a Zoom meeting ends, the original post shared in the channel can be automatically changed to indicate the meeting has ended and how long it lasted. To enable this functionality, create a webhook subscription in Zoom that tells the Mattermost server every time a meeting ends. The Mattermost server then updates the original Zoom message.
|
|
|
|
1. While editing the app in Zoom, select **Access** under the **Features** tab on the left.
|
|
2. Select **Add New Event Subscription**, and give it a name, such as `Zoom for Mattermost`.
|
|
3. Select the **Add Events** button and add: **All Recordings have completed**, **Recording Transcript files have completed**, **Start Meeting**, and **End Meeting**.
|
|
4. Enter a valid **Event notification endpoint URL** `https://SITEURL/plugins/zoom/webhook?secret=WEBHOOKSECRET`, replacing `SITEURL` with your Mattermost URL. `WEBHOOKSECRET` is generated during [Mattermost configuration](#mattermost-configuration).
|
|
5. Select **Save** to save the webhook configuration.
|
|
6. Verify the webhook is active by selecting **Test Event** in the Zoom webhook configuration. Confirm that Mattermost returns an HTTP 200 response or that the Mattermost plugin logs show a successful delivery. Also confirm that the **Secret Token** shown in the UI matches the `WEBHOOKSECRET` value used in the **Event notification endpoint URL** from step 4.
|
|
7. Copy the **Secret Token** value at the top of the page for use in the next section.
|
|
|
|
### Mattermost configuration
|
|
|
|
A Mattermost system admin must perform the following steps in Mattermost.
|
|
|
|
Install the Zoom integration from the in-product App Marketplace:
|
|
|
|
<Note>
|
|
|
|
We recommend making a copy of your webhook secret and encryption key, as it will only be visible to you once.
|
|
|
|
</Note>
|
|
|
|
1. In Mattermost, from the Product menu <img src={useBaseUrl('/img/ui/products_E82F.svg')} alt="Navigate between Channels, collaborative playbooks, and boards using the product menu icon." className="theme-icon" />, select **App Marketplace**.
|
|
2. Search for or scroll to Zoom, and select **Install**.
|
|
3. Once installed, select **Configure**. You'll be taken to the System Console.
|
|
4. On the Zoom configuration page, enable and configure Zoom interoperability as follows, and then select **Save**.
|
|
5. For self-hosted Zoom deployments, enter the **Zoom URL** and **Zoom API URL** for the Zoom server when you're using a self-hosted private cloud or on-premises Zoom server, such as `https://YOUR-ZOOM.com` and `https://api.YOUR-ZOOM.com/v2` respectively, replacing `YOUR-ZOOM` with your Zoom server URL. Leave this field blank if you're using Zoom's vendor-hosted SaaS service.
|
|
6. If you've created an [account level Zoom app for Mattermost](#register-an-oauth-app-in-zoom), set **OAuth by Account Level App** to **true**. Leave this value as **false** if you've created a user level Zoom app for Mattermost.
|
|
7. Connect your users to Zoom using OAuth. Enter the **Client ID** and **Client Secret** generated when [registering the oauth app in Zoom](#register-an-oauth-app-in-zoom).
|
|
8. Select **Regenerate** next to the **At Rest Token Encryption Key** field to generate an AES encryption key. You just need to generate this value, and won't use it anywhere else.
|
|
9. If you're configuring webhook events, select **Regenerate** next to the **Webhook Secret** field. This is the `WEBHOOKSECRET` value to use in your webhook URL pointing to Mattermost.
|
|
10. Paste the **Secret Token** from the Zoom webhook configuration page into the plugin setting **Zoom Webhook Secret**.
|
|
11. (Optional) Enable **Restrict Meeting Creation** to restrict users from creating meetings in public channels.
|
|
12. Select **Save** to save your changes.
|
|
|
|
## Enable
|
|
|
|
Notify your teams that they can [connect their Zoom accounts to Mattermost](#usage).
|
|
|
|
To subscribe a channel to a recurring Zoom meeting (a meeting scheduled to repeat on a regular basis, such as daily or weekly, or with no fixed time using Zoom's **Recurrence** option), use the following slash command: `/zoom subscription add [meeting ID]`. You can find the meeting ID in the Zoom desktop or web client by opening the meeting's details page, or from the meeting invitation email. The channel will receive a notification when the meeting starts, along with an access link. If cloud recordings are enabled and the meeting was recorded, the recording and transcript are posted as replies to the initial message once they are available.
|
|
|
|
## Upgrade
|
|
|
|
We recommend updating this integration when new versions are released. Generally, updates are seamless and don't interrupt the user experience in Mattermost. Visit the [Releases page](https://github.com/mattermost/mattermost-plugin-zoom/releases) for information on the latest release, previous releases, and compatibility considerations.
|
|
|
|
## Usage
|
|
|
|
You need a paid Zoom account to start a Zoom call within Mattermost. The first time you create a Zoom meeting, you may be prompted to connect your account. Follow the instructions to connect your Zoom account using your credentials.
|
|
|
|
Start a call by selecting the Zoom icon in the right pane, or by running the `/zoom start` slash command in any channel or thread. All channel members can then join the meeting. The meeting host is the person who started the call.
|
|
|
|
Join the meeting by selecting the call invitation in the channel.
|
|
|
|
Run the `/zoom settings` slash command to set your preference for using your Zoom personal meeting ID as a meeting host. You can choose to always use your personal meeting ID, always use a new unique meeting id, or set Mattermost to prompt you for your preference each time you start a call.
|
|
|
|
Subscribe a Mattermost channel to a recurring Zoom meeting with `/zoom subscription add [meeting ID]`. Cloud recordings and transcripts must be enabled in your paid Zoom account in order to receive them in Mattermost. To enable this, sign in to the [Zoom web portal](https://zoom.us/) as an account owner or admin, go to **Account Management \> Account Settings**, select the **Recording** tab, and enable **Allow hosts to record and save the session in the cloud**. Then, under **Advanced cloud recording settings**, select the **Audio Transcript** checkbox. Alternatively, enable these settings at the user level and assign recording permission to the meeting host. See [Zoom's cloud recording settings documentation](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0064676) and [audio transcription documentation](https://support.zoom.com/hc/en/article?id=zm_kb&sysparm_article=KB0065911) for step-by-step guidance. Once enabled, you'll receive a notification in Mattermost when the recording and transcript are available for recorded meetings.
|
|
|
|
If you create a new meeting using the Zoom button in the Mattermost RHS, then the recording and transcript are similarly posted as replies to the initial message once they are available, if cloud recordings are enabled and the meeting was recorded.
|
|
|
|
Additional slash commands:
|
|
|
|
- `/zoom help` - Display available commands
|
|
- `/zoom channel-settings` - Set whether meetings in the current channel use your personal meeting ID or unique meeting ID
|
|
- `/zoom channel-settings list` - List all channel preferences
|
|
- `/zoom subscription list` - List all subscribed channels
|
|
- `/zoom subscription add [meeting ID]` - Subscribe a Mattermost channel to a recurring Zoom meeting
|
|
- `/zoom subscription remove [meeting ID]` - Unsubscribe a Mattermost channel from a recurring Zoom meeting
|
|
|
|
For User-Managed apps only:
|
|
|
|
- `/zoom connect` - Connect your Zoom account to Mattermost
|
|
- `/zoom disconnect` - Disconnect your Zoom account from Mattermost
|
|
|
|
## Customize
|
|
|
|
This [integration](https://github.com/mattermost/mattermost-plugin-zoom) contains both a server and web app portion.
|
|
|
|
- Server: Inside the `/server` directory, you'll find the Go files that make up the server-side of the integration. Within there, build the plugin like you would any other Go application.
|
|
- Web App: Inside the `/webapp` directory, you will find the JS and React files that make up the client-side of the plugin. Within there, modify files and components as necessary. Test your syntax by running `npm run build`.
|
|
|
|
Visit the [Mattermost Developer Workflow](https://developers.mattermost.com/extend/plugins/developer-workflow/) and [Mattermost Developer environment setup](https://developers.mattermost.com/extend/plugins/developer-setup/) for information about developing, customizing, and extending Mattermost functionality.
|
|
|
|
## Upgrade
|
|
|
|
We recommend updating this integration when new versions are released. Generally, updates are seamless and don't interrupt the user experience in Mattermost. Visit the [Releases page](https://github.com/mattermost/mattermost-plugin-zoom/releases) for information on the latest release, previous releases, and compatibility considerations.
|
|
|
|
## Get help
|
|
|
|
Mattermost customers can open a [Mattermost support case](https://support.mattermost.com/hc/en-us/requests/new). To report a bug, please open a GitHub issue against the [Mattermost Zoom plugin repository](https://github.com/mattermost/mattermost-plugin-zoom).
|
|
|
|
For questions, feedback, and assistance, join our public [Integrations and Apps channel](https://community.mattermost.com/core/channels/integrations) on the [Mattermost Community Server](https://community.mattermost.com/) for assistance.
|
|
|
|
Mattermost Team Edition and Free customers can visit the Mattermost [peer-to-peer troubleshooting forum](https://forum.mattermost.com/c/trouble-shoot/16) to access the global Mattermost Community for assistance.
|