Question
People commonly ask on the Zoom Developer Forum:
How can I reliably map meeting webhooks (like meeting.started) back to my database when using PMI? I save tracking_fields when creating a meeting via API, but when the meeting starts Zoom converts it to a PMI meeting (type 4), the webhook id becomes the PMI, and the topic changes. The meeting.started payload doesn’t include my tracking_fields, so what unique value can I use that’s consistent between creation and webhooks?
Answer
Using PMI for programmatic meetings causes Zoom to normalize events to the host’s Personal Meeting ID (type 4). This means: - The webhook object.id becomes the PMI. - The topic changes to the PMI room name. - Your tracking_fields aren’t present in the meeting.started payload you shared.
Best practices to ensure reliable mapping:
-
Prefer scheduled meetings over PMI - Create meetings with use_pmi: false. - Store the meeting UUID from the create response. - Match webhook events using payload.object.uuid from meeting.started/meeting.ended.
-
If you must keep PMI - Use a composite key of host_id + pmi in your database. - Map webhook events using payload.object.host_id and payload.object.id (the PMI). - Avoid relying on topic or transient meeting ids that change under PMI.
-
Keep tracking_fields in your DB - Persist tracking_fields at creation time and join them to webhook events via the stable key you choose (UUID for scheduled meetings, or host_id + pmi for PMI).
Zoom Developer Forum Examples
Some examples of this question are:
