Zoom Rooms and Workspaces
cancel
Showing results for 
Search instead for 
Did you mean: 
2025 CMX Awards

The Zoom Community is nominated for the 2025 CMX Community Industry Awards in the Customer Support Community category!

Vote now

What are Zoom Rooms and Workspaces?

Zoom Rooms are modern workspaces that enable in-person and remote participants to interact in real-time in a hybrid setting. Explore the Zoom Community's Recent Activity below to join the Rooms and Workspaces conversation and connect with other members. If you're still looking for support, browse our Zoom Rooms and Workspaces support articles or start a new discussion below!

Recent Activity

Zoom Rooms as a phone, what are the rates?

So I just noticed recently that our Zoom Room controller could make outgoing calls (we also have Zoom Phones setup). I looked at the dashboard in the Phones System Management->Users & Rooms->Zoom Rooms and the package assigned to it is "Zoom Room Com... Show more

So I just noticed recently that our Zoom Room controller could make outgoing calls (we also have Zoom Phones setup). I looked at the dashboard in the Phones System Management->Users & Rooms->Zoom Rooms and the package assigned to it is "Zoom Room Common Area" which says we can do extension to extension calling, metered outbound calls and basic phone features. But I can't google-foo my way to find what the outgoing calling rate is for this package. Does anyone know the link? BTW I am in Australia so AUD please.

Regards

Damien


Show less

reply-icon Latest Reply - 

Transfer to App when entering breakout room

When entering a product support zoom workplace, I get transferred to a breakout room to meet with a support team member. I'm staying in the Zoom Workplace environment instead of being transferred to my Zoom app. This is needed so I can share my scree... Show more

When entering a product support  zoom workplace, I get transferred to a breakout room to meet with a support team member.  I'm staying in the Zoom Workplace environment instead of being transferred to my Zoom app.  This is needed so I can share my screen.  They say it is a setting in my setup.  What is the setting and where do I find it to enable my automatic transfer to my Zoom app when entering a breakout room?  


Show less

reply-icon Latest Reply - 

Zoom Rooms Month Subscription Issues

Hi all, I am seeking a little clarification as I have been stuck on an issue since MarchI have a Zoom Business account with 10 licenses that I use for my organisation.Back in March 2024, we wanted to try some production tools using Zoom Rooms. We sub... Show more

Hi all,

 

I am seeking a little clarification as I have been stuck on an issue since March

I have a Zoom Business account with 10 licenses that I use for my organisation.


Back in March 2024, we wanted to try some production tools using Zoom Rooms. We subscribed for the monthly Zoom Room plan. Thinking that it was a monthly plan and not an annual plan, we thought we could cancel it once our event was done.

When we submitted our request to cancel the subscription, we were told by the renewals manager that we are unable to cancel the monthly plan as the Zoom Room was purchased with our Zoom Business account and therefore we had to continue the monthly subscription until our Zoom Business subscription ends.

I find this pretty strange as to why it's called a monthly subscription, but you're forced to continue the subscription for a whole year.

Here's the most disappointing thing...

Our Zoom Business license just got renewed for another year and the Zoom Rooms monthly subscription has also been auto-renewed till 2025.

 

It is insane because I am having to pay a monthly subscription for 1 year and the renewals manager is not letting me cancel or even change to an annual subscription.

 

I cannot reach out to anybody in Zoom to confirm this and I'm seeking help from the community to advise what I can do.


Show less

reply-icon Latest Reply - 

Providing a community space on line, creating co-hosts and enabling all participants to screenshare

I have set up a recurring meeting for a community of mine to meet regularly weeklyI have set it so the participants can join whether or not the host has started the meetingThe system will not let me set up co hosts in the set up - why not?I also can'... Show more

I have set up a recurring meeting for a community of mine to meet regularly weekly
I have set it so the participants can join whether or not the host has started the meeting
The system will not let me set up co hosts in the set up - why not?
I also can't seem to be able to allow screen sharing for all participants except when I join the meeting as well
I don't join every meeting - I have co-hosts which as I said - I can't set up ...

