Ajukan akses awal

Masukkan nama depan serta email atau nomor telepon Anda. Kami akan menghubungi Anda dengan detail akses Tajo.

Konektor Zoom

Hubungkan Zoom ke Brevo melalui Tajo untuk menyinkronkan peserta meeting dan peserta webinar sebagai kontak secara otomatis, memicu rangkaian tindak lanjut pasca-meeting, dan melacak metrik engagement untuk otomatisasi pemasaran Anda.

Ikhtisar

PropertiNilai
PlatformZoom
KategoriKonferensi Video (Custom)
Kompleksitas setupSedang
Integrasi resmiTidak
Data yang disinkronkanPeserta, event, webinar, kontak
Metode autentikasiOAuth 2.0 / Server-to-Server OAuth

Fitur

  • Sinkronisasi peserta - Buat kontak Brevo secara otomatis dari peserta meeting
  • Penangkapan peserta webinar - Sinkronkan pendaftar dan peserta webinar
  • Pemicu event meeting - Jalankan otomatisasi pada event mulai, selesai, dan perekaman meeting
  • Pelacakan engagement - Lacak durasi kehadiran dan metrik partisipasi
  • Tindak lanjut webinar - Picu rangkaian email tertarget berdasarkan kehadiran webinar
  • Notifikasi rekaman - Kirim tautan rekaman melalui kampanye email Brevo

Prasyarat

Sebelum memulai, pastikan Anda memiliki:

  1. Akun Zoom (paket Pro atau lebih tinggi)
  2. Aplikasi Server-to-Server OAuth atau aplikasi OAuth Zoom via Zoom App Marketplace
  3. Akun Brevo dengan akses API
  4. Akun Tajo dengan izin konektor

Autentikasi

Server-to-Server OAuth (direkomendasikan)

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 (level pengguna)

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

Konfigurasi

Setup dasar

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

Pemetaan field

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

Endpoint API

EndpointMetodeDeskripsi
https://api.zoom.us/v2/usersGETMenampilkan pengguna
https://api.zoom.us/v2/users/{userId}/meetingsGETMenampilkan meeting
https://api.zoom.us/v2/meetings/{meetingId}GETMengambil detail meeting
https://api.zoom.us/v2/past_meetings/{meetingId}/participantsGETMenampilkan peserta meeting yang lalu
https://api.zoom.us/v2/users/{userId}/webinarsGETMenampilkan webinar
https://api.zoom.us/v2/webinars/{webinarId}/registrantsGETMenampilkan pendaftar webinar
https://api.zoom.us/v2/webinars/{webinarId}/participantsGETMenampilkan peserta webinar
https://api.zoom.us/v2/meetings/{meetingId}/recordingsGETMengambil rekaman meeting
https://api.zoom.us/v2/webhooksPOSTBerlangganan webhook

Contoh kode

Inisialisasi konektor

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

Menyinkronkan peserta meeting

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

Menyinkronkan peserta webinar

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

Menangani webhook Zoom

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

Batas rate

KategoriBatasCatatan
Panggilan API ringan30 permintaan/detikGET user, info meeting
Panggilan API sedang20 permintaan/detikMenampilkan peserta, webinar
Panggilan API berat10 permintaan/detikLaporan, rekaman
Batas harian5.000+Bergantung pada level paket

Header batas rate

Zoom mengembalikan header X-RateLimit-Limit, X-RateLimit-Remaining, dan Retry-After. Terapkan logika backoff berdasarkan header tersebut untuk menghindari error 429.

Pemecahan masalah

MasalahPenyebabSolusi
401 UnauthorizedToken kedaluwarsaSegarkan token Server-to-Server OAuth
Peserta hilangMeeting belum berakhirTunggu hingga meeting berakhir agar data lengkap
Validasi webhook gagalSecret salahPeriksa secret webhook di Zoom Marketplace
Tidak ada data emailPeserta tamuAktifkan registrasi untuk menangkap alamat email
Batas rate 429Terlalu banyak permintaanTerapkan exponential backoff

Mode debug

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

Praktik terbaik

  1. Gunakan Server-to-Server OAuth - Autentikasi lebih sederhana tanpa interaksi pengguna
  2. Aktifkan registrasi webinar - Diperlukan untuk menangkap alamat email peserta
  3. Proses setelah meeting berakhir - Data peserta baru lengkap setelah meeting selesai
  4. Segmentasikan berdasarkan tipe event - Tetapkan list Brevo berbeda untuk meeting dan webinar
  5. Lacak metrik engagement - Gunakan durasi dan waktu bergabung untuk lead scoring
  6. Kirim tindak lanjut rekaman - Otomatiskan pengiriman tautan rekaman melalui Brevo

Keamanan

  • OAuth 2.0 - Autentikasi OAuth Server-to-Server atau level pengguna
  • Verifikasi webhook - Validasi tanda tangan HMAC-SHA256
  • Validasi URL - Verifikasi challenge-response untuk endpoint webhook
  • Izin tersegmentasi - Minta scope OAuth seminimal yang diperlukan
  • Rotasi token - Token Server-to-Server kedaluwarsa otomatis (1 jam)
  • Transport terenkripsi - TLS 1.2+ untuk seluruh komunikasi API

Sumber daya terkait

Ajukan akses awal

Masukkan nama depan serta email atau nomor telepon Anda. Kami akan menghubungi Anda dengan detail akses Tajo.

deteksi otomatis
Asisten AI

Halo! Tanyakan apa saja tentang dokumentasi.