Conector Calendly

Conectați Calendly la Brevo prin Tajo pentru a sincroniza automat invitații la întâlniri ca contacte, a declanșa secvențe de e-mail bazate pe evenimentele de rezervare și a eficientiza fluxurile de lucru pentru vânzări și onboarding.

Prezentare generală

ProprietateValoare
PlatformăCalendly
CategorieProgramare (Personalizat)
Complexitate configurareUșoară
Integrare oficialăNu
Date sincronizateEvenimente, Contacte, Rezervări, Anulări
Metodă de autentificareOAuth 2.0 / Token de acces personal

Funcționalități

  • Sincronizare invitați - Creați automat contacte Brevo din invitații la întâlniri
  • Declanșatoare rezervare - Activați automatizări Brevo când întâlnirile sunt rezervate
  • Gestionare anulări - Declanșați fluxuri de re-angajare la anulări
  • Detectare neprezentare - Actualizați statusul contactului când invitații nu se prezintă
  • Mapare tipuri de evenimente - Mapați diferite tipuri de evenimente Calendly la listele Brevo
  • API de programare - Construiți programarea direct în aplicația dvs. fără redirecționări

Cerințe preliminare

Înainte de a începe, asigurați-vă că aveți:

  1. Un cont Calendly (plan Professional sau superior pentru acces API)
  2. Un Token de acces personal din Calendly Integrations
  3. Un cont Brevo cu acces API
  4. Un cont Tajo cu permisiuni de conector

Autentificare

Token de acces personal

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

Configurare

Configurare de bază

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

Mapare câmpuri

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

Puncte finale API

Punct finalMetodăDescriere
https://api.calendly.com/users/meGETObține utilizatorul curent
https://api.calendly.com/event_typesGETListează tipurile de evenimente
https://api.calendly.com/scheduled_eventsGETListează evenimentele programate
https://api.calendly.com/scheduled_events/{uuid}GETObține un eveniment programat
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETListează invitații
https://api.calendly.com/scheduling_linksPOSTCreează link de programare
https://api.calendly.com/webhook_subscriptionsPOSTCreează webhook
https://api.calendly.com/webhook_subscriptionsGETListează webhook-urile
https://api.calendly.com/invitee_no_shows/{uuid}GETObține statusul de neprezentare

Exemple de cod

Inițializare conector

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

Listare evenimente programate

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

Sincronizare invitați cu 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]
});
}

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

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

Limite de rată

ResursăLimităNote
Cereri API6.000/minLimită la nivel de organizație
Abonamente webhook30 per organizațiePentru toate tipurile de evenimente
Link-uri de programareNelimitatFără limită per minut

Paginare

Răspunsurile API Calendly utilizează paginare bazată pe cursor. Utilizați next_page_token din obiectul pagination pentru a recupera rezultate suplimentare. Dimensiunea implicită a paginii este de 20 elemente, cu un maxim de 100.

Depanare

ProblemăCauzăSoluție
Webhook nereceptedScop greșitUtilizați scopul organization pentru webhook-uri
401 NeautorizatToken expiratGenerați un token nou sau reîmprospătați tokenul OAuth
Date invitat lipsăÎntrebări neconfigurareAdăugați întrebări personalizate la tipul de eveniment
Contacte duplicateFără logică de deduplicareUtilizați e-mailul ca identificator unic pentru upsert-uri
Limită rată 429Prea multe cereriImplementați backoff și gruparea cererilor

Modul de depanare

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

Bune practici

  1. Utilizați webhook-uri - Abonați-vă la invitee.created și invitee.canceled pentru sincronizare în timp real
  2. Adăugați întrebări personalizate - Colectați date despre companie, rol și telefon pentru profiluri de contact mai bogate
  3. Mapați tipurile de evenimente - Atribuiți liste Brevo diferite per tip de eveniment Calendly
  4. Gestionați neprezentările - Urmăriți neprezentările pentru a ajusta scoring-ul lead-urilor și secvențele de follow-up
  5. Utilizați link-uri de programare - Generați link-uri de programare unice pentru experiențe de rezervare personalizate
  6. Setați scopul la nivel de organizație - Utilizați webhook-uri la nivel de org pentru a captura evenimente de la toți membrii echipei

Securitate

  • OAuth 2.0 - Autentificare bazată pe token cu scop limitat
  • Semnături webhook - Validare semnătură HMAC pentru webhook-urile primite
  • Numai HTTPS - Toate punctele finale API necesită criptare TLS
  • Expirare token - Tokenii OAuth expiră și necesită fluxuri de reîmprospătare
  • Scopuri minime - Solicitați doar scopurile OAuth necesare
  • Stocare securizată - Stocați tokenii în variabile de mediu sau manageri de secrete

Resurse conexe

Subscribe to updates

developer-docs

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

auto-detect
Asistent AI

Bună! Întreabă-mă orice despre documentație.