Konektor Calendly

Połącz Calendly z Brevo przez Tajo, aby automatycznie synchronizować zaproszonych na spotkania jako kontakty, wyzwalać sekwencje e-mailowe na podstawie zdarzeń rezerwacji i usprawniać przepływy sprzedaży i onboardingu.

Przegląd

WłaściwośćWartość
PlatformaCalendly
KategoriaPlanowanie (Niestandardowa)
Poziom konfiguracjiŁatwy
Integracja oficjalnaNie
Synchronizowane daneZdarzenia, Kontakty, Rezerwacje, Anulowania
Metoda uwierzytelnianiaOAuth 2.0 / Personal Access Token

Funkcje

  • Synchronizacja zaproszonych - Automatycznie twórz kontakty Brevo z zaproszonych na spotkania
  • Wyzwalacze rezerwacji - Uruchamiaj automatyzacje Brevo, gdy spotkania są rezerwowane
  • Obsługa anulowań - Wyzwalaj przepływy ponownego zaangażowania przy anulowaniach
  • Wykrywanie nieobecności - Aktualizuj status kontaktu, gdy zaproszeni nie pojawiają się na spotkaniach
  • Mapowanie typów zdarzeń - Mapuj różne typy zdarzeń Calendly na listy Brevo
  • Scheduling API - Wbuduj planowanie bezpośrednio w swoją aplikację bez przekierowań

Wymagania wstępne

Zanim zaczniesz, upewnij się, że masz:

  1. Konto Calendly (plan Professional lub wyższy dla dostępu do API)
  2. Personal Access Token z Calendly Integrations
  3. Konto Brevo z dostępem do API
  4. Konto Tajo z uprawnieniami konektora

Uwierzytelnianie

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

Konfiguracja

Podstawowa konfiguracja

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

Mapowanie pól

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

Endpointy API

EndpointMetodaOpis
https://api.calendly.com/users/meGETPobierz bieżącego użytkownika
https://api.calendly.com/event_typesGETLista typów zdarzeń
https://api.calendly.com/scheduled_eventsGETLista zaplanowanych zdarzeń
https://api.calendly.com/scheduled_events/{uuid}GETPobierz zaplanowane zdarzenie
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETLista zaproszonych
https://api.calendly.com/scheduling_linksPOSTUtwórz link do planowania
https://api.calendly.com/webhook_subscriptionsPOSTUtwórz webhook
https://api.calendly.com/webhook_subscriptionsGETLista webhooków
https://api.calendly.com/invitee_no_shows/{uuid}GETPobierz status nieobecności

Przykłady kodu

Inicjalizacja konektora

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

Lista zaplanowanych zdarzeń

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

Synchronizuj zaproszonych z 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]
});
}

Skonfiguruj subskrypcje webhooków

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

Obsługa zdarzeń 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');
});

Limity API

ZasóbLimitUwagi
Żądania API6 000/minLimit całej organizacji
Subskrypcje webhook30 na organizacjęDla wszystkich typów zdarzeń
Linki do planowaniaNieograniczoneBrak limitu na minutę

Paginacja

Odpowiedzi Calendly API używają paginacji opartej na kursorze. Używaj next_page_token z obiektu pagination, aby pobrać kolejne wyniki. Domyślny rozmiar strony to 20 elementów, z maksimum 100.

Rozwiązywanie problemów

ProblemPrzyczynaRozwiązanie
Webhook nie odebranyZły zakresUżywaj zakresu organization dla webhooków
401 UnauthorizedToken wygasłWygeneruj nowy token lub odśwież token OAuth
Brakujące dane zaproszonychPytania nie skonfigurowaneDodaj niestandardowe pytania do typu zdarzenia
Duplikaty kontaktówBrak logiki deduplikacjiUżywaj e-maila jako unikalnego identyfikatora dla upsert
Limit 429Za dużo żądańWdrożyj wycofanie i wsadowanie żądań

Tryb debug

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

Najlepsze praktyki

  1. Używaj webhooków - Subskrybuj invitee.created i invitee.canceled dla synchronizacji w czasie rzeczywistym
  2. Dodaj niestandardowe pytania - Zbieraj dane o firmie, roli i telefonie dla bogatszych profili kontaktów
  3. Mapuj typy zdarzeń - Przypisz różne listy Brevo dla każdego typu zdarzenia Calendly
  4. Obsługuj nieobecności - Śledź nieobecności, aby dostosować scoring leadów i sekwencje follow-up
  5. Używaj linków do planowania - Generuj unikalne linki do planowania dla spersonalizowanych doświadczeń rezerwacji
  6. Ustaw zakres organizacji - Używaj webhooków na poziomie organizacji, aby przechwytywać zdarzenia od wszystkich członków zespołu

Bezpieczeństwo

  • OAuth 2.0 - Uwierzytelnianie oparte na tokenach z zakresem
  • Podpisy webhook - Weryfikacja podpisu HMAC dla przychodzących webhooków
  • Tylko HTTPS - Wszystkie endpointy API wymagają szyfrowania TLS
  • Wygasanie tokenów - Tokeny OAuth wygasają i wymagają przepływów odświeżania
  • Minimalne zakresy - Żądaj tylko wymaganych zakresów OAuth
  • Bezpieczne przechowywanie - Przechowuj tokeny w zmiennych środowiskowych lub menedżerach sekretów

Powiązane zasoby

Subscribe to updates

developer-docs

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

auto-detect
Asystent AI

Cześć! Zapytaj mnie o dokumentację.