Zoom-kobling

Koble Zoom til Brevo gjennom Tajo for å automatisk synkronisere møtedeltakere og webinardeltakere som kontakter, utløse oppfølgingssekvenser etter møter og spore engasjementsmålinger for markedsføringsautomatiseringer.

Oversikt

EgenskapVerdi
PlattformZoom
KategoriVideokonferanse (Custom)
OppsettskompleksitetModerat
Offisiell integrasjonNei
Synkroniserte dataDeltakere, hendelser, webinarer, kontakter
AutentiseringsmetodeOAuth 2.0 / Server-to-Server OAuth

Funksjoner

  • Deltakersynkronisering - Opprett Brevo-kontakter automatisk fra møtedeltakere
  • Fangst av webinardeltakere - Synkroniser webinarregistranter og -deltakere
  • Utløsere for møtehendelser - Kjør automatiseringer på møtets start, slutt og opptakshendelser
  • Engasjementssporing - Spor deltakelsesvarighet og deltakelsesmålinger
  • Oppfølging etter webinar - Utløs målrettede e-postsekvenser basert på webinardeltakelse
  • Opptaksvarsler - Send opptakslenker via Brevo-e-postkampanjer

Forutsetninger

Før du begynner, sørg for at du har:

  1. En Zoom-konto (Pro-plan eller høyere)
  2. En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
  3. En Brevo-konto med API-tilgang
  4. En Tajo-konto med konnektor-rettigheter

Autentisering

Server-to-Server OAuth (anbefalt)

Terminal window
# Opprett en Server-to-Server OAuth-app på marketplace.zoom.us
export ZOOM_ACCOUNT_ID=your_account_id
export ZOOM_CLIENT_ID=your_client_id
export ZOOM_CLIENT_SECRET=your_client_secret
// Hent tilgangstoken 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 (brukernivå)

// Autorisasjons-URL for OAuth på brukernivå
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'
});
// Bytt kode mot 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'
})
});

Konfigurasjon

Grunnleggende oppsett

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-endepunkter

EndepunktMetodeBeskrivelse
https://api.zoom.us/v2/usersGETList brukere
https://api.zoom.us/v2/users/{userId}/meetingsGETList møter
https://api.zoom.us/v2/meetings/{meetingId}GETHent møtedetaljer
https://api.zoom.us/v2/past_meetings/{meetingId}/participantsGETList deltakere i tidligere møter
https://api.zoom.us/v2/users/{userId}/webinarsGETList webinarer
https://api.zoom.us/v2/webinars/{webinarId}/registrantsGETList webinarregistranter
https://api.zoom.us/v2/webinars/{webinarId}/participantsGETList webinardeltakere
https://api.zoom.us/v2/meetings/{meetingId}/recordingsGETHent møteopptak
https://api.zoom.us/v2/webhooksPOSTAbonner på webhooks

Kodeeksempler

Initialiser kobling

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
});

Synkroniser møtedeltakere

// Hent deltakere fra tidligere møter
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]
});
}
}

Synkroniser webinardeltakere

// Hent webinardeltakere og synkroniser til 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åndter Zoom-webhooks

app.post('/webhooks/zoom', async (req, res) => {
// Håndter Zoom URL-valideringsutfordring
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
});
}
// Verifiser webhook-signatur
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');
});

Ratebegrensninger

KategoriGrenseMerknader
Lette API-kall30 forespørsler/sekGET bruker, møteinfo
Middels API-kall20 forespørsler/sekList deltakere, webinarer
Tunge API-kall10 forespørsler/sekRapporter, opptak
Daglig grense5 000+Avhenger av plannivå

Ratebegrensningsheadere

Zoom returnerer X-RateLimit-Limit-, X-RateLimit-Remaining- og Retry-After-headere. Implementer backoff-logikk basert på disse headerne for å unngå 429-feil.

Feilsøking

ProblemÅrsakLøsning
401 UnauthorizedToken utløptOppdater Server-to-Server OAuth-token
Manglende deltakereMøte ikke avsluttetVent til møtet er ferdig for fullstendige data
Webhook-validering mislykkesFeil hemmelighetVerifiser webhook-hemmelighet i Zoom Marketplace
Ingen e-postdataGjestedeltakereAktiver registrering for å fange e-postadresser
Ratebegrensning 429For mange forespørslerImplementer eksponentiell backoff

Feilsøkingsmodus

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

Beste praksis

  1. Bruk Server-to-Server OAuth - Enklere autentisering uten brukerinteraksjon
  2. Aktiver webinarregistrering - Nødvendig for å fange deltakeres e-postadresser
  3. Behandle etter at møtet er avsluttet - Deltakerdata er kun fullstendige etter møteslutt
  4. Segmenter etter hendelsestype - Tildel ulike Brevo-lister for møter vs. webinarer
  5. Spor engasjementsmålinger - Bruk varighet og pålogging for lead scoring
  6. Send oppfølging med opptak - Automatiser levering av opptakslenker via Brevo

Sikkerhet

  • OAuth 2.0 - Server-to-Server eller OAuth-autentisering på brukernivå
  • Webhook-verifisering - HMAC-SHA256-signaturvalidering
  • URL-validering - Utfordring-respons-verifisering for webhook-endepunkter
  • Avgrensede rettigheter - Be om minimum nødvendige OAuth-scopes
  • Tokenrotasjon - Server-to-Server-tokens utløper automatisk (1 time)
  • Kryptert transport - TLS 1.2+ for all API-kommunikasjon

Relaterte ressurser

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hei! Spør meg om dokumentasjonen.