Zoom Bağlayıcısı
Toplantı katılımcılarını ve web semineri katılımcılarını otomatik olarak kişi olarak senkronize etmek, toplantı sonrası takip dizilerini tetiklemek ve pazarlama otomasyonlarınız için etkileşim metriklerini izlemek üzere Zoom’u Tajo üzerinden Brevo’ya bağlayın.
Genel Bakış
| Özellik | Değer |
|---|---|
| Platform | Zoom |
| Kategori | Video Konferans (Özel) |
| Kurulum Karmaşıklığı | Orta |
| Resmi Entegrasyon | Hayır |
| Senkronize Edilen Veri | Katılımcılar, Olaylar, Web Seminerleri, Kişiler |
| Kimlik Doğrulama Yöntemi | OAuth 2.0 / Sunucudan Sunucuya OAuth |
Özellikler
- Katılımcı senkronizasyonu - Toplantı katılımcılarından otomatik olarak Brevo kişileri oluşturun
- Web semineri katılımcı yakalama - Web semineri kayıtlı kullanıcılarını ve katılımcılarını senkronize edin
- Toplantı olay tetikleyicileri - Toplantı başlatma, sona erme ve kayıt olaylarında otomasyonları başlatın
- Etkileşim takibi - Katılım süresi ve katılım metriklerini izleyin
- Web semineri takibi - Web semineri katılımına göre hedefli e-posta dizilerini tetikleyin
- Kayıt bildirimleri - Brevo e-posta kampanyaları aracılığıyla kayıt bağlantılarını gönderin
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
- Bir Zoom hesabı (Pro plan veya üzeri)
- Zoom App Marketplace aracılığıyla bir Zoom Sunucudan Sunucuya OAuth uygulaması veya OAuth uygulaması
- API erişimi olan bir Brevo hesabı
- Bağlayıcı izinlerine sahip bir Tajo hesabı
Kimlik Doğrulama
Sunucudan Sunucuya OAuth (Önerilen)
# marketplace.zoom.us adresinde bir Sunucudan Sunucuya OAuth uygulaması oluşturunexport ZOOM_ACCOUNT_ID=your_account_idexport ZOOM_CLIENT_ID=your_client_idexport ZOOM_CLIENT_SECRET=your_client_secret// Sunucudan Sunucuya OAuth aracılığıyla erişim belirteci alconst 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 (Kullanıcı Düzeyi)
// Kullanıcı düzeyi OAuth için yetkilendirme URL'siconst 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' });
// Kodu belirteçlere dönüştürconst 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' })});Yapılandırma
Temel Kurulum
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: 17Alan Eşleştirme
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 Uç Noktaları
| Uç Nokta | Yöntem | Açıklama |
|---|---|---|
https://api.zoom.us/v2/users | GET | Kullanıcıları listele |
https://api.zoom.us/v2/users/{userId}/meetings | GET | Toplantıları listele |
https://api.zoom.us/v2/meetings/{meetingId} | GET | Toplantı ayrıntılarını al |
https://api.zoom.us/v2/past_meetings/{meetingId}/participants | GET | Geçmiş toplantı katılımcılarını listele |
https://api.zoom.us/v2/users/{userId}/webinars | GET | Web seminerlerini listele |
https://api.zoom.us/v2/webinars/{webinarId}/registrants | GET | Web semineri kayıtlı kullanıcılarını listele |
https://api.zoom.us/v2/webinars/{webinarId}/participants | GET | Web semineri katılımcılarını listele |
https://api.zoom.us/v2/meetings/{meetingId}/recordings | GET | Toplantı kayıtlarını al |
https://api.zoom.us/v2/webhooks | POST | Webhook’lara abone ol |
Kod Örnekleri
Bağlayıcıyı Başlatma
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});Toplantı Katılımcılarını Senkronize Etme
// Geçmiş toplantı katılımcılarını alconst 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] }); }}Web Semineri Katılımcılarını Senkronize Etme
// Web semineri katılımcılarını al ve Brevo'ya senkronize etconst 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] });}Zoom Webhook’larını İşleme
app.post('/webhooks/zoom', async (req, res) => { // Zoom URL doğrulama zorluğunu işle 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 }); }
// Webhook imzasını doğrula 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');});Hız Sınırları
| Kategori | Sınır | Notlar |
|---|---|---|
| Hafif API çağrıları | saniyede 30 istek | GET kullanıcı, toplantı bilgisi |
| Orta API çağrıları | saniyede 20 istek | Katılımcıları, web seminerlerini listele |
| Ağır API çağrıları | saniyede 10 istek | Raporlar, kayıtlar |
| Günlük sınır | 5.000+ | Plan düzeyine bağlıdır |
Hız Sınırı Başlıkları
Zoom X-RateLimit-Limit, X-RateLimit-Remaining ve Retry-After başlıklarını döndürür. 429 hatalarını önlemek için bu başlıklara dayalı geri çekilme mantığı uygulayın.
Sorun Giderme
| Sorun | Neden | Çözüm |
|---|---|---|
| 401 Unauthorized | Belirteç süresi dolmuş | Sunucudan Sunucuya OAuth belirtecini yenileyin |
| Eksik katılımcılar | Toplantı sona ermedi | Tam veri için toplantının sona ermesini bekleyin |
| Webhook doğrulaması başarısız | Yanlış gizli anahtar | Zoom Marketplace’te webhook gizli anahtarını doğrulayın |
| E-posta verisi yok | Misafir katılımcılar | E-postaları yakalamak için kaydı etkinleştirin |
| Hız sınırı 429 | Çok fazla istek | Üstel geri çekilme uygulayın |
Hata Ayıklama Modu
connectors: zoom: debug: true log_level: verbose log_webhooks: trueEn İyi Uygulamalar
- Sunucudan Sunucuya OAuth kullanın - Kullanıcı etkileşimi olmadan daha basit kimlik doğrulama
- Web semineri kaydını etkinleştirin - Katılımcı e-posta adreslerini yakalamak için gereklidir
- Toplantı bittikten sonra işleyin - Katılımcı verileri yalnızca toplantılar sona erdikten sonra tamamdır
- Olay türüne göre segmentlere ayırın - Toplantılar ile web seminerleri için farklı Brevo listeleri atayın
- Etkileşim metriklerini izleyin - Müşteri adayı puanlaması için süre ve katılma zamanını kullanın
- Kayıt takipleri gönderin - Brevo aracılığıyla kayıt bağlantısı teslimatını otomatikleştirin
Güvenlik
- OAuth 2.0 - Sunucudan Sunucuya veya kullanıcı düzeyi OAuth kimlik doğrulaması
- Webhook doğrulaması - HMAC-SHA256 imza doğrulama
- URL doğrulaması - Webhook uç noktaları için soru-yanıt doğrulaması
- Kapsamlı izinler - Minimum gerekli OAuth kapsamlarını talep edin
- Belirteç rotasyonu - Sunucudan Sunucuya belirteçleri otomatik olarak süresi dolar (1 saat)
- Şifreli taşıma - Tüm API iletişimleri için TLS 1.2+