HubSpot + Zoom: what the native integration cannot do

HubSpot has an official Zoom app in the HubSpot App Marketplace. It works — meetings are created from HubSpot, attendee data reaches the CRM. Problems start in the details: an attendee joined without a Zoom account — contact not created, a registration form with additional fields — registration fails, data from multiple Zoom accounts is needed — only one can be connected. These are the exact cases where teams discover the limits of the native integration.

What the native HubSpot + Zoom integration can do

As of Q2 2026 the native integration provides:

  • Creating a Zoom meeting from HubSpot Meetings: when a meeting is booked via HubSpot Meeting Link, a Zoom event is automatically created with the link
  • Webinar sync: Zoom Webinar registrant and attendee data -> HubSpot contacts
  • Basic participation data: who attended, how long they stayed
  • HubSpot Marketing Events: Zoom webinars appear as marketing events in the contact timeline

For basic use this is sufficient. Limitations appear at scale or in non-standard scenarios.

Limitation 1: attendees without a Zoom account do not create contacts

If an attendee joined the Zoom meeting without logging into Zoom (entered a name as a guest, did not log in) — HubSpot does not receive that person’s email. A contact is not created.

Real scenario: a webinar for prospective customers. 40% of the audience joins as “John Smith” without logging in. Half the leads are silently lost.

Custom solution: the Zoom Webinars API returns extended attendee data via GET /webinars/{id}/registrants — including the email of everyone who registered, even if they joined as a guest. Registration data exists — it simply does not reach HubSpot through the native connector.

import requests

def get_webinar_registrants(webinar_id: str, zoom_token: str) -> list:
    response = requests.get(
        f'https://api.zoom.us/v2/webinars/{webinar_id}/registrants',
        headers={'Authorization': f'Bearer {zoom_token}'},
        params={'status': 'approved', 'page_size': 300}
    )
    return response.json().get('registrants', [])

# Create/update HubSpot contact for each registrant
for registrant in get_webinar_registrants(WEBINAR_ID, zoom_token):
    upsert_hubspot_contact(
        email=registrant['email'],
        first_name=registrant['first_name'],
        last_name=registrant['last_name'],
        properties={'zoom_webinar_attended': True}
    )

Limitation 2: only three fields in the registration form

The native integration supports exactly three required fields in Zoom registration: First Name, Last Name, Email. If additional required fields are configured on the Zoom side (company, job title, phone) — registration through the HubSpot Meeting Link fails without a clear error for the user.

This is a typical failure point for B2B webinars where marketing wants to collect more detailed registrant data.

Correct approach: collect additional fields through a HubSpot Form (not through the Zoom Registration Form), then programmatically create the Zoom registration via the Zoom API with already-available data:

def register_for_webinar(webinar_id: str, contact: dict, zoom_token: str):
    payload = {
        'email': contact['email'],
        'first_name': contact.get('firstname', ''),
        'last_name': contact.get('lastname', ''),
        'org': contact.get('company', ''),
        'job_title': contact.get('jobtitle', '')
    }
    response = requests.post(
        f'https://api.zoom.us/v2/webinars/{webinar_id}/registrants',
        headers={'Authorization': f'Bearer {zoom_token}'},
        json=payload
    )
    return response.json().get('join_url')

Limitation 3: one Zoom account for the entire HubSpot portal

Only one Zoom account (one tenant) can be connected to a single HubSpot portal. If the company has multiple Zoom Business accounts (e.g., by region) — all data comes from only one of them.

With a custom integration: a backend receives data from multiple Zoom accounts via Server-to-Server OAuth, aggregates it, and writes to HubSpot:

ZOOM_ACCOUNTS = [
    {'account_id': 'ACC_EU', 'client_id': '...', 'client_secret': '...'},
    {'account_id': 'ACC_US', 'client_id': '...', 'client_secret': '...'},
]

for account in ZOOM_ACCOUNTS:
    token = get_zoom_server_to_server_token(account)
    meetings = get_recent_meetings(token)
    for meeting in meetings:
        sync_meeting_to_hubspot(meeting)

Limitation 4: poll responses and Q&A are not synced

Zoom Webinar supports polls and Q&A sessions. This data is a valuable sales signal: who answered “Yes” to a budget question, who asked about pricing.

The native integration transmits: attendance fact and duration. Poll responses and Q&A — no.