What can I do - I can't make myself available every week ...


Show less

reply-icon Latest Reply - 

Video recording on last meeting

There was a recording downloading and I save to my desktop as I always to but today the recording was about a second long and did not record the whole two hour meeting. I need that recording. 

reply-icon Latest Reply - 

About open lecture setting

I am conducting a lecture training through ZOOM irregularly, and I want to allow only designated attendees to log in (I cannot collect ZOOM ID). I want to use the ZOOM survey function in the training to create a test paper and have it administered. #... Show more

I am conducting a lecture training through ZOOM irregularly, and I want to allow only designated attendees to log in (I cannot collect ZOOM ID). I want to use the ZOOM survey function in the training to create a test paper and have it administered.

 

# Is it possible to restrict users when logging into Zoom?
Ex) After entering a password, only the people set below can enter by accurately entering their number and name.
241024SJN
241025SIH
241026SIE
241027SIR

 

Let's take an example with a detailed process.

1. When 30 people who applied for the course are accepted,
2. A zoom room with a limit of 30 people is opened,

3. The administrator registers 30 test numbers (or names, specific data),

4. When entering, if you are not the number,

Where can I find a way to set it so that entry is not possible?


Show less

reply-icon Latest Reply - 

Video Not Displaying for Self-Participant in Safari and Firefox with Zoom Video SDK

I am experiencing an issue with the Zoom Video SDK in my React.js project. The problem occurs specifically in Safari (MacOS) and Firefox browsers. While the video for other participants renders correctly, the self-participant's video is not displayed... Show more

 

I am experiencing an issue with the Zoom Video SDK in my React.js project. The problem occurs specifically in Safari (MacOS) and Firefox browsers. While the video for other participants renders correctly, the self-participant's video is not displayed in these browsers.

 

Here are some key details about the issue:

Browsers Affected: Safari (MacOS) and Firefox.
Behavior:
a. In Chrome, the self-participant's video works perfectly.
b. In Safari, the video element for the self-participant remains blank whereas the other person can see my video.
c. In Firefox, the same issue occurs, and no errors appear in the console.
In Chrome and Safari (iOS) everything works fine but in Safari (MacOS) and Firefox I am having this issue. The other person can see my video completely fine but in my screen my video is not being displayed. In the console it is giving below error:

 

Error:
Uncaught Error: The video-player must have a video-player-container as its ancestor element.

Even though this error is also coming in Chrome still it is working fine there. I have attached the code below. Help me solve this issue.

 

 

 

const connectVideo = async (token) => {
if (isJoining) return; // Prevent multiple join attempts
setIsJoining(true);

try {
// await zoomClient.init("en-US", "Global");
await zoomClient.init("en-US", "Global", { patchJsMedia: true, enforceMultipleVideos:true });
await zoomClient.join(roomId, token || videoToken, userName);
zoomSession = zoomClient.getMediaStream();
setRoom(zoomSession);
} catch (error) {
setIsJoining(false); // Reset joining status on error
}
};

 

 

 

