Calendly konektor

Poveži Calendly sa Brevo putem Tajo da automatski sinhronizuješ pozvane osobe sa sastanaka kao kontakte, pokreneš email sekvence zasnovane na događajima rezervacije i unaprediš prodajne i onboarding tokove.

Pregled

SvojstvoVrednost
PlatformaCalendly
KategorijaZakazivanje (Prilagođeno)
Složenost podešavanjaLako
Zvanična integracijaNe
Sinhronizovani podaciDogađaji, Kontakti, Rezervacije, Otkazivanja
Metod autentifikacijeOAuth 2.0 / Personal Access Token

Karakteristike

  • Sinhronizacija pozvanih - Automatsko kreiranje Brevo kontakata iz pozvanih na sastanak
  • Okidači rezervacije - Pokretanje Brevo automatizacija kada su sastanci rezervisani
  • Obrada otkazivanja - Pokretanje tokova ponovnog angažovanja pri otkazivanjima
  • Detekcija no-show - Ažuriranje statusa kontakta kada pozvane osobe ne dođu na sastanak
  • Mapiranje tipova događaja - Mapiranje različitih Calendly tipova događaja na Brevo liste
  • Scheduling API - Ugrađivanje zakazivanja direktno u tvoju aplikaciju bez preusmeravanja

Preduslovi

Pre nego što započneš, proveri da imaš:

  1. Calendly nalog (Professional plan ili više za API pristup)
  2. Personal Access Token iz Calendly Integrations
  3. Brevo nalog sa API pristupom
  4. Tajo nalog sa dozvolama konektora

Autentifikacija

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

Konfiguracija

Osnovno podešavanje

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

Mapiranje polja

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 endpointi

EndpointMetodaOpis
https://api.calendly.com/users/meGETDohvatanje trenutnog korisnika
https://api.calendly.com/event_typesGETListanje tipova događaja
https://api.calendly.com/scheduled_eventsGETListanje zakazanih događaja
https://api.calendly.com/scheduled_events/{uuid}GETDohvatanje zakazanog događaja
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETListanje pozvanih
https://api.calendly.com/scheduling_linksPOSTKreiranje linka za zakazivanje
https://api.calendly.com/webhook_subscriptionsPOSTKreiranje webhook-a
https://api.calendly.com/webhook_subscriptionsGETListanje webhook-ova
https://api.calendly.com/invitee_no_shows/{uuid}GETDohvatanje statusa no-show

Primeri koda

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

Listanje zakazanih događaja

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

Sinhronizacija pozvanih sa 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]
});
}

Podešavanje webhook pretplata

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

Obrada webhook događaja

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

Ograničenja brzine

ResursLimitNapomene
API zahtevi6.000/minOgraničenje na nivou organizacije
Webhook pretplate30 po organizacijiKroz sve tipove događaja
Linkovi za zakazivanjeNeograničenoBez limita po minuti

Paginacija

Calendly API odgovori koriste paginaciju zasnovanu na kursoru. Koristi next_page_token iz objekta pagination za dohvatanje dodatnih rezultata. Podrazumevana veličina stranice je 20 stavki, sa maksimumom od 100.

Rešavanje problema

ProblemUzrokRešenje
Webhook nije primljenPogrešan skopKoristi organization skop za webhook-ove
401 UnauthorizedToken istekaoGeneriši novi token ili osvježi OAuth token
Nedostaju podaci o pozvanoj osobiPitanja nisu konfigurisanaDodaj prilagođena pitanja tipu događaja
Duplirani kontaktiNema logike deduplikacijeKoristi email kao jedinstveni identifikator za upserte
Limit 429Previše zahtevaImplementiraj usporavanje i grupiranje zahteva

Debug režim

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

Najbolje prakse

  1. Koristi webhook-ove - Pretplati se na invitee.created i invitee.canceled za sinhronizaciju u realnom vremenu
  2. Dodaj prilagođena pitanja - Prikupi podatke o kompaniji, ulozi i telefonu za bogatije profile kontakata
  3. Mapiraj tipove događaja - Dodeli različite Brevo liste po Calendly tipu događaja
  4. Obrada no-show - Prati no-show da prilagodiš lead scoring i sekvence praćenja
  5. Koristi linkove za zakazivanje - Generiši jedinstvene linkove za zakazivanje za personalizovana iskustva rezervacije
  6. Postavi skop organizacije - Koristi org-level webhook-ove za hvatanje događaja od svih članova tima

Bezbednost

  • OAuth 2.0 - Autentifikacija zasnovana na skopovanom tokenu
  • Webhook potpisi - HMAC validacija potpisa za dolazne webhook-ove
  • Samo HTTPS - Svi API endpointi zahtevaju TLS enkripciju
  • Isticanje tokena - OAuth tokeni ističu i zahtevaju tokove osvežavanja
  • Minimalni skopovi - Zatraži samo potrebne OAuth skopove
  • Bezbedno skladištenje - Čuvaj tokene u env varijablama ili secret menadžerima

Povezani resursi

Subscribe to updates

developer-docs

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

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

Здраво! Питајте ме о документацији.