Discourse Zoom

:discourse2: Summary Discourse Zoom empowers Discourse administrators and users with a paid Zoom subscription to schedule, manage, and participate in Zoom webinars directly from their Discourse platform.
:hammer_and_wrench: Repository Link https://github.com/discourse/discourse-zoom
:open_book: Install Guide How to install plugins in Discourse

Overview

This plugin integrates Zoom webinars into a Discourse instance. Zoom webinars can be associated with topics, Discourse users can register for webinars and join them when they start.

:warning: Due to Zoom deprecating JWT authentication, as of August 1st 2023, the plugin’s authentication mechanism has changed from JWT (now deprecated, Zoom will remove on September 1st) to Server-to-Server OAuth. Existing users of the plugin need to update their settings.

Features

  • When a Zoom webinar starts, the “Register” button automatically switches to “Join”, and clicking it launches the webinar using the Zoom SDK in a dedicated endpoint inside your Discourse community
  • Automatically reminds webinar registrants N minutes before the event (N is configurable in the plugin settings, by default reminders are turned off)
  • Administrators can add panelists to a webinar in Discourse
  • Administrators can add a link to video recordings of the webinar in Discourse, which is then displayed to users after the event has ended
  • Zoom event hosts and panelists are associated with Discourse user accounts

Usage

To use the Discourse Zoom plugin, you first need to install it in your Discourse instance and configure it with your Zoom Server-to-Server OAuth app credentials. Once the plugin is set up, you can create a new Zoom webinar by creating a new topic and associating it with the webinar. Users can then register for the webinar directly from the topic.

Installation

Step 1: Create a Server-to-Server OAuth app in the Zoom Marketplace

To get started, you’ll need to create a Server-to-Server OAuth app in the Zoom Marketplace.

Step 2: Install the plugin in your Discourse instance

You can install the plugin in your Discourse instance by following the instructions here.

Step 3: Configure the plugin

Once the plugin is installed, go to your Discourse settings and check the zoom enabled checkbox. Then, copy and paste the zoom s2s account id, zoom s2s client id, and zoom s2s client secret site settings from your app’s credentials tab.

Step 4: Enable event subscriptions

Under the Feature tab of your Zoom Server-to-Server OAuth app, enable event subscriptions. Under Event Types, load the Webinar tab and check all the events in it. If you can’t see webinar permissions, check how to enable permissions.

Set the Event notification endpoint URL to https://YOURSITE.com/zoom/webhooks/webinars.json.

Click on validate then click on save.

Step 5: Create a Meeting SDK App

Under the App Credentials tab in your Meeting SDK App, copy and paste the Client ID/ SDK key into the zoom sdk key field, and the Client Secret/SDK secret into the zoom sdk secret field.

Next, under the App Credentials, you will find the Redirect URL for OAuth and the Add Allow List. Copy and paste the following link https://YOURSITE.com/auth/oauth2_basic/callback.

Step 6: Activate the SDK App

Go to the SDK Activation tab and in the Add URL, copy and paste the provided URL in your browser to activate the SDK app. Currently, we don’t use the provided OAuth by the Meeting SDK, but setting it up is required.

Make sure your app is activated. To do this, click on Manage and check the Status column.

Limitations

The plugin only works with webinars that do not require registration in Zoom.

Notice about breaking Changes

Due to deprecations in the Zoom API, old instances of the plugin will need to be configured following the steps mentioned in this post.

:discourse2: Hosted by us? This plugin is available on our Enterprise plans.

63 Likes

Thanks so much for working on this, great feature!

I was able to install the plugin, create the JWT app in Zoom, and configure my discourse as described.
However, I am running into problems when using the Zoom Webinar button in the composer to associate a scheduled meeting with the post.

image

It would be great if you could please add an explanation what exactly one has to enter in the text input under “Add Webinar” . Neither the meeting ID or full URL seem to work for me.

Another minor issue I noticed: The repository URL linked to in the “Plugins” page of the admin dashboard points to https://github.com/discourse-org/discourse-zoom, whereas it should be linking to https://github.com/discourse/discourse-zoom

2 Likes

Interesting concept, and looks like a nice experience for community members!

I’m curious if there’s been any thought yet to allowing a more generic (vendor-agnostic) workflow with this plugin; basically to offer the same embedding of a countdown timer to a specific time and date, specifying a host and/or panelist, link to the webinar URL, later links to recordings, etc.

Jiti (open source) would be the example that I had in mind but there are obviously several options in this space.

2 Likes

You need to enter the webinar ID. In your site’s logs in /logs, you should be able to see more details if it still can’t add the event in the modal window. I also fixed the URL issue you mentioned, thanks for reporting that.

Unfortunately, no, this currently does not provide a vendor-agnostic workflow. The Zoom API calls are abstracted though, so it’s possible to add support for another vendor with a bit of effort (although, the plugin would need to be renamed to something less zoom-y).

8 Likes

Is there any possibility of adding meeting support w/out registration to this plugin as well as webinars? Great work!

