This applies only to new MatrixRTC (aka element-call) calls, not to jitsi-widget-based calls and not to “old-style” direct 1:1 calls.
The problem
You’ve got an ongoing element-call, despite no one really being in it. It is stuck and you cannot end it. In Element-Web’s room list this looks like this:
Resolution
Step 1: Open devtools
In Element-Web, open devtools by typing /devtools
in the room’s chat text box and hitting <ENTER> twice:
You should now see the rooms devtools dialog:
⏵Click on Explore Room State
.
Step 2: Check Room states
Below, you can see the room state. In this case, there is a state for org.matrix.msc3401.call
and a state for org.matrix.msc3401.call.member
, these relate to element-call.
As long as there are active members in a call, your client will deduce that there is an ongoing call. So you “just” need to remove the members. Slight complication: for technical reasons, you can never remove a state, you can only update it. Therefore we need to update the call members to have an empty state.
⏵Click on the button org.matrix.msc3401.call.member
.
Step 3a: Remove members
You can now see everyone who ever participated in a call (not only those who are currently active). You see that a few alter egos of me have been talking to each other in this room (should I be concerned?)
⏵Click on each member entry, the dialog will be looking something like this:
The above case is a joined (=active) member in a call, as the "content": {}
section is not empty. For some members, the content might already be empty ({}
). These are not part of the call anymore and we can ignore these entries.
If the "content": {}
section is non-empty (there is stuff within these brackets), click Edit
and empty it:

⏵Hit Send
and go Back
. Rinse and repeat for all active members. If none is left, the call should automatically stop showing up as being active in Element-Web.
Step 3b (optional?): Remove the “org.matrix.msc3401.call”
From the Room state explorer, open up the state org.matrix.msc3401.call
, mine looked something like this:
and Edit
it, setting the content to empty, that is just empty bracket: {}
. It should look something like this:

⏵Hit Send
. I am not sure that Step 3b is actually needed, but it certainly did not hurt.
Additional Recommendations
Delayed events
Usually calls should be properly terminated when people leave it, but in some cases (closing browser tab, connection disrupted,…) things might get stuck. To solve this, “delayed events” have been introduced in synapse, which provide kind of a dead man’s switch:
If you don’t update the delayed event regularly, your presence from the call will automatically be removed after a while. Delayed events are not enabled by default in synapse yet, you need to do so manually by setting:
# enable delayed events, so we quit calls that are interrupted somehow
max_event_delay_duration: 24h
in your homeserver.yaml. There is no downside to enabling them, so I recommend that everyone does.
Please send corrections and improvement suggestions to me. I usually hang out in the “Element web” and “Element-X-Android” matrix rooms. But I refuse unsolicited DM requests, so please ping me in one of the rooms.