const Room = ({ roomName, room, handleLogout, userId, roomId }) => {

const zoomClient = ZoomVideo.createClient();

const getBookingDetails = async () => {
try {
const res = await ApiCall({
route: `booking/get_booking_detail/${roomName}`,
token: token,
verb: "get",
params: data,
});
if (res?.status == "200") {
return setBookingDetail(res?.response?.booking_detail);
} else {
console.log("your error is there", res?.response);
}
} catch (e) {
console.log("your error is there", e);
}
};

const { isLoading, data } = useQuery("bookingDetails", getBookingDetails);

useEffect(() => {
const handleUserAdded = (payload) => {
setParticipants((prevParticipants) => [payload]);
setJoin(true);
};

const handleUserRemoved = (payload) => {
setParticipants([]);
};

const handleZoomPeer = (payload) => {
if (payload.action === "Start") {
// a user turned on their video, render it
room.attachVideo(payload.userId, 3).then((userVideo) => {
document
.querySelector("video-player-container")
.appendChild(userVideo);
});
handleUserAdded(payload);
} else if (payload.action === "Stop") {
// a user turned off their video, stop rendering it
room.detachVideo(payload.userId).then((userVideo) => {
document.querySelector("video-player-container").innerHTML = "";
});
handleUserRemoved(payload);
}
};

zoomClient.on("peer-video-state-change", handleZoomPeer);

return () => {
zoomClient.off("peer-video-state-change", handleZoomPeer);
};
}, [room, participants]);

useEffect(() => {
const userRemoved = (payload) => {
if (join) {
setJoin(false);
}
console.log("user removed", payload);
};
const newUserJoin = (payload) => {
setJoin(true);
getBookingDetails();
console.log("User Joined Called", payload);
};

zoomClient.on("user-added", newUserJoin);
zoomClient.on("user-removed", userRemoved);
}, [join]);

async function askPermission() {
// Checking initial permission state for microphone and camera
const MicroPermission = await navigator.permissions.query({
name: "microphone",
});
const VideoPermission = await navigator.permissions.query({
name: "camera",
});

console.log("Micro Permission At Start", MicroPermission);
console.log("Video Permission At Start", VideoPermission);

try {
if (MicroPermission.state === "prompt") {
Swal.fire({
title: "Microphone access!",
text: "Please allow microphone access to communicate.",
showConfirmButton: false,
icon: "info",
allowOutsideClick: false,
});

// Request microphone access
await navigator.mediaDevices.getUserMedia({ audio: true });

const againMicroPermission = await navigator.permissions.query({
name: "microphone",
});
if (againMicroPermission.state == "granted") {
room.startAudio();
setIsAudio(againMicroPermission.state);
setIsMute(true);

} else if (againMicroPermission.state == "denied") {
setIsAudio(againMicroPermission.state);
setIsMute(false);

// Handle the case when permission is denied
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "error",
confirmButtonText: "Ok",
});
}
Swal.close();

} else {
setIsAudio(MicroPermission.state);
}
} catch (error) {
// Handle any errors (e.g., if the user denies access)
console.log("Error requesting microphone permission:", error);
if (
error.name === "NotAllowedError" ||
error.name === "PermissionDeniedError"
) {
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "error",
confirmButtonText: "Ok",
});
}
}

try {
// If video permission state is "prompt", ask the user for permission
if (VideoPermission.state === "prompt") {
Swal.fire({
title: "Camera access!",
text: "Please allow camera access to communicate.",
showConfirmButton: false,
icon: "info",
allowOutsideClick: false,
});

// Request microphone access
await navigator.mediaDevices.getUserMedia({ video: true });

const againVideoPermission = await navigator.permissions.query({
name: "camera",
});
if (againVideoPermission.state == "granted") {
setIsCamera(againVideoPermission.state);
setIsVideo(true);
console.log(
"Camera permission granted:",
againVideoPermission.state,
isCamera
);

room.startVideo().then(() => {
room
.attachVideo(zoomClient.getCurrentUserInfo().userId, 3)
.then((userVideo) => {
document
.querySelector("video-local-player-container")
.appendChild(userVideo);
});
});
} else if (againVideoPermission.state == "denied") {
setIsCamera(againVideoPermission.state);
setIsVideo(false);
console.log(
"Camera permission denied:",
againVideoPermission.state,
isCamera
);
// Handle the case when permission is denied
Swal.fire({
title: "Camera Access Denied",
text: "You have denied microphone access. Some features may not work properly.",
icon: "warning",
confirmButtonText: "Ok",
});
}
Swal.close();
console.log(
"Again Camera Permission Check",
againVideoPermission,
isCamera
);
} else {
setIsCamera(VideoPermission.state);
}
} catch (error) {
// Handle any errors (e.g., if the user denies access)
console.log("Error requesting camera permission:", error);
if (
error.name === "NotAllowedError" ||
error.name === "PermissionDeniedError"
) {
Swal.fire({
title: "Camera Access Denied",
text: "You have denied camera access. Some features may not work properly.",
icon: "warning",
confirmButtonText: "Ok",
});
}
}
}

