Calendly कनेक्टर
meeting invitees को स्वचालित रूप से contacts के रूप में sync करने, booking events के आधार पर email sequences trigger करने, और अपने sales एवं onboarding workflows को सुव्यवस्थित करने के लिए Tajo के माध्यम से Calendly को Brevo से कनेक्ट करें।
अवलोकन
| Property | Value |
|---|---|
| Platform | Calendly |
| Category | Scheduling (Custom) |
| Setup Complexity | Easy |
| Official Integration | No |
| Data Synced | Events, Contacts, Bookings, Cancellations |
| Auth Method | OAuth 2.0 / Personal Access Token |
विशेषताएं
- Invitee sync - meeting invitees से स्वचालित रूप से Brevo contacts बनाएं
- Booking triggers - जब meetings book हों तो Brevo automations चलाएं
- Cancellation handling - cancellations पर re-engagement flows trigger करें
- No-show detection - जब invitees meetings miss करें तो contact status अपडेट करें
- Event type mapping - विभिन्न Calendly event types को Brevo lists से map करें
- Scheduling API - redirects के बिना scheduling को सीधे अपने app में बनाएं
पूर्वावश्यकताएं
शुरू करने से पहले, सुनिश्चित करें कि आपके पास हैं:
- एक Calendly account (API access के लिए Professional plan या उससे ऊपर)
- Calendly Integrations से एक Personal Access Token
- API access वाला एक Brevo account
- connector permissions वाला एक Tajo account
प्रमाणीकरण
Personal Access Token
# https://calendly.com/integrations/api_webhooks पर generate करेंexport 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' });
// token के लिए code exchange करें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' })});कॉन्फ़िगरेशन
बेसिक सेटअप
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
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_STATUSAPI Endpoints
| Endpoint | Method | विवरण |
|---|---|---|
https://api.calendly.com/users/me | GET | वर्तमान user प्राप्त करें |
https://api.calendly.com/event_types | GET | event types list करें |
https://api.calendly.com/scheduled_events | GET | scheduled events list करें |
https://api.calendly.com/scheduled_events/{uuid} | GET | एक scheduled event प्राप्त करें |
https://api.calendly.com/scheduled_events/{uuid}/invitees | GET | invitees list करें |
https://api.calendly.com/scheduling_links | POST | scheduling link बनाएं |
https://api.calendly.com/webhook_subscriptions | POST | webhook बनाएं |
https://api.calendly.com/webhook_subscriptions | GET | webhooks list करें |
https://api.calendly.com/invitee_no_shows/{uuid} | GET | no-show status प्राप्त करें |
कोड उदाहरण
कनेक्टर शुरू करें
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});Scheduled Events List करें
// 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();Invitees को Brevo से Sync करें
// scheduled event के लिए invitees प्राप्त करें और Brevo से sync करें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] });}Webhook Subscriptions सेट करें
// Calendly events की subscribe करें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 }) });Webhook Events हैंडल करें
app.post('/webhooks/calendly', async (req, res) => { // 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');});Rate Limits
| संसाधन | Limit | नोट्स |
|---|---|---|
| API requests | 6,000/min | Organization-wide limit |
| Webhook subscriptions | प्रति organization 30 | सभी event types में |
| Scheduling links | असीमित | कोई per-minute limit नहीं |
Pagination
Calendly API responses cursor-आधारित pagination का उपयोग करते हैं। अतिरिक्त परिणाम प्राप्त करने के लिए pagination object से next_page_token का उपयोग करें। डिफ़ॉल्ट page size 20 items है, अधिकतम 100।
समस्या निवारण
| समस्या | कारण | समाधान |
|---|---|---|
| Webhook प्राप्त नहीं हुआ | गलत scope | webhooks के लिए organization scope का उपयोग करें |
| 401 Unauthorized | Token expire हो गया | नया token generate करें या OAuth token refresh करें |
| गायब invitee data | Questions कॉन्फ़िगर नहीं | event type में custom questions जोड़ें |
| Duplicate contacts | dedup logic नहीं | upserts के लिए email को unique identifier के रूप में उपयोग करें |
| Rate limit 429 | बहुत अधिक requests | backoff और request batching लागू करें |
Debug Mode
connectors: calendly: debug: true log_level: verbose log_webhooks: trueसर्वोत्तम प्रथाएं
- Webhooks का उपयोग करें - real-time sync के लिए
invitee.createdऔरinvitee.canceledकी subscribe करें - Custom questions जोड़ें - समृद्ध contact profiles के लिए company, role, और phone data एकत्र करें
- Event types को map करें - प्रति Calendly event type अलग Brevo lists assign करें
- No-shows संभालें - lead scoring और follow-up sequences adjust करने के लिए no-shows ट्रैक करें
- Scheduling links का उपयोग करें - personalized booking experiences के लिए unique scheduling links generate करें
- Organization scope सेट करें - सभी team members के events capture करने के लिए org-level webhooks का उपयोग करें
सुरक्षा
- OAuth 2.0 - Scoped token-आधारित authentication
- Webhook signatures - incoming webhooks के लिए HMAC signature validation
- HTTPS only - सभी API endpoints के लिए TLS encryption आवश्यक
- Token expiry - OAuth tokens expire होते हैं और refresh flows की आवश्यकता होती है
- Minimal scopes - केवल आवश्यक OAuth scopes का अनुरोध करें
- Secure storage - tokens को environment variables या secret managers में store करें