← All stories

BRANCH · ef-095-zoom-integration

Native Zoom integration

EF-095Persona: OrganizerRoots in: event-setupMatrix: Shippable

Organizer creates or links a Zoom meeting/webinar, syncs registrants, persists join/start URLs, and receives signed Zoom webhooks for check-in. This is the only shippable story in the cluster and uses the live integration fixture. Tier-3 tightening: Zoom authorization now references ui-oauth-connection-card for the OAuth connection UX.

Happy path

  1. Connect Zoom and create a webinar.

    Organizer chooses meeting or webinar, submits required details, and Voyage stores Zoom id plus start/join URLs.

  2. Sync registrants.

    Guest registrations create or update Zoom registrants and expose per-row status.

  3. Receive check-in webhook.

    Signed Zoom webhook marks the matching guest checked in once.

Failure modes

OAuth refresh

Expired Zoom token refreshes and retries the original create/sync request.

Rate limit

Zoom 429 uses exponential backoff with jitter.

Webhook replay

Duplicate signed check-in webhook has no second effect.

Schema drift

Unknown fields in Zoom responses are ignored.

Missing credential

Credential errors show re-auth CTA and no stack trace.

Fixture isolation

Live fixture is enforced for the shippable Zoom contract.

Audit row

Every create/sync writes one audit row with Zoom tx-id and counts.

Partial rollback

Registrant sync failure rolls back or shows per-row partial outcomes.

Signature mismatch

Webhook signature mismatch rejects without mutating attendance.

Registrant duplicate

Duplicate email updates existing Zoom registrant rather than creating duplicates.

Join URL persisted

Missing join URL blocks success and surfaces repair.

Host permission denied

Zoom host permission failure shows actionable host/account copy.

Stable test attributes

Visibility teeth. Status, repair, and outcome elements must be visible when active.

data-testWherePurpose
zoom-integration-panelZoom settingsmain surface
zoom-connect-ctaZoom settingsOAuth start
zoom-resource-type-selectorZoom settingsmeeting/webinar choice
zoom-create-resource-ctaZoom settingscreate meeting/webinar
zoom-sync-registrants-ctaZoom settingsregistrant sync
zoom-status-pillZoom settingsconnection/sync state
zoom-registrant-outcome-tableZoom settingsper-row outcomes
zoom-audit-log-rowaudit draweraudit evidence

Agent test plan

- zoom-integration-opens
- zoom-webinar-create-persists
- oauth-refresh-on-expired-token
- rate-limit-backoff
- webhook-replay-idempotent
- schema-drift-degrades-gracefully
- missing-credential-graceful-error
- sandbox-vs-prod-isolation
- audit-log-row-per-sync
- partial-import-rollback
- zoom-webhook-signature-rejects
- zoom-registrant-dedupe
- zoom-join-url-persisted
- zoom-host-permission-denied