Join meeting failed

Description

We are experiencing an issue where one participant successfully joins a Zoom Video SDK session, while another participant attempting to join the same session receives a JOIN_MEETING_FAILED error.

Scenario:

  • Participant A (Web/Browser): Joins the session successfully
  • Participant B (Desktop/Electron): Fails to join with JOIN_MEETING_FAILED error after 3 retry attempts

This issue occurs intermittently.

Session that agent (web) successfully joined:

  • Session ID: MekJFqDjQyGIJ8kYHHyMMg==
  • Session Topic: d3087f56-7b6c-4

Browser Console Error

{
  "type": "JOIN_MEETING_FAILED",
  "errorCode": 200,
  "reason": "connection error"
}

Full error from logs:

[ERROR] [desktop]: ZoomSDKManager :: setupVideoCall :: Attempt 2/3 failed 
{"type":"JOIN_MEETING_FAILED","errorCode":200,"reason":"connection error"}

[ERROR] [desktop]: ZoomSDKManager :: setupVideoCall :: Attempt 3/3 failed 
{"type":"JOIN_MEETING_FAILED","errorCode":200,"reason":"connection error"}

[ERROR] [desktop]: ZoomSDKManager :: setupVideoCall :: All retries exhausted 
{"type":"JOIN_MEETING_FAILED","errorCode":200,"reason":"connection error"}

Which Web Video SDK version?

  • Desktop (Electron): @zoom/videosdk (2.1.10)
  • Web (Browser): @zoom/videosdk (2.1.10)

Video SDK Code Snippets

Client initialization and join (Desktop - failing):

this.zoomClient = ZoomVideo.createClient();

await this.zoomClient.init('en-US', 'CDN', {
  stayAwake: true
});

// This call fails with JOIN_MEETING_FAILED
await this.zoomClient.join(session, signature, agentName);

Cleanup between calls:

async forceCleanup(listeners) {
  this.zoomClient?.off('peer-video-state-change', listeners.peerVideoListener);
  this.zoomClient?.off('user-updated', listeners.onUserUpdated);
  this.zoomClient?.off('user-removed', listeners.onUserRemoved);

  await this.zoomClient?.leave();
  ZoomVideo.destroyClient();
  
  this.zoomClient = null;
  this.stream = null;
}

Troubleshooting Routes

  1. :white_check_mark: Implemented retry logic with 3 attempts and 1000ms delay between attempts
  2. :white_check_mark: Called ZoomVideo.destroyClient() between each call session
  3. :white_check_mark: Called zoomClient.leave() before destroying client
  4. :white_check_mark: Removed all event listeners before cleanup
  5. :white_check_mark: Verified the JWT signature is valid (same signature works for web client)
  6. :white_check_mark: Verified the session name is correct (same session joined successfully by web client)
  7. :white_check_mark: Confirmed network connectivity is stable (desktop is online, can make API calls)

Device (please complete the following information)

Failing Device (Desktop/Electron):

  • Device: Windows PC
  • OS: Windows 10.0.26200
  • Browser: Chromium (Electron)
  • Browser Version: 140.0.7339.133

Working Device (Web):

  • Device: Windows PC
  • OS: Windows 19.0.0
  • Browser: Google Chrome
  • Browser Version: 143.0.7499.193

Additional Context

  • Timestamp of failure: 2026-01-21 14:09:27 - 14:09:30 UTC
  • Session ID (web successfully joined): MekJFqDjQyGIJ8kYHHyMMg==
  • Session topic: d3087f56-7b6c-4

Key observation: Both participants are using the same session and JWT signature. The web client joins successfully at 14:09:29.617 UTC, while the desktop client fails at 14:09:29.763 UTC with the same session. This suggests the session is valid and the issue is specific to the desktop/Electron client after consecutive calls.

Questions:

  1. What does errorCode: 200 with reason: "connection error" indicate?
  2. Is there a recommended cooldown period between destroying and recreating the Zoom client?
  3. Are there any known issues with rapid consecutive session joins in Electron environments?
  4. Is there internal SDK state that persists after destroyClient() that could cause this?

Hey @meet-jeavio

Thanks for your feedback.

MekJFqDjQyGIJ8kYHHyMMg==

  1. What does errorCode: 200 with reason: "connection error" indicate?

Usually this happens because the network cannot reach our backend service.

  1. Is there a recommended cooldown period between destroying and recreating the Zoom client?

I see that you set the wait time to 1 second, which is an appropriate value. In fact, we already handle the cleanup in the leave or destroyClient methods; you just need to wait for the method to resolve.

  1. Are there any known issues with rapid consecutive session joins in Electron environments?

No.

  1. Is there internal SDK state that persists after destroyClient() that could cause this?

As mentioned above, we handle the cleanup logic in the destroyClient method.

Thanks
Vic

Hello @vic.yang ,

Thanks for the response. I have following up question, this call was performed from 2 different devices on same new, the electron Desktop app faced this issue but the web app joined successfully, it seems a little unusual that one device joined the call and the other faced errorCode: 200 with reason: “connection error“. Can you check more with logs / think of anything else which might have caused this ?

Hi @meet-jeavio

Sorry, since the logs we have are limited, could you share the HAR file with us if possible?

You can send it to me via direct message.

Thanks
Vic

Hello @vic.yang ,

We are facing this intermittently, I will try to reproduce this and send the HAR file.

While we are on this discussion, I have also observed sometimes that in my console zoom is facing CORS issue, any idea why that happens ?

Hi @meet-jeavio

This is our telemetry service. It does not affect functionality, but if issues occur, we won’t be able to obtain the relevant logs.

This endpoint supports CORS — could some configuration in Electron be causing the CORS headers to be missing from the request?

Thanks
Vic

Hello @vic.yang ,

Thanks for that info. It was on web app, but it’s very helpful to know that it isn’t an error which could affect functionality.

Will send you HAR file soon, can you please send me a message, I am not able to see option for messaging you.

Regards,
Meet