useEffect(() => {
askPermission();
}, []);

useEffect(() => {
socketConnection.on("doctorCompleted", (data) => {
console.log("doctor left the video");
console.log(data?.booking_id, roomId, data?.booking_id == roomId);
if (data?.booking_id == roomId) setDoctorCompleted(true);
});
}, []);

// on metting leave
const onMeetingLeave = (id) => {
if (bookingDetail?.doctor_id?.user_id) {
Swal.fire({
title: "Are you sure?",
text: "Do you want to end consultation?",
icon: "warning",
showCancelButton: true,
cancelButtonText: "No",
confirmButtonText: "Yes",
confirmButtonColor: "#c82333",
}).then(async (result) => {
if (result.isConfirmed) {
handleLogout(true);
}
});
} else {
if (!bookingDetail?.doctor_id?.user_id) {
Swal.fire({
title: "Are you sure?",
text: "Do you want report delay from doctor and reschedule?",
icon: "warning",
showCancelButton: true,
cancelButtonText: "No",
confirmButtonText: "Yes",
confirmButtonColor: "#c82333",
}).then(async (result) => {
if (result.isConfirmed) {
setShowReportModal(true);
}
});
}
}
};
// main return

const sendNotificationHandler = async () => {
try {
const res = await ApiCall({
route: `receiptionist/add_notifications_for_receptionists`,
token: token,
verb: "post",
params: {
bookingId: bookingDetail?._id,
},
});
console.log(res?.response, "response");
if (res?.status == "200") {
console.log("res", res?.response);
Swal.fire(
"Your request for urgent attention has been notified.",
"Staff will be in contact with you soon.",
"success"
);
setTimePassed(new Date());
} else {
console.log("your error is there", res?.response);
}
} catch (err) {
console.log("Coudln't send", err);
}
};

const reportAndRescheduleHandler = async () => {
setShowReportModal(true);
};

const closeReportModal = () => {
setShowReportModal(false);
};

let items = [];

if (
participants?.length <= 0 &&
!bookingDetail?.doctor_id?.user_id &&
(new Date() - timePassedForDelay) / (1000 * 60) > 20
) {
items.push({
id: "1",
label: (
<PrimaryButton
className="report-button "
onClick={reportAndRescheduleHandler}
>
Report Delay & Reschedule
</PrimaryButton>
),
});
}

if (
participants?.length <= 0 &&
!bookingDetail?.doctor_id?.user_id &&
(new Date() - timePassed) / (1000 * 60) > 4
) {
items.push({
id: "2",
label: (
<PrimaryButton
className="notify-receptionist"
onClick={sendNotificationHandler}
icon={
<i
style={{ transform: `rotate(0deg)` }}
class="fa-solid fa-phone"
></i>
}
>
Ring again
</PrimaryButton>
),
});
}

const toggleVideo = async () => {
console.log("Valuevale", isVideo);
if (isCamera === "granted") {
if (isVideo) {
console.log("video is allowed", isVideo);
room.stopVideo().then(() => {
room
.detachVideo(zoomClient.getCurrentUserInfo().userId)
.then((userVideo) => {
document.querySelector("video-local-player-container").innerHTML =
"";
});
});
setIsVideo(false);
} else {
room.startVideo().then(() => {
room
.attachVideo(zoomClient.getCurrentUserInfo().userId, 3)
.then((userVideo) => {
console.log("userVideo", userVideo);
document
.querySelector("video-local-player-container")
.appendChild(userVideo);
});
});
setIsVideo(true);
}
} else {
Swal.fire({
title: "Camera Permission",
text: "You have denied camera access. Please allow from the setting.",
icon: "warning",
confirmButtonText: "Ok",
});
}
};