7 Likes

Now that Zoom requires a password for all meetings/webinars I think the plugin is broken. I tried creating a webinar and when I join it gives this error Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again.

3 Likes

I will look into this today. It’s possible this is a temporary issue, the web client for Zoom is marked as “under maintenance” on their Status page at status.zoom.us.

5 Likes

I just want to mention that use of webinars is $40.00 a month minimum to enable + $14.99 a month Pro plan. Cheers.

2 Likes

Yes, unfortunately it looks like Zoom’s Web SDK is offline for now. They say they are working on bringing it back online (not quite sure what that means).

For the moment, then, I have added a workaround to the plugin, when joining a webinar, it will now show this screen when joining via SDK fails:

8 Likes

FYI, a cooperative I co-founded went for https://bigbluebutton.org/. Self-hosting cost us a lot less than a Zoom webinar account.

11 Likes

Hi Penar, I just noticed there is a Webinar tab in the users profile, as an admin I can view this as expected, but as a regular user I get this error

Access Denied

while trying to load [/topics/webinar-registrations/chris_murray.json](https://community.naturephotographers.network/topics/webinar-registrations/chris_murray.json)

From the logs:

Error: Forbidden
Url: https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js
Line: 1
Column: 267206
Window Location: https://community.naturephotographers.network/u/chris_murray/activity


o/t</<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267206
o/t<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267309
o@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267390
trigger@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:545370
A</e._onError/<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:550247
f</t.invoke@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:490055
f</t.flush@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:489055
p</t.flush@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:491070
t</t._end@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:496499
t</t.end@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:493035
t</t._run@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:497037
t</t.run@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:493643
c@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:359842
i/r.error@https://community.naturephotographers.network/assets/application-54c82e8fd96fa4eb82fa7465a602da175078108feb909cfeec95f696f02b5854.js:1:203298
i@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:27754
fireWith@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:28522
l@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:78753
o/<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:81055

1 Like

I can’t reproduce this, tested on multiple sites with different usernames, including locally with a username containing an underscore.

Yes, the plugin uses Zoom’s WebSDK, and it has issues in some browsers.

1 Like

FYI I just did a webinar using this and the Join button didn’t work at all, everyone got a timeout from Zoom, but I directed everyone to the regular zoom link which worked fine. So it seems the WebSDK is having lots of problems. Maybe we could have an option to put in the url for the join button rather than relying on the websdk since it is failing?

1 Like

The Zoom SDK should work if you deploy, I updated the plugin last week. They did block all previous versions though so if you haven’t deployed recently that could explain it. And adding the zoom link as an option makes sense.

2 Likes

Thanks Penar, I didn’t realize there was an update, hopefully that will fix it for next time.

Question about the video you can add afterwards; does this only work for Zoom cloud recordings? If I use Vimeo or Youtube it says it’s not a supported format. Just curious, not a big deal since I can just include it in the post.

1 Like

Oh yes, that fields only works with a URL to a direct video file. Youtube or Vimeo won’t work, but as you say, it’s much easier to use oneboxing for Youtube/Vimeo URLs.

3 Likes

See: BigBlueButton video conference

1 Like

Just a little feedback after using this a few times now.

  1. The join button being hidden until the webinar starts is not user friendly, I get several emails before the webinar starts asking where the link to join is even though I’ve spelled it out in the webinar description and the notification that it will appear when the webinar starts, people just don’t read. Personally I would prefer to have the join button always visible, if they click on it early it will just tell them the webinar hasn’t started yet and they will look back to see what time it really starts.

  2. Would it be possible to support practice sessions? With a webinar you have the option for this where the host and panelists can talk to each other beforehand without being live for the participants. They can click the link for the zoom meeting during this time and they will get a notice telling them that the meeting has not started yet but they’re in sort of a waiting room, and it automatically joins as soon as we go live. This would alleviate a lot of problems for users.

3 Likes

Apologies for the delay, David.

There is a setting that can probably help you here:

If you set this to 30, then the button will show up 30 minutes before the scheduled time of the webinar.

You should be able to use this with the setting above too. Last I checked, the Zoom webhooks don’t fire when the practice session turns into a full event, so that makes the other dynamic a little tricky.

3 Likes

Thanks Penar, but that’s not quite the issue.

First off, my Join now button is no longer working at all:

In the past it was working, but this started in the past couple weeks. I also don’t see the fallback link showing up either.

Then, a separate problem which I was describing before was the practice mode issue. When I did have the previously mentioned issue, it worked like this: when I start the webinar in practice mode the join button does not come on, no matter what zoom join x mins before start is set to, it would only show up when I actually start broadcasting, which I like to do only 5 mins prior to the start. Ideally the Join button would come on whenever the setting is set to, then they would get the zoom notification that the webinar hasn’t started yet.

Do you think you could give an option to just switch the register button to join at the set time and it would just be the zoom link? Not a fallback, but a forced link to bypass this altogether. Thanks again Penar!