Zoom Connector

Forbind Zoom til Brevo via Tajo for automatisk at synkronisere mødedeltagere og webinardeltagere som kontakter, udløse opfølgningssekvenser efter møder og spore engagementmetrikker til dine marketingautomatiseringer.

Oversigt

EgenskabVærdi
PlatformZoom
KategoriVideokonferencer (brugerdefineret)
OpsætningskompleksitetMellem
Officiel integrationNej
Synkroniserede dataDeltagere, hændelser, webinarer, kontakter
AutentifikationsmetodeOAuth 2.0 / Server-to-Server OAuth

Funktioner

  • Deltagersynkronisering - Opret automatisk Brevo-kontakter fra mødedeltagere
  • Opfangning af webinardeltagere - Synkronisér webinar-registranter og deltagere
  • Triggere på mødehændelser - Aktivér automatiseringer ved mødestart, -slut og optagelseshændelser
  • Engagementtracking - Spor deltagelsesvarighed og deltagelsesmetrikker
  • Webinaropfølgning - Udløs målrettede e-mailsekvenser baseret på webinardeltagelse
  • Optagelsesnotifikationer - Send optagelseslinks via Brevo-e-mailkampagner

Forudsætninger

Før du begynder, skal du sikre dig, at du har:

  1. En Zoom-konto (Pro-plan eller højere)
  2. En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
  3. En Brevo-konto med API-adgang
  4. En Tajo-konto med konnektorrettigheder

Autentifikation

Server-to-Server OAuth (anbefalet)

Terminal window
# Create a Server-to-Server OAuth app at marketplace.zoom.us
export ZOOM_ACCOUNT_ID=your_account_id
export ZOOM_CLIENT_ID=your_client_id
export ZOOM_CLIENT_SECRET=your_client_secret
// Get access token via Server-to-Server OAuth
const tokenResponse = await fetch('https://zoom.us/oauth/token', {
method: 'POST',
headers: {
'Authorization': `Basic ${Buffer.from(
`${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}`
).toString('base64')}`,
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'account_credentials',
account_id: process.env.ZOOM_ACCOUNT_ID
})
});
const { access_token } = await tokenResponse.json();

OAuth 2.0 (brugerniveau)

// Authorization URL for user-level OAuth
const authUrl = 'https://zoom.us/oauth/authorize?' +
new URLSearchParams({
client_id: process.env.ZOOM_CLIENT_ID,
redirect_uri: 'https://your-app.com/callback',
response_type: 'code'
});
// Exchange code for tokens
const tokenResponse = await fetch('https://zoom.us/oauth/token', {
method: 'POST',
headers: {
'Authorization': `Basic ${Buffer.from(
`${process.env.ZOOM_CLIENT_ID}:${process.env.ZOOM_CLIENT_SECRET}`
).toString('base64')}`,
'Content-Type': 'application/x-www-form-urlencoded'
},
body: new URLSearchParams({
grant_type: 'authorization_code',
code: authorizationCode,
redirect_uri: 'https://your-app.com/callback'
})
});

Konfiguration

Grundlæggende opsætning

connectors:
zoom:
enabled: true
account_id: "${ZOOM_ACCOUNT_ID}"
client_id: "${ZOOM_CLIENT_ID}"
client_secret: "${ZOOM_CLIENT_SECRET}"
sync:
participants: true
webinars: true
recordings: true
webhook:
secret_token: "${ZOOM_WEBHOOK_SECRET}"
verification_token: "${ZOOM_VERIFICATION_TOKEN}"
lists:
meeting_participants: 15
webinar_attendees: 16
webinar_registrants: 17

Feltmapping

field_mapping:
email: email
name: FIRSTNAME
join_time: MEETING_JOIN_DATE
duration: MEETING_DURATION
webinar_title: WEBINAR_NAME
attendance_status: ATTENDANCE_STATUS
registration_source: UTM_SOURCE

API-endpoints

EndpointMetodeBeskrivelse
https://api.zoom.us/v2/usersGETVis brugere
https://api.zoom.us/v2/users/{userId}/meetingsGETVis møder
https://api.zoom.us/v2/meetings/{meetingId}GETHent mødedetaljer
https://api.zoom.us/v2/past_meetings/{meetingId}/participantsGETVis tidligere mødedeltagere
https://api.zoom.us/v2/users/{userId}/webinarsGETVis webinarer
https://api.zoom.us/v2/webinars/{webinarId}/registrantsGETVis webinar-registranter
https://api.zoom.us/v2/webinars/{webinarId}/participantsGETVis webinardeltagere
https://api.zoom.us/v2/meetings/{meetingId}/recordingsGETHent mødeoptagelser
https://api.zoom.us/v2/webhooksPOSTAbonnér på webhooks

Kodeeksempler