useEffect(() => {
if (zoomClient && room) {
zoomClient
.getAllUser()
.filter((user) => user.userIdentity !== userId)
.forEach(async (user) => {
if (user.userIdentity !== userId) {
console.log(user, "user already joined");
if (user.bVideoOn) {
room
.detachVideo(user.userId)
.then((userVideo) => {
document.querySelector("video-player-container").innerHTML =
"";
})
.then(() => {
room.attachVideo(user.userId, 3).then((userVideo) => {
document
.querySelector("video-player-container")
.appendChild(userVideo);
});
});

setParticipants([user]);
}
setJoin(true);
setUsers(user);
}
});
}
}, [zoomClient, room]);

const toggleAudio = async () => {
try {
console.log("ismute value is", isMute);
if (isAudio === "granted") {
await room.startAudio();
if (isMute) {
await room.muteAudio();
setIsMute(false);
} else {
await room.unmuteAudio();
setIsMute(true);
}
} else {
Swal.fire({
title: "Microphone Access Denied",
text: "You have denied microphone access. Please allow from the setting.",
icon: "warning",
confirmButtonText: "Ok",
});
}
} catch (error) {
console.error("Error toggling audio:", error);
}
};

console.log(participants);

return (
<>
<div className="main-container-video-chat">
<div className="video-chat-container-header">
{!isMobile && (
<DrawerApp
getBookingDetails={getBookingDetails}
bookingDetail={bookingDetail}
/>
)}
<img
onClick={() => navigate("/my-consultation")}
src={logo1}
alt="logo"
className="video-chat-header-logo"
/>

<button
className="custom-button-video-call mobile-end-consultation end-consultation"
onClick={() => onMeetingLeave(bookingDetail?._id)}
>
End
</button>
</div>
<div className="video-chat-section-container-main">
<div className="video-chat-inner-contianer">
<div className="videoDiv-main">
<div
className="remote-video"
style={{ display: participants.length == 0 ? "none" : "" }}
>
<video-player-container></video-player-container>
</div>

{join ? (
participants.length == 0 ? (
<div class="video-call-ended-text-in-box">
<p>Doctor has turned off their camera!</p>
</div>
) : (
""
)
) : (
<div class="video-call-ended-text-in-box">
<h4 class="h4">Consultation Paused!</h4>
<p>
{bookingDetail?.doctor_id?.user_id
? " We've notified the doctor. "
: " "}
Doctor will be in the session soon, please don't hesitate to
ask any questions in chat.
</p>
</div>
)}

<div className="local-user-video">
{isCamera === "granted" ? (
isVideo ? (
<div className="local-video">
<video-local-player-container></video-local-player-container>
</div>
) : (
<div className="local-user-off-cam">
<i class={`fa-solid fa-video-slash text-7`}></i>
<p>Camera turned off.</p>
</div>
)
) : (
""
)}
<video-local-player-container></video-local-player-container>
</div>

{isMobile && (
<div className="mobile-long-buttons-on-top">
{items?.length == 2
? items?.find((el) => el?.id == "1")?.label
: items?.find((el) => el?.id == "2")?.label}
</div>
)}
<div className="video-chat-controls">
{isMobile && (
<DrawerApp
getBookingDetails={getBookingDetails}
bookingDetail={bookingDetail}
/>
)}
{isMobile && (
<ChatDrawer
selectedChat={{
_id: bookingDetail?.chat_id,
booking: bookingDetail,
}}
/>
)}

<button
className={
isCamera === "granted"
? "chat-control-button video-active"
: "chat-control-button"
}
onClick={() => toggleVideo()}
style={{
backgroundColor:
isCamera === "granted"
? isVideo
? "blue"
: "red"
: "orange",
}}
title={
isCamera == "granted"
? "Video Management"
: "Please provide video permissions"
}
>
<i
class={`fa-solid fa-video${isVideo ? "" : "-slash"} text-7`}
></i>
</button>

<button
className={
isAudio === "granted"
? "chat-control-button video-active"
: "chat-control-button"
}
onClick={() => toggleAudio()}
style={{
backgroundColor:
isAudio === "granted"
? isMute
? "blue"
: "red"
: "orange",
}}
title={
isMute
? "Audio Management"
: "Please provide audio permissions"
}
>
<i
class={`fa-solid fa-microphone${
isMute ? "" : "-slash"
} text-3`}
></i>
</button>
</div>
<div className="video-chat-main-buttons">
<PrimaryButton
className="end-consultation"
onClick={() => onMeetingLeave(bookingDetail?._id)}
>
End Consultation
</PrimaryButton>
{items?.length == 2
? items?.find((el) => el?.id == "1")?.label
: items?.find((el) => el?.id == "2")?.label}
</div>
</div>
</div>

{bookingDetail && !isMobile && (
<ChatBox
selectedChat={{
_id: bookingDetail?.chat_id,
booking: bookingDetail,
}}
/>
)}
</div>
</div>
<ReportModal
open={showReportModal}
close={closeReportModal}
bookingId={bookingDetail?._id}
handleLogout={handleLogout}
/>
</>
);
};