The Zoom API provides this data:
GET /webinars/{id}/polls/results — attendee poll responses
GET /webinars/{id}/qa — Q&A questions

With a custom integration, poll responses are written as HubSpot Custom Properties or Timeline Events, and Workflows can be built on them:

def sync_poll_results(webinar_id, zoom_token, hubspot_client):
    poll_results = requests.get(
        f'https://api.zoom.us/v2/webinars/{webinar_id}/polls/results',
        headers={'Authorization': f'Bearer {zoom_token}'}
    ).json()

    for question_data in poll_results.get('questions', []):
        email = question_data['email']
        for qa in question_data.get('question_details', []):
            # Write response as HubSpot Timeline Event
            hubspot_client.crm.timeline.events.basic_api.create({
                'eventTemplateId': POLL_EVENT_TEMPLATE_ID,
                'email': email,
                'tokens': [
                    {'name': 'question', 'value': qa['question']},
                    {'name': 'answer', 'value': qa['answer']}
                ]
            })

Limitation 5: January 2025 change — segmentation by Zoom data

From January 8, 2025 HubSpot discontinued support for Zoom contact-based properties for contact segmentation and enrollment criteria in Workflows. Zoom engagement data was moved to the Marketing Events framework.

If teams were using segments like “attended Zoom webinar X” — those segments stopped updating. Workflows based on Zoom contact properties — broke.

This is a well-documented breaking change that caught teams with established automation off guard. A custom integration via Timeline Events and custom properties is more resilient to native connector changes.

When the native integration is sufficient

The native HubSpot + Zoom integration covers the use case when:
— Webinars are simple: three registration fields, no additional data
— Poll responses and Q&A in the CRM are not needed
— One Zoom account for the whole company
— Attendees always log into Zoom (corporate audience)
— Zoom contact-based properties were not used in segmentation before 2025

Similar limitations of HubSpot native integrations are covered in the article HubSpot + Slack: what the native integration cannot do — the pattern is the same: native works for the basic case, custom works for real team requirements.

Real-world case

B2B SaaS company (webinars twice a month, 300–500 attendees, pipeline from webinars — 30% of quarterly revenue):

  • Enabled native integration -> 2 months later discovered: 35% of registrants did not create contacts in HubSpot (joined without a Zoom account), poll data about attendee budgets was gone.
  • Custom integration: Zoom Webinar API -> all registrants created in HubSpot at registration, poll responses -> Timeline Events -> Workflow qualifies leads with the right answers.
  • Result: webinar pipeline grew 28% by recovering lost contacts and automating lead qualification based on poll data.

Frequently asked questions

Zoom Events vs Zoom Webinars — what is the difference for HubSpot integration?

Zoom Events is a new product for multi-session conferences. The native HubSpot integration does not support Zoom Events at all. Zoom Webinars are supported, but with the limitations described above. For Zoom Events — only a custom integration via the Zoom Events API.

How to fix contact loss due to guest Zoom attendance?

The only reliable solution is to collect email at registration (before the meeting), rather than relying on Zoom account identification. HubSpot Form -> programmatic Zoom API registration. The email is known before the person joins the meeting.

HubSpot stopped supporting Zoom properties — what to do with existing workflows?

Check all Workflows and Smart Lists for Zoom contact property usage. Replace with Marketing Events conditions (Has attended event: [Webinar Name]) or switch to custom Timeline Events for flexibility. HubSpot provided a migration guide when the change was announced in November 2024.

Server-to-Server OAuth vs User OAuth for Zoom API — which to choose?

Server-to-Server OAuth (Account-level app) — the preferred option for custom integrations: no user action required for authorization, token is obtained automatically. User OAuth is needed when the integration must act on behalf of a specific user (e.g., create meetings in their personal Calendar).

Summary

  • Native HubSpot + Zoom integration: basic attendee and webinar sync, one Zoom account, three registration fields
  • Key limitations: attendees without Zoom accounts are lost, no poll/Q&A data, one Zoom account, breaking change in January 2025
  • Custom integration: Zoom Webinar API -> all registrants in HubSpot, poll responses as Timeline Events, multiple Zoom account support
  • Typical result: recovery of 30–40% of lost contacts, lead qualification based on poll data

If you run webinars through Zoom and notice losses in HubSpot — describe your registration flow and what data you need. Exceltic.dev will identify exactly where the native integration breaks and propose an architecture.

More articles

All →