Zoom-koppling
Kopplingens status: Planerad Inte byggd än. Tajo kör inte den här kopplingen i dag.
Illustration · exempeldata
Exempel på synkronisering
Källa
Zoom
Kopplingens status: Planerad
Mål
Ditt andra verktyg
Kopplingens status: Eget verktyg
Fältmappning
| Källfält | Målfält | Exempelvärde |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Utkast
- Granska en post
- Godkänn den här versionen
Status gäller varje enskild koppling och garanterar inte att den här synkroniseringen är klar. Fälten är illustrativa. Kontrollera det faktiska schemat och behörigheterna innan synkronisering körs.
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
| Egenskap | Värde |
|---|---|
| Plattform | Zoom |
| Kategori | Videokonferens (Anpassad) |
| Installationskomplexitet | Medel |
| Officiell integration | Nej |
| Data som synkas | Deltagare, händelser, webbinarium, kontakter |
| Autentiseringsmetod | OAuth 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:
- Ett Zoom-konto (Pro-plan eller högre)
- En Zoom Server-to-Server OAuth-app eller OAuth-app via Zoom App Marketplace
- Ett Brevo-konto med API-åtkomst
- Ett Tajo-konto med kopplingsbehörigheter
Autentisering
Server-to-Server OAuth (rekommenderas)
# Create a Server-to-Server OAuth app at marketplace.zoom.usexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Get access token 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 (användarnivå)
// Authorization URL for user-level OAuthconst 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 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' })});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: 17Fä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_SOURCEAPI-endpoints
| Endpoint | Metod | Beskrivning |
|---|---|---|
https://api.zoom.us/v2/users | GET | Lista användare |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Lista möten |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Hämta mötesdetaljer |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Lista deltagare i tidigare möte |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Lista webbinarium |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Lista webbinariumregistreringar |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Lista webbinariumdeltagare |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Hämta mötesinspelningar |
https://api.zoom.us/v2/webhooks | POST | Prenumerera 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 participantsconst 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 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] });}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
| Kategori | Gräns | Anteckningar |
|---|---|---|
| Lätta API-anrop | 30 förfrågningar/sek | GET-användare, mötesinfo |
| Medel API-anrop | 20 förfrågningar/sek | Lista deltagare, webbinarium |
| Tunga API-anrop | 10 förfrågningar/sek | Rapporter, inspelningar |
| Daglig gräns | 5 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
| Problem | Orsak | Lösning |
|---|---|---|
| 401 Unauthorized | Token utgången | Uppdatera Server-to-Server OAuth-token |
| Saknade deltagare | Mötet ej avslutat | Vänta tills mötet avslutats för komplett data |
| Webhook-validering misslyckas | Fel hemlighet | Verifiera webhook-hemlighet i Zoom Marketplace |
| Inga e-postdata | Gästdeltagare | Aktivera registrering för att fånga e-post |
| Hastighetsbegränsning 429 | För många förfrågningar | Implementera exponentiell backoff |
Felsökningsläge
connectors: zoom: debug: true log_level: verbose log_webhooks: trueBästa praxis
- Använd Server-to-Server OAuth - Enklare autentisering utan användarinteraktion
- Aktivera webbinariumregistrering - Krävs för att fånga deltagares e-postadresser
- Bearbeta efter mötesslut - Deltagardata är endast komplett efter att möten avslutats
- Segmentera efter händelsetyp - Tilldela olika Brevo-listor för möten kontra webbinarium
- Spåra engagemangsmått - Använd varaktighet och deltagandetid för leadpoäng
- 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