Conector Calendly
Starea conectorului: Planificat Încă neconstruit. Tajo nu rulează astăzi acest conector.
Ilustrație · date de exemplu
Exemplu de sincronizare
Sursă
Calendly
Starea conectorului: Planificat
Destinație
Celălalt instrument al tău
Starea conectorului: Instrument personalizat
Maparea câmpurilor
| Câmp sursă | Câmp destinație | Valoare exemplu |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Ciornă
- Verifică o înregistrare
- Aprobă această versiune
Stările se referă la fiecare conector și nu garantează că această sincronizare este pregătită. Câmpurile sunt ilustrative. Verifică schema și permisiunile reale înainte de sincronizare.
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ă
| Proprietate | Valoare |
|---|---|
| Platformă | Calendly |
| Categorie | Programare (Personalizat) |
| Complexitate configurare | Ușoară |
| Integrare oficială | Nu |
| Date sincronizate | Evenimente, Contacte, Rezervări, Anulări |
| Metodă de autentificare | OAuth 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:
- Un cont Calendly (plan Professional sau superior pentru acces API)
- Un Token de acces personal din Calendly Integrations
- Un cont Brevo cu acces API
- Un cont Tajo cu permisiuni de conector
Autentificare
Token de acces personal
# Generate at https://calendly.com/integrations/api_webhooksexport CALENDLY_ACCESS_TOKEN=your_personal_access_tokenexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_keyOAuth 2.0
// OAuth 2.0 Authorization Code Flowconst 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 tokenconst 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_STATUSPuncte finale API
| Punct final | Metodă | Descriere |
|---|---|---|
https://api.calendly.com/users/me | GET | Obține utilizatorul curent |
https://api.calendly.com/event_types | GET | Listează tipurile de evenimente |
https://api.calendly.com/scheduled_events | GET | Listează evenimentele programate |
https://api.calendly.com/scheduled_events/{uuid} | GET | Obține un eveniment programat |
https://api.calendly.com/scheduled_events/{uuid}/invitees | GET | Listează invitații |
https://api.calendly.com/scheduling_links | POST | Creează link de programare |
https://api.calendly.com/webhook_subscriptions | POST | Creează webhook |
https://api.calendly.com/webhook_subscriptions | GET | Listează webhook-urile |
https://api.calendly.com/invitee_no_shows/{uuid} | GET | Obț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 eventsconst 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 Brevoconst 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 eventsconst 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.example.com/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 }) });Caution
Adresa example.com de mai sus este un exemplu provizoriu până când endpointul Tajo devine disponibil.
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 API | 6.000/min | Limită la nivel de organizație |
| Abonamente webhook | 30 per organizație | Pentru toate tipurile de evenimente |
| Link-uri de programare | Nelimitat | Fă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 nerecepted | Scop greșit | Utilizați scopul organization pentru webhook-uri |
| 401 Neautorizat | Token expirat | Generați un token nou sau reîmprospătați tokenul OAuth |
| Date invitat lipsă | Întrebări neconfigurare | Adăugați întrebări personalizate la tipul de eveniment |
| Contacte duplicate | Fără logică de deduplicare | Utilizați e-mailul ca identificator unic pentru upsert-uri |
| Limită rată 429 | Prea multe cereri | Implementați backoff și gruparea cererilor |
Modul de depanare
connectors: calendly: debug: true log_level: verbose log_webhooks: trueBune practici
- Utilizați webhook-uri - Abonați-vă la
invitee.createdșiinvitee.canceledpentru sincronizare în timp real - Adăugați întrebări personalizate - Colectați date despre companie, rol și telefon pentru profiluri de contact mai bogate
- Mapați tipurile de evenimente - Atribuiți liste Brevo diferite per tip de eveniment Calendly
- Gestionați neprezentările - Urmăriți neprezentările pentru a ajusta scoring-ul lead-urilor și secvențele de follow-up
- Utilizați link-uri de programare - Generați link-uri de programare unice pentru experiențe de rezervare personalizate
- 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