Конектор Calendly

Свържете Calendly с Brevo чрез Tajo, за да синхронизирате автоматично поканените на срещи като контакти, да задействате имейл последователности на базата на събития за резервация и да оптимизирате работните потоци за продажби и onboarding.

Преглед

СвойствоСтойност
ПлатформаCalendly
КатегорияScheduling (Персонализирана)
Сложност на настройкаЛесна
Официална интеграцияНе
Синхронизирани данниСъбития, контакти, резервации, отмяни
Метод на автентикацияOAuth 2.0 / Personal Access Token

Функции

  • Синхронизация на поканени – Автоматично създавайте контакти в Brevo от поканените на срещи
  • Тригери за резервации – Задействайте автоматизации в Brevo, когато се резервират срещи
  • Обработка на отмени – Задействайте потоци за повторна ангажираност при отмени
  • Откриване на no-show – Обновявайте статуса на контакта, когато поканените пропуснат срещи
  • Мапване на типове събития – Мапвайте различни типове събития в Calendly към списъци в Brevo
  • Scheduling API – Вградете планирането директно във вашето приложение без пренасочвания

Предварителни условия

Преди да започнете, уверете се, че имате:

  1. Акаунт в Calendly (Professional план или по-горе за API достъп)
  2. Personal Access Token от Calendly Integrations
  3. Акаунт в Brevo с API достъп
  4. Акаунт в Tajo с разрешения за конектори

Автентикация

Personal Access Token

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

Конфигурация

Основна настройка

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}"

Мапване на полета

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 крайни точки

EndpointMethodОписание
https://api.calendly.com/users/meGETИзвличане на текущия потребител
https://api.calendly.com/event_typesGETСписък на типовете събития
https://api.calendly.com/scheduled_eventsGETСписък на планираните събития
https://api.calendly.com/scheduled_events/{uuid}GETИзвличане на планирано събитие
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETСписък на поканените
https://api.calendly.com/scheduling_linksPOSTСъздаване на връзка за планиране
https://api.calendly.com/webhook_subscriptionsPOSTСъздаване на webhook
https://api.calendly.com/webhook_subscriptionsGETСписък на webhooks
https://api.calendly.com/invitee_no_shows/{uuid}GETИзвличане на no-show статус

Примери за код

Инициализация на конектора

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

Извличане на списък на планирани събития

// 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();

Синхронизация на поканените към Brevo

// 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 абонаменти

// 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 събития

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

Лимити на заявки

РесурсЛимитЗабележки
API заявки6000/минЛимит за цялата организация
Webhook абонаменти30 за организацияМежду всички типове събития
Връзки за планиранеНеограниченоБез лимит на минута

Пагинация

Отговорите на Calendly API използват пагинация на базата на cursor. Използвайте next_page_token от обекта pagination, за да извлечете допълнителни резултати. Размерът на страницата по подразбиране е 20 елемента, с максимум 100.

Отстраняване на проблеми

ПроблемПричинаРешение
Webhook не е полученГрешен scopeИзползвайте organization scope за webhooks
401 UnauthorizedИзтекъл токенГенерирайте нов токен или обновете OAuth токена
Липсващи данни за поканенияВъпросите не са конфигурираниДобавете персонализирани въпроси към типа събитие
Дублирани контактиНяма логика за дедупликацияИзползвайте имейла като уникален идентификатор за upsert
Rate limit 429Твърде много заявкиПриложете отлагане и групиране на заявките

Debug режим

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

Най-добри практики

  1. Използвайте webhooks – Абонирайте се за invitee.created и invitee.canceled за синхронизация в реално време
  2. Добавете персонализирани въпроси – Събирайте данни за компания, роля и телефон за по-богати профили на контактите
  3. Мапвайте типовете събития – Присвоявайте различни списъци в Brevo за всеки тип събитие в Calendly
  4. Обработвайте no-shows – Проследявайте no-shows за корекция на оценката на лийдовете и последователностите за последващи действия
  5. Използвайте scheduling links – Генерирайте уникални връзки за планиране за персонализирани изживявания при резервация
  6. Задайте organization scope – Използвайте webhooks на ниво организация за улавяне на събития от всички членове на екипа

Сигурност

  • OAuth 2.0 – Автентикация на базата на обхватни токени
  • Webhook подписи – HMAC валидация на подписите за входящи webhooks
  • Само HTTPS – Всички API крайни точки изискват TLS криптиране
  • Изтичане на токени – OAuth токените изтичат и изискват refresh потоци
  • Минимални обхвати – Заявявайте само необходимите OAuth обхвати
  • Сигурно съхранение – Съхранявайте токените в environment variables или secret managers

Свързани ресурси

Subscribe to updates

developer-docs

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

auto-detect
AI асистент

Здравейте! Попитайте ме за документацията.