Inconsistency between OAuth Installation and Webhook Data for User-Managed App

Hi!
I’m experiencing an inconsistency between the data received during app installation and webhook events for my user-managed Zoom app.

Current Behavior:

  1. When a user installs the app (OAuth flow):

    • I receive the user_id: ‘Cbjk82LdRYeeMakV2Jo8eQ’
    • account_id is null/not provided
  2. When receiving webhooks (e.g., meeting.started):

    • I receive the account_id: ‘HUIB2tWdSTmoEUMiRJzO5w’
    • The user_id is included as host_id: ‘Cbjk82LdRYeeMakV2Jo8eQ’

Issue:
For a user-managed app, I need to retrieve the user’s access token when processing webhooks. However, the webhook primarily identifies the user by account_id, while my stored OAuth credentials are mapped to user_id.

Questions:

  1. Is this the intended behavior for user-managed apps?
  2. What is the recommended way to map between account_id and user_id in this scenario?
  3. Can webhooks include the same user identification method (user_id) as provided during OAuth installation?

Example Logs:
[Webhook Payload]
{
‘event’: ‘meeting.started’,
‘payload’: {
‘account_id’: ‘HUIB2tWdSTmoEUMiRJzO5w’,
‘object’: {
‘host_id’: ‘Cbjk82LdRYeeMakV2Jo8eQ’,

}
}
}

[OAuth Installation Data]
{
‘id’: ‘25b0f32b-ee6e-4f14-b2b5-27b5d61809b2’,
‘user_id’: ‘Cbjk82LdRYeeMakV2Jo8eQ’,
‘account_id’: null,

}

Environment:

  • App Type: User-managed
  • OAuth Scopes:
    • meeting:read:local_recording_token (View a meeting local recording join token)
    • meeting:read:meeting (View a meeting)
    • meeting:read:list_meetings (View all user meetings)
    • user:read:user (View all user information)
    • user:read:zak (View user’s zak token)
  • Webhook Events: meeting.started

Thank you for your help in clarifying this behavior :slight_smile:
Tamir :slight_smile:

Hey @Tamir
Thanks for reaching out to us!
Allow me to troubleshoot this on my end and I will get back to you.

Hey @Tamir
Thanks for your patience here.
Since you’re working with a user-managed app, you’re actually doing the right thing by mapping the user_id. This is because you need the user_id of the specific user who authorized the app.

When you listen for events, you’ll receive the account_id, user_id, and host_id. You receive both the host_id and user_id because events are only triggered for actions that happen within that specific user’s account.

To map account_id and user_id, you’ll be able to do so when receiving events. You’ll notice that the account_id will never change, nor will the user_id.

Hi Elisa,

Thank you for your response! However, I think there might be a misunderstanding that I’d like to clarify.

You mentioned that “When you listen for events, you’ll receive the account_id, user_id, and host_id.” However, looking at my webhook payload, I only receive:

  • account_id at the root level
  • host_id in the object payload (which matches the user_id from OAuth installation)

More importantly, I have a fundamental question about my use case: How can I handle meetings where my authenticated user is a participant but not the host? The current webhook only tells me about the host, but not about other participants.

For example:

  1. User A installs my app (I store their user_id and access token)
  2. User B starts a meeting where User A is an invited participant
  3. I receive a meeting.started webhook, but it only contains User B’s host_id
  4. I have no way to know that User A (my authenticated user) should join this meeting

Is there a webhook event type that notifies about meetings where my authenticated user is an invited participant? Or is there another recommended approach for this use case?

Thank you for your help!
Tamir

Hi @Tamir
Thanks for the clarification

If user B does not install your app, you won’t have a way to know that User A joined their meeting.

Because user A installed your app, you will receive events associated with User A’s account, so if user A starts a meeting on their end you will receive events; but for any action that occurs in user B’s account, you won’t receive those events because user B has not installed your app

Let me know if this helps to clarify your issue