Σύνδεσμος Calendly
Συνδέστε το Calendly με το Brevo μέσω Tajo για αυτόματο συγχρονισμό προσκεκλημένων σε συναντήσεις ως επαφές, ενεργοποίηση ακολουθιών email βάσει εκδηλώσεων κράτησης και βελτιστοποίηση ροών εργασίας πωλήσεων και εισαγωγής.
Επισκόπηση
| Ιδιότητα | Τιμή |
|---|---|
| Πλατφόρμα | Calendly |
| Κατηγορία | Προγραμματισμός (Προσαρμοσμένο) |
| Πολυπλοκότητα Ρύθμισης | Εύκολη |
| Επίσημη Ενσωμάτωση | Όχι |
| Δεδομένα που Συγχρονίζονται | Εκδηλώσεις, Επαφές, Κρατήσεις, Ακυρώσεις |
| Μέθοδος Πιστοποίησης | OAuth 2.0 / Personal Access Token |
Χαρακτηριστικά
- Συγχρονισμός προσκεκλημένων - Αυτόματη δημιουργία επαφών Brevo από προσκεκλημένους σε συναντήσεις
- Ενεργοποιητές κράτησης - Ενεργοποίηση αυτοματισμών Brevo κατά την κράτηση συναντήσεων
- Χειρισμός ακυρώσεων - Ενεργοποίηση ροών επαναδέσμευσης κατά τις ακυρώσεις
- Ανίχνευση μη εμφάνισης - Ενημέρωση κατάστασης επαφής όταν οι προσκεκλημένοι χάνουν συναντήσεις
- Αντιστοίχιση τύπου εκδήλωσης - Αντιστοίχιση διαφορετικών τύπων εκδηλώσεων Calendly σε λίστες Brevo
- Scheduling API - Ενσωμάτωση προγραμματισμού απευθείας στην εφαρμογή σας χωρίς ανακατευθύνσεις
Προαπαιτούμενα
Πριν ξεκινήσετε, βεβαιωθείτε ότι διαθέτετε:
- Λογαριασμό Calendly (Professional πλάνο ή ανώτερο για πρόσβαση API)
- Personal Access Token από το Calendly Integrations
- Λογαριασμό Brevo με πρόσβαση API
- Λογαριασμό Tajo με δικαιώματα συνδέσμου
Πιστοποίηση
Personal Access Token
# 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' })});Διαμόρφωση
Βασική Ρύθμιση
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_STATUSEndpoints API
| Endpoint | Μέθοδος | Περιγραφή |
|---|---|---|
https://api.calendly.com/users/me | GET | Λήψη τρέχοντος χρήστη |
https://api.calendly.com/event_types | GET | Λίστα τύπων εκδηλώσεων |
https://api.calendly.com/scheduled_events | GET | Λίστα προγραμματισμένων εκδηλώσεων |
https://api.calendly.com/scheduled_events/{uuid} | GET | Λήψη προγραμματισμένης εκδήλωσης |
https://api.calendly.com/scheduled_events/{uuid}/invitees | GET | Λίστα προσκεκλημένων |
https://api.calendly.com/scheduling_links | POST | Δημιουργία συνδέσμου προγραμματισμού |
https://api.calendly.com/webhook_subscriptions | POST | Δημιουργία webhook |
https://api.calendly.com/webhook_subscriptions | GET | Λίστα webhooks |
https://api.calendly.com/invitee_no_shows/{uuid} | GET | Λήψη κατάστασης μη εμφάνισης |
Παραδείγματα Κώδικα
Αρχικοποίηση Συνδέσμου
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 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();Συγχρονισμός Προσκεκλημένων στο 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] });}Ρύθμιση Συνδρομών 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.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 | 6.000/λεπτό | Όριο σε επίπεδο οργανισμού |
| Συνδρομές webhook | 30 ανά οργανισμό | Σε όλους τους τύπους εκδηλώσεων |
| Σύνδεσμοι προγραμματισμού | Απεριόριστο | Χωρίς όριο ανά λεπτό |
Σελιδοποίηση
Οι αποκρίσεις API Calendly χρησιμοποιούν σελιδοποίηση βάσει cursor. Χρησιμοποιήστε το next_page_token από το αντικείμενο pagination για ανάκτηση πρόσθετων αποτελεσμάτων. Το προεπιλεγμένο μέγεθος σελίδας είναι 20 στοιχεία, με μέγιστο 100.
Αντιμετώπιση Προβλημάτων
| Πρόβλημα | Αιτία | Λύση |
|---|---|---|
| Δεν λαμβάνεται webhook | Λάθος scope | Χρησιμοποιήστε scope organization για webhooks |
| 401 Unauthorized | Το token έληξε | Δημιουργήστε νέο token ή ανανεώστε OAuth token |
| Λείπουν δεδομένα προσκεκλημένου | Τα ερωτήματα δεν έχουν ρυθμιστεί | Προσθέστε προσαρμοσμένα ερωτήματα στον τύπο εκδήλωσης |
| Διπλές επαφές | Χωρίς λογική dedup | Χρησιμοποιήστε email ως μοναδικό αναγνωριστικό για upserts |
| Όριο ρυθμού 429 | Υπερβολικά πολλά αιτήματα | Εφαρμόστε backoff και ομαδοποίηση αιτημάτων |
Λειτουργία Εντοπισμού Σφαλμάτων
connectors: calendly: debug: true log_level: verbose log_webhooks: trueΒέλτιστες Πρακτικές
- Χρησιμοποιήστε webhooks - Εγγραφείτε στα
invitee.createdκαιinvitee.canceledγια συγχρονισμό σε πραγματικό χρόνο - Προσθέστε προσαρμοσμένα ερωτήματα - Συλλέξτε εταιρεία, ρόλο και δεδομένα τηλεφώνου για πλουσιότερα προφίλ επαφών
- Αντιστοιχίστε τύπους εκδηλώσεων - Αναθέστε διαφορετικές λίστες Brevo ανά τύπο εκδήλωσης Calendly
- Χειριστείτε μη εμφανίσεις - Παρακολουθήστε μη εμφανίσεις για προσαρμογή βαθμολόγησης leads και ακολουθιών παρακολούθησης
- Χρησιμοποιήστε συνδέσμους προγραμματισμού - Δημιουργήστε μοναδικούς συνδέσμους προγραμματισμού για εξατομικευμένες εμπειρίες κράτησης
- Ορίστε scope οργανισμού - Χρησιμοποιήστε webhooks σε επίπεδο οργανισμού για καταγραφή εκδηλώσεων από όλα τα μέλη της ομάδας
Ασφάλεια
- OAuth 2.0 - Πιστοποίηση βάσει token με περιορισμένο scope
- Υπογραφές webhook - Επαλήθευση υπογραφής HMAC για εισερχόμενα webhooks
- Μόνο HTTPS - Όλα τα endpoints API απαιτούν κρυπτογράφηση TLS
- Λήξη token - Τα OAuth tokens λήγουν και απαιτούν ροές ανανέωσης
- Ελάχιστα scopes - Ζητήστε μόνο τα απαιτούμενα scopes OAuth
- Ασφαλής αποθήκευση - Αποθηκεύστε tokens σε μεταβλητές περιβάλλοντος ή διαχειριστές secrets