Calendly Bağlayıcısı

Calendly’yi Tajo üzerinden Brevo’ya bağlayarak toplantı davetlilerini otomatik olarak kişi olarak senkronize edin, rezervasyon olaylarına göre e-posta dizilerini tetikleyin ve satış ile onboarding iş akışlarınızı kolaylaştırın.

Genel Bakış

ÖzellikDeğer
PlatformCalendly
KategoriPlanlama (Özel)
Kurulum KarmaşıklığıKolay
Resmi EntegrasyonHayır
Senkronize Edilen VeriOlaylar, Kişiler, Rezervasyonlar, İptaller
Kimlik Doğrulama YöntemiOAuth 2.0 / Kişisel Erişim Belirteci

Özellikler

  • Davetli senkronizasyonu - Toplantı davetlilerinden otomatik olarak Brevo kişileri oluşturun
  • Rezervasyon tetikleyicileri - Toplantılar rezerve edildiğinde Brevo otomasyonlarını tetikleyin
  • İptal yönetimi - İptallerde yeniden etkileşim akışlarını tetikleyin
  • No-show tespiti - Davetliler toplantıları kaçırdığında kişi durumunu güncelleyin
  • Olay türü eşlemesi - Farklı Calendly olay türlerini Brevo listelerine eşleyin
  • Planlama API’si - Yönlendirme olmadan doğrudan uygulamanıza planlama oluşturun

Ön Koşullar

Başlamadan önce sahip olmanız gerekenler:

  1. Bir Calendly hesabı (API erişimi için Professional plan veya üzeri)
  2. Calendly Integrations adresinden bir Kişisel Erişim Belirteci
  3. API erişimi olan bir Brevo hesabı
  4. Bağlayıcı izinleri olan bir Tajo hesabı

Kimlik Doğrulama

Kişisel Erişim Belirteci

Terminal window
# Generate at https://calendly.com/integrations/api_webhooks
export CALENDLY_ACCESS_TOKEN=your_personal_access_token
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key

OAuth 2.0

// OAuth 2.0 Authorization Code Flow
const authUrl = 'https://auth.calendly.com/oauth/authorize?' +
new URLSearchParams({
client_id: process.env.CALENDLY_CLIENT_ID,
redirect_uri: 'https://your-app.com/callback',
response_type: 'code'
});
// Exchange code for token
const tokenResponse = await fetch('https://auth.calendly.com/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
code: authorizationCode,
client_id: process.env.CALENDLY_CLIENT_ID,
client_secret: process.env.CALENDLY_CLIENT_SECRET,
redirect_uri: 'https://your-app.com/callback'
})
});

Yapılandırma

Temel Kurulum

connectors:
calendly:
enabled: true
access_token: "${CALENDLY_ACCESS_TOKEN}"
sync:
contacts: true
events: true
cancellations: true
event_mapping:
discovery_call:
list_id: 10
event_type_uri: "https://api.calendly.com/event_types/abc123"
demo:
list_id: 11
event_type_uri: "https://api.calendly.com/event_types/xyz789"
webhook:
signing_key: "${CALENDLY_WEBHOOK_SIGNING_KEY}"

Alan Eşleme

field_mapping:
email: email
name: FIRSTNAME
questions_and_answers:
company: COMPANY
role: JOB_TITLE
phone: SMS
event_type_name: CALENDLY_EVENT_TYPE
scheduled_at: MEETING_DATE
status: BOOKING_STATUS

API Uç Noktaları

Uç NoktaYöntemAçıklama
https://api.calendly.com/users/meGETMevcut kullanıcıyı getir
https://api.calendly.com/event_typesGETOlay türlerini listele
https://api.calendly.com/scheduled_eventsGETPlanlanmış olayları listele
https://api.calendly.com/scheduled_events/{uuid}GETBir planlanmış olayı getir
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETDavetlileri listele
https://api.calendly.com/scheduling_linksPOSTPlanlama bağlantısı oluştur
https://api.calendly.com/webhook_subscriptionsPOSTWebhook oluştur
https://api.calendly.com/webhook_subscriptionsGETWebhook’ları listele
https://api.calendly.com/invitee_no_shows/{uuid}GETNo-show durumunu getir

Kod Örnekleri

Bağlayıcıyı Başlat

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('calendly', {
accessToken: process.env.CALENDLY_ACCESS_TOKEN
});

Planlanmış Olayları Listele