export default Room;

 


Show less

reply-icon Latest Reply - 

Zoom Room Updates not Publishing (newcloud.media)

Hello, We are using a Newcloud.Media account to post when visitors show up to our location. This integrates with our Zoom Room via showing a website which updates every 10 minutes. The issue we have is that sometimes this update takes HOURS to happen... Show more

Hello,

 

 

We are using a Newcloud.Media account to post when visitors show up to our location.  This integrates with our Zoom Room via showing a website which updates every 10 minutes.  The issue we have is that sometimes this update takes HOURS to happen.  Typically more than 2-4 hours to display an update to this site that shows when a visitor is coming.  We have tried adding the website in twice to force it to update every 10 minutes- but when you publish the change, it still does not occur at a reasonable time.  We want to be able to add when a visitor is coming with it updating at a much faster rate - especially if we want to welcome a visitor and it is less than a 2-4 hour notice.

 

Does anyone have this issue and know what may be blocking this digital signage room to update at a reasonable time?  Any help would be appreciated.  Again, it is a site that is being updated via newcloud.media

 

Thank You!


Show less

reply-icon Latest Reply - 

Tap Controller to Start Display

Does anyone know how to change the background image of the screen that says "Tap Controller to Start?" The default is a shot of the Golden Gate bridge in the clouds. We've manage to change the display for Digital Signage but when there's a call start... Show more

Does anyone know how to change the background image of the screen that says "Tap Controller to Start?" The default is a shot of the Golden Gate bridge in the clouds. We've manage to change the display for Digital Signage but when there's a call starting, it changes to this image, which we'd like to change. Can't figure it out!

 

here is an image: https://postimg.cc/TKzXmcxn  

 

Thanks in advance!


Show less

reply-icon Latest Reply - 

Jabra Panacast 50 VBS Changing Tv display "Tap Controller to Start Display" screen

Have a Jabra Panacast 50 VBS that we want to change the "Tap Controller to Start Display" screen to our company logo. (Not a virtual Background) Has anyone been able to add file to change that screen? have seen some vague answers to this but still no... Show more

Have a Jabra Panacast 50 VBS that we want to change the "Tap Controller to Start Display" screen to our company logo. (Not a virtual Background) 

Has anyone been able to add file to change that screen? have seen some vague answers to this but still not seeing the correct menu options.

 

Referencing this https://community.zoom.com/t5/Zoom-Rooms-and-Workspaces/Tap-Controller-to-Start-Display/m-p/157695/highlight/true

 

I don't see a "Rooms Profile" in settings which seems to be the key. 

 

Is it a limitation on the hardware we have? Do I need to have the admin account get to the "Rooms Profile" menu to add the file for the background?   


Show less