Zoom-koppling

Anslut Zoom till Brevo via Tajo för att automatiskt synka mötesdeltagare och webbinariumdeltagare som kontakter, utlösa uppföljningssekvenser efter möten och spåra engagemangsmått för dina marknadsautomationer.

Översikt

EgenskapVärde
PlattformZoom
KategoriVideokonferens (Anpassad)
InstallationskomplexitetMedel
Officiell integrationNej
Data som synkasDeltagare, händelser, webbinarium, kontakter
AutentiseringsmetodOAuth 2.0 / Server-to-Server OAuth

Funktioner

  • Synkronisering av deltagare - Skapa Brevo-kontakter automatiskt från mötesdeltagare
  • Fångst av webbinariumdeltagare - Synka webbinariumregistreringar och deltagare
  • Mötesutlösare - Avfyra automationer vid mötesstart, slut och inspelningshändelser
  • Engagemangsspårning - Spåra närvarotid och deltagarmått
  • Webbinariumuppföljning - Utlös riktade e-postsekvenser baserat på webbinariumdeltagande
  • Inspelningsnotifieringar - Skicka inspelningslänkar via Brevo-e-postkampanjer

Förutsättningar

Innan du börjar, se till att du har:

  1. Ett Zoom-konto (Pro-plan eller högre)
  2. En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
  3. Ett Brevo-konto med API-åtkomst
  4. Ett Tajo-konto med kopplingsbehörigheter

Autentisering

Server-to-Server OAuth (rekommenderas)

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 (användarnivå)

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

Grundinställning

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

Fältmappning

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

EndpointMetodBeskrivning
https://api.zoom.us/v2/usersGETLista användare
https://api.zoom.us/v2/users/{userId}/meetingsGETLista möten
https://api.zoom.us/v2/meetings/{meetingId}GETHämta mötesdetaljer
https://api.zoom.us/v2/past_meetings/{meetingId}/participantsGETLista deltagare i tidigare möte
https://api.zoom.us/v2/users/{userId}/webinarsGETLista webbinarium
https://api.zoom.us/v2/webinars/{webinarId}/registrantsGETLista webbinariumregistreringar
https://api.zoom.us/v2/webinars/{webinarId}/participantsGETLista webbinariumdeltagare
https://api.zoom.us/v2/meetings/{meetingId}/recordingsGETHämta mötesinspelningar
https://api.zoom.us/v2/webhooksPOSTPrenumerera på webhooks

Kodexempel

Initiera kopplingen

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

Synka mötesdeltagare

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

Synka webbinariumdeltagare

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

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

Hastighetsbegränsningar

KategoriGränsAnteckningar
Lätta API-anrop30 förfrågningar/sekGET-användare, mötesinfo
Medel API-anrop20 förfrågningar/sekLista deltagare, webbinarium
Tunga API-anrop10 förfrågningar/sekRapporter, inspelningar
Daglig gräns5 000+Beror på plan-nivå

Headrar för hastighetsbegränsning

Zoom returnerar headrar X-RateLimit-Limit, X-RateLimit-Remaining och Retry-After. Implementera backoff-logik baserat på dessa headrar för att undvika 429-fel.

Felsökning

ProblemOrsakLösning
401 UnauthorizedToken utgångenUppdatera Server-to-Server OAuth-token
Saknade deltagareMötet ej avslutatVänta tills mötet avslutats för komplett data
Webhook-validering misslyckasFel hemlighetVerifiera webhook-hemlighet i Zoom Marketplace
Inga e-postdataGästdeltagareAktivera registrering för att fånga e-post
Hastighetsbegränsning 429För många förfrågningarImplementera exponentiell backoff

Felsökningsläge

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

Bästa praxis

  1. Använd Server-to-Server OAuth - Enklare autentisering utan användarinteraktion
  2. Aktivera webbinariumregistrering - Krävs för att fånga deltagares e-postadresser
  3. Bearbeta efter mötesslut - Deltagardata är endast komplett efter att möten avslutats
  4. Segmentera efter händelsetyp - Tilldela olika Brevo-listor för möten kontra webbinarium
  5. Spåra engagemangsmått - Använd varaktighet och deltagandetid för leadpoäng
  6. Skicka inspelningsuppföljningar - Automatisera leverans av inspelningslänk via Brevo

Säkerhet

  • OAuth 2.0 - Server-to-Server eller OAuth-autentisering på användarnivå
  • Webhook-verifiering - HMAC-SHA256-signaturvalidering
  • URL-validering - Challenge-response-verifiering för webhook-endpoints
  • Scopade behörigheter - Begär minsta nödvändiga OAuth-scopes
  • Tokenrotation - Server-to-Server-tokens går automatiskt ut (1 timme)
  • Krypterad transport - TLS 1.2+ för all API-kommunikation

Relaterade resurser

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hej! Fråga mig om dokumentationen.