Zoom-kobling
Koblingsstatus: Planlagt Ikke bygget ennå. Tajo kjører ikke denne koblingen i dag.
Illustrasjon · eksempeldata
Eksempel på synkronisering
Kilde
Zoom
Koblingsstatus: Planlagt
Mål
Det andre verktøyet ditt
Koblingsstatus: Eget verktøy
Feltkobling
| Kildefelt | Målfelt | Eksempelverdi |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Utkast
- Se gjennom én oppføring
- Godkjenn denne versjonen
Status gjelder hver enkelt kobling og garanterer ikke at denne synkroniseringen er klar. Feltene er illustrative. Kontroller faktisk skjema og tillatelser før synkroniseringen kjører.
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
| Egenskap | Verdi |
|---|---|
| Plattform | Zoom |
| Kategori | Videokonferanse (Custom) |
| Oppsettskompleksitet | Moderat |
| Offisiell integrasjon | Nei |
| Synkroniserte data | Deltakere, hendelser, webinarer, kontakter |
| Autentiseringsmetode | OAuth 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:
- En Zoom-konto (Pro-plan eller høyere)
- En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
- En Brevo-konto med API-tilgang
- En Tajo-konto med konnektor-rettigheter
Autentisering
Server-to-Server OAuth (anbefalt)
# Opprett en Server-to-Server OAuth-app på marketplace.zoom.usexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Hent tilgangstoken via Server-to-Server OAuthconst 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 tokensconst 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: 17Feltmapping
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_SOURCEAPI-endepunkter
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
https://api.zoom.us/v2/users | GET | List brukere |
https://api.zoom.us/v2/users/{userId}/meetings | GET | List møter |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Hent møtedetaljer |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | List deltakere i tidligere møter |
https://api.zoom.us/v2/users/{userId}/webinars | GET | List webinarer |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | List webinarregistranter |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | List webinardeltakere |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Hent møteopptak |
https://api.zoom.us/v2/webhooks | POST | Abonner 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øterconst 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 Brevoconst 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
| Kategori | Grense | Merknader |
|---|---|---|
| Lette API-kall | 30 forespørsler/sek | GET bruker, møteinfo |
| Middels API-kall | 20 forespørsler/sek | List deltakere, webinarer |
| Tunge API-kall | 10 forespørsler/sek | Rapporter, opptak |
| Daglig grense | 5 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 | Årsak | Løsning |
|---|---|---|
| 401 Unauthorized | Token utløpt | Oppdater Server-to-Server OAuth-token |
| Manglende deltakere | Møte ikke avsluttet | Vent til møtet er ferdig for fullstendige data |
| Webhook-validering mislykkes | Feil hemmelighet | Verifiser webhook-hemmelighet i Zoom Marketplace |
| Ingen e-postdata | Gjestedeltakere | Aktiver registrering for å fange e-postadresser |
| Ratebegrensning 429 | For mange forespørsler | Implementer eksponentiell backoff |
Feilsøkingsmodus
connectors: zoom: debug: true log_level: verbose log_webhooks: trueBeste praksis
- Bruk Server-to-Server OAuth - Enklere autentisering uten brukerinteraksjon
- Aktiver webinarregistrering - Nødvendig for å fange deltakeres e-postadresser
- Behandle etter at møtet er avsluttet - Deltakerdata er kun fullstendige etter møteslutt
- Segmenter etter hendelsestype - Tildel ulike Brevo-lister for møter vs. webinarer
- Spor engasjementsmålinger - Bruk varighet og pålogging for lead scoring
- 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