// Retrieve scheduled events
const response = await fetch(
'https://api.calendly.com/scheduled_events?' +
new URLSearchParams({
user: 'https://api.calendly.com/users/YOUR_USER_ID',
min_start_time: '2024-01-01T00:00:00Z',
max_start_time: '2024-12-31T23:59:59Z',
status: 'active',
count: 100
}),
{
headers: {
'Authorization': `Bearer ${process.env.CALENDLY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
}
}
);
const events = await response.json();

Davetlileri Brevo’ya Senkronize Et

// Get invitees for a scheduled event and sync to Brevo
const inviteesResponse = await fetch(
`https://api.calendly.com/scheduled_events/${eventUuid}/invitees`,
{
headers: {
'Authorization': `Bearer ${process.env.CALENDLY_ACCESS_TOKEN}`
}
}
);
const { collection } = await inviteesResponse.json();
for (const invitee of collection) {
await tajo.contacts.sync({
email: invitee.email,
attributes: {
FIRSTNAME: invitee.name,
CALENDLY_EVENT_TYPE: invitee.event,
MEETING_DATE: invitee.created_at,
BOOKING_STATUS: invitee.status
},
listIds: [10]
});
}

Webhook Abonelikleri Kur

// Subscribe to Calendly events
const webhook = await fetch(
'https://api.calendly.com/webhook_subscriptions',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.CALENDLY_ACCESS_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://api.tajo.io/webhooks/calendly',
events: [
'invitee.created',
'invitee.canceled',
'invitee_no_show.created'
],
organization: 'https://api.calendly.com/organizations/YOUR_ORG_ID',
scope: 'organization',
signing_key: process.env.CALENDLY_WEBHOOK_SIGNING_KEY
})
}
);

Webhook Olaylarını İşle

app.post('/webhooks/calendly', async (req, res) => {
// Verify webhook signature
const signature = req.headers['calendly-webhook-signature'];
const isValid = verifyCalendlySignature(
req.rawBody, signature, process.env.CALENDLY_WEBHOOK_SIGNING_KEY
);
if (!isValid) return res.status(401).send('Unauthorized');
const { event, payload } = req.body;
switch (event) {
case 'invitee.created':
await tajo.contacts.sync({
email: payload.email,
attributes: { BOOKING_STATUS: 'booked' },
listIds: [10]
});
break;
case 'invitee.canceled':
await tajo.contacts.update(payload.email, {
attributes: { BOOKING_STATUS: 'cancelled' }
});
break;
case 'invitee_no_show.created':
await tajo.contacts.update(payload.email, {
attributes: { BOOKING_STATUS: 'no_show' }
});
break;
}
res.status(200).send('OK');
});

Hız Limitleri

KaynakLimitNotlar
API istekleri6.000/dakikaOrganizasyon geneli limit
Webhook abonelikleriOrganizasyon başına 30Tüm olay türlerinde
Planlama bağlantılarıSınırsızDakika başına limit yok

Sayfalama

Calendly API yanıtları imleç tabanlı sayfalama kullanır. Ek sonuçları almak için pagination nesnesinden next_page_token değerini kullanın. Varsayılan sayfa boyutu 20 öğedir, maksimum 100’dür.

Sorun Giderme

SorunNedenÇözüm
Webhook alınmıyorYanlış kapsamWebhook’lar için organization kapsamını kullanın
401 UnauthorizedBelirtecin süresi dolduYeni belirteç oluşturun veya OAuth belirtecini yenileyin
Davetli verileri eksikSorular yapılandırılmamışOlay türüne özel sorular ekleyin
Yinelenen kişilerTekrar giderme mantığı yokUpsert için e-postayı benzersiz tanımlayıcı olarak kullanın
Hız limiti 429Çok fazla istekGeri çekilme ve istek gruplandırma uygulayın

Hata Ayıklama Modu

connectors:
calendly:
debug: true
log_level: verbose
log_webhooks: true

En İyi Uygulamalar

  1. Webhook kullanın - Gerçek zamanlı senkronizasyon için invitee.created ve invitee.canceled olaylarına abone olun
  2. Özel sorular ekleyin - Daha zengin kişi profilleri için şirket, rol ve telefon verisi toplayın
  3. Olay türlerini eşleyin - Calendly olay türü başına farklı Brevo listeleri atayın
  4. No-show’ları yönetin - Aday puanlama ve takip dizilerini ayarlamak için no-show’ları izleyin
  5. Planlama bağlantılarını kullanın - Kişiselleştirilmiş rezervasyon deneyimleri için benzersiz planlama bağlantıları oluşturun
  6. Organizasyon kapsamını ayarlayın - Tüm ekip üyelerinin olaylarını yakalamak için organizasyon düzeyinde webhook kullanın

Güvenlik

  • OAuth 2.0 - Kapsamlandırılmış belirteç tabanlı kimlik doğrulama
  • Webhook imzaları - Gelen webhook’lar için HMAC imza doğrulaması
  • Yalnızca HTTPS - Tüm API uç noktaları TLS şifrelemesi gerektirir
  • Belirteç süresi - OAuth belirteçleri sona erer ve yenileme akışları gerektirir
  • Minimum kapsam - Yalnızca gerekli OAuth kapsamlarını isteyin
  • Güvenli depolama - Belirteçleri ortam değişkenlerinde veya gizli anahtar yöneticilerinde saklayın

İlgili Kaynaklar

Subscribe to updates

developer-docs

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

auto-detect
AI Asistan

Merhaba! Belgeler hakkında her şeyi sorabilirsiniz.