Initialisér konnektor

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('zoom', {
accountId: process.env.ZOOM_ACCOUNT_ID,
clientId: process.env.ZOOM_CLIENT_ID,
clientSecret: process.env.ZOOM_CLIENT_SECRET
});

Synkronisér mødedeltagere

// Retrieve past meeting participants
const response = await fetch(
`https://api.zoom.us/v2/past_meetings/${meetingId}/participants`,
{
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
}
);
const { participants } = await response.json();
for (const participant of participants) {
if (participant.user_email) {
await tajo.contacts.sync({
email: participant.user_email,
attributes: {
FIRSTNAME: participant.name,
MEETING_DURATION: participant.duration,
MEETING_JOIN_DATE: participant.join_time,
ATTENDANCE_STATUS: 'attended'
},
listIds: [15]
});
}
}

Synkronisér webinardeltagere

// Get webinar attendees and sync to Brevo
const attendeesResponse = await fetch(
`https://api.zoom.us/v2/past_webinars/${webinarId}/participants`,
{
headers: { 'Authorization': `Bearer ${accessToken}` }
}
);
const { participants: attendees } = await attendeesResponse.json();
for (const attendee of attendees) {
await tajo.contacts.sync({
email: attendee.user_email,
attributes: {
FIRSTNAME: attendee.name,
WEBINAR_NAME: webinarTitle,
ATTENDANCE_STATUS: 'attended',
MEETING_DURATION: attendee.duration
},
listIds: [16]
});
}

Håndtér Zoom-webhooks

app.post('/webhooks/zoom', async (req, res) => {
// Handle Zoom URL validation challenge
if (req.body.event === 'endpoint.url_validation') {
const hashForValidation = crypto
.createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET)
.update(req.body.payload.plainToken)
.digest('hex');
return res.json({
plainToken: req.body.payload.plainToken,
encryptedToken: hashForValidation
});
}
// Verify webhook signature
const message = `v0:${req.headers['x-zm-request-timestamp']}:${JSON.stringify(req.body)}`;
const hash = crypto
.createHmac('sha256', process.env.ZOOM_WEBHOOK_SECRET)
.update(message)
.digest('hex');
const signature = `v0=${hash}`;
if (req.headers['x-zm-signature'] !== signature) {
return res.status(401).send('Unauthorized');
}
const { event, payload } = req.body;
await tajo.connectors.handleWebhook('zoom', {
topic: event,
payload: payload
});
res.status(200).send('OK');
});

Ratebegrænsninger

KategoriGrænseNoter
Lette API-kald30 req/sekGET bruger, mødeinfo
Mellemtunge API-kald20 req/sekVis deltagere, webinarer
Tunge API-kald10 req/sekRapporter, optagelser
Daglig grænse5.000+Afhænger af plan

Rate limit-headere

Zoom returnerer headerne X-RateLimit-Limit, X-RateLimit-Remaining og Retry-After. Implementér backoff-logik baseret på disse headere for at undgå 429-fejl.

Fejlfinding

ProblemÅrsagLøsning
401 UnauthorizedToken udløbetOpdatér Server-to-Server OAuth-token
Manglende deltagereMøde ikke afsluttetVent, til mødet slutter, for fulde data
Webhook-validering fejlerForkert secretVerificér webhook-secret i Zoom Marketplace
Ingen e-maildataGæstedeltagereAktivér registrering for at opfange e-mails
Ratebegrænsning 429For mange forespørgslerImplementér eksponentiel backoff

Fejlfindingstilstand

connectors:
zoom:
debug: true
log_level: verbose
log_webhooks: true

Best practices

  1. Brug Server-to-Server OAuth - Enklere autentifikation uden brugerinteraktion
  2. Aktivér webinar-registrering - Påkrævet for at opfange deltageres e-mailadresser
  3. Behandl efter mødeslut - Deltagerdata er først komplette, når møder slutter
  4. Segmentér efter hændelsestype - Tildel forskellige Brevo-lister til møder vs. webinarer
  5. Spor engagementmetrikker - Brug varighed og deltagelsestid til leadscoring
  6. Send opfølgning på optagelser - Automatisér levering af optagelseslinks via Brevo

Sikkerhed

  • OAuth 2.0 - Server-to-Server eller OAuth-autentifikation på brugerniveau
  • Webhook-verifikation - HMAC-SHA256-signaturvalidering
  • URL-validering - Challenge-response-verifikation for webhook-endpoints
  • Scoped rettigheder - Anmod om minimumskrævede OAuth-scopes
  • Tokenrotation - Server-to-Server-tokens udløber automatisk (1 time)
  • Krypteret transport - TLS 1.2+ til al API-kommunikation

Relaterede ressourcer

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AI-assistent

Hej! Spørg mig om dokumentationen.