Some meeting events subscribed from webhook are not generated/delivered

Summary

I have a webhook only app that I subscribed to variety of meeting and recording events. Only some are delivered and I would like to find out why.

Account and App Identifiers

I am working in account (account ID 5157459688) in Workplace Pro plan as Developer.

My accountId is xA3xyp4gRqCphkCtzyWVFQ

My user id is w-M9oabzTNiLgFtLhuVMOA

Webhook Configuration

I built a Webhook only app (app ID JuywQorZRaGiKhFDpcougg) that I have not yet released.

In app, I’ve subscribed to the following events (subscriptionId U3d7alPESbeLJVRL25Lg0g):

  • Meeting
    • Start Meeting meeting.started
    • End Meeting meeting.ended
    • Participant/Host joined meeting meeting.participant_joined
    • Participant/Host left meeting meeting.participant_left
    • Meeting Sharing Started meeting.sharing_started
    • Meeting Sharing Ended meeting.sharing_ended
    • Participant was admitted into a meeting meeting.participant_admitted
  • Recording
    • All Recordings have completed recording.completed
    • Recording Transcript files have completed recording.transcript_completed
    • Recording Started recording.started
    • Recording Stopped recording.stopped
    • Recording Paused recording.paused
    • Recording Resumed recording.resumed
    • Recording files have been deleted to Trash (??? not sure which one this is)
    • Recording Renamed recording.renamed
    • Recording files batch deleted to Trash recording.batch_trashed
    • Batch recording deleted recording.batch_deleted

I really only care about meeting.ended, recording.completed and recording.transcript_completed but I wanted to see which other events contain what.

URL configuration

I have configured webhook URL with OAuth Token Authentication, specifying Client ID and Client Secret and using client_credentials scope.

My current endpoint does not yet support validation yet but since the app is in dev mode the webhook works okay without app going live

Testing Meeting

I then start a meeting (ID=86083321846, uid=h/CdOqx0TVm7425z1rWL+Q==, and in it I did the following actions:

  • invite someone anonymous
  • unmute myself
  • start recording
  • start screen sharing
  • pause recording
  • start recording
  • stop screen sharing
  • stop recording
  • end meeting for all

… some time elapses for recordings to complete, I then see the recordings and transcripts complete:

  • rename recording
  • delete recording
  • clear out recording trash

The things above should have exercised all the events I subscribed to

Webhook Logs from Zoom

Out of these events, using the Zoom marketplace webhook logs on Zoom side and in my logging on my webhook side, I receive:

  • meeting.started (03:52:35 PM Mar 27, 2026 PT/1774651955250 requestId=56c186d7_7d7f_43fa_833c_6a28870e7787, traceId=v=2.0;clid=us05;rid=WEB_18f8606459c0247aab8dec03ce5c3be7)
  • meeting.ended (03:54:17 PM Mar 27, 2026 PT/1774652057080, requestId=b3b4493b_0339_4d16_8720_8623d267ab47, traceId=v=2.0;clid=us05;rid=WEB_0c13571d3d29adf6699b3147a6f2afc5)
  • recording.completed ( 03:55:13 PM Mar 27, 2026 PT/1774652113234 requestId=41ace4e0_9860_47e5_81aa_485b944bcd73, traceId=v=2.0;clid=us05;rid=WEB_ca9d237f415b088b36d83805ab0d38eb)

I see exactly those 3 events arriving in my webhook handler with correct payloads. I do not see any other events I subscribed to.

Questions

Question 1 recording.transcript_completed not being delivered

I am not getting recording.transcript_completed event. Why?

[Answering myself] The very pointed developers.zoom.us/blog/not-receiving-webhooks (why can’t we have URLs here?) suggested I check my plan. Well what do you know, recording.transcript_completed does state that I need “A Business, Education, or Enterprise license.”, and I am on the Workspace Pro. Is this the most likely cause?

Question 2 - No other meeting events delivered

These Meeting events that I am subscribed to like meeting.participant_admitted do not list the Zoom subscription plan limitation. Why am I not getting those events? :

  • Participant/Host joined meeting meeting.participant_joined
  • Participant/Host left meeting meeting.participant_left
  • Meeting Sharing Started meeting.sharing_started
  • Meeting Sharing Ended meeting.sharing_ended
  • Participant was admitted into a meeting meeting.participant_admitted

Question 3 - recording.completed delivered but not the other recording.*** events

recording.completed event says it is delivered for “A Pro or higher plan”. I am seeing it in my Workspace Pro so I guess I am Pro!

However, I am not getting any other events which state that they have the same plan - why?:

  • Recording Started recording.started
  • Recording Stopped recording.stopped
  • Recording Paused recording.paused
  • Recording Resumed recording.resumed

Question 4 - recording file File manipulation events not delivered

None of these events are showing up. Why?:

  • Recording files have been deleted to Trash (??? not sure which one this is)
  • Recording Renamed recording.renamed
  • Recording files batch deleted to Trash recording.batch_trashed
  • Batch recording deleted recording.batch_deleted

Thank you
Daniel

I have had an administrator upgrade my plan to Workspace Business and reran my tests. Behavior is the same, I am not seeing the recording.transcript_completed or any of the other recording events or any attendee/screen sharing events. Bah!

You’re likely hitting two separate issues.

For recording.transcript_completed, the current Zoom docs point to audio transcription needing cloud recording enabled and the transcription feature enabled on your customer’s Zoom organization and that the customer needs to be on an eligible paid account.

For the missing participant events, Zoom’s webhook docs explicitly tie meeting.participant_joined to participant read scopes. That fits a webhook-only app that receives broad meeting lifecycle events like started and ended, but not participant-level events like joined, left, or admitted. The practical fix is to move this to a Server-to-Server OAuth app with the needed admin scopes and then retest from Marketplace webhook logs.

I could not find current doc-backed proof for why sharing events, recording started or stopped, or the other events were skipped in that exact run. The best single check is to repeat the same meeting flow from a Server-to-Server app with participant scopes and compare the results against Zoom’s webhook delivery logs and event history. If those events still never appear in Zoom’s own logs, that is strong support case material with the app ID, subscription ID, meeting UUID, and timestamps.

Alternatively, you could use Recall.ai’s Meeting Bot API to capture recordings, transcripts, and participant timelines.

Thank you for detailed response.

Looking at Recall.ai web site it would appear I am trying to do something like what you offer, indeed. But let’s set that aside for now.

Interesting what you say about meeting.participan_joined events for the webhook-only app not to have the necessary scopes to read. Are you sure? I don’t see anywhere in webhook-only apps where one can choose scopes, and I was under impression that they were automatically selected to match what events I was selecting.

In fact, both meeting.ended, and meeting.participant_left and meeting.participant_joined specify these same scopes:

meeting:read:admin,meeting:write:admin,meeting:read,meeting:write,meeting:master

… so it doesn’t make sense that meeting.ended is sent but not the other ones.

The plot thickens though! After the weekend, my environment was updated to Workspace Business and I was made an admin. As result, my prior apps became unavailable for modifications (weird!? why? I am still the same person, and I though Admin > Developer?) and the webhook-only app stopped sending any events.

I decided to make another webhook-only app with configuration identical and to my surprise and some measure of delight, I am getting meeting.ended, meeting.participant_joined, meeting.participant_left , recording.transcript_completed , and recording.completed events, like I wanted in the first place. I can’t explain why it’s working here for me as Admin but …

Thank you
Daniel