Calendly کنیکٹر
میٹنگ مدعوئین کو خود بخود رابطوں کے طور پر سنک کرنے، بکنگ ایونٹس کی بنیاد پر ای میل سیکوئنسز کو متحرک کرنے، اور اپنی سیلز اور onboarding ورک فلوز کو ہموار کرنے کے لیے Tajo کے ذریعے Calendly کو Brevo سے منسلک کریں۔
جائزہ
| خاصیت | قدر |
|---|---|
| پلیٹ فارم | Calendly |
| زمرہ | شیڈولنگ (حسب ضرورت) |
| سیٹ اپ کی پیچیدگی | آسان |
| آفیشل انٹیگریشن | نہیں |
| سنک شدہ ڈیٹا | ایونٹس، رابطے، بکنگز، منسوخیاں |
| توثیقی طریقہ | OAuth 2.0 / Personal Access Token |
خصوصیات
- مدعو سنک - میٹنگ مدعوئین سے خود بخود Brevo رابطے بنائیں
- بکنگ ٹرگرز - جب میٹنگز بک ہوں تو Brevo آٹومیشنز کو چلائیں
- منسوخی کی ہینڈلنگ - منسوخیوں پر ری-انگیجمنٹ فلوز کو متحرک کریں
- No-show کا پتہ لگانا - جب مدعوئین میٹنگز سے محروم ہوں تو رابطے کی حیثیت کو اپ ڈیٹ کریں
- ایونٹ کی قسم میپنگ - مختلف Calendly ایونٹ اقسام کو Brevo فہرستوں سے میپ کریں
- Scheduling API - ری ڈائریکٹس کے بغیر اپنی ایپ میں براہ راست شیڈولنگ بنائیں
ضروریات
شروع کرنے سے پہلے، یقینی بنائیں کہ آپ کے پاس ہے:
- Calendly اکاؤنٹ (API رسائی کے لیے Professional پلان یا اوپر)
- Calendly Integrations سے Personal Access Token
- API رسائی کے ساتھ Brevo اکاؤنٹ
- کنیکٹر اجازتوں کے ساتھ Tajo اکاؤنٹ
توثیق
Personal Access Token
# https://calendly.com/integrations/api_webhooks پر تخلیق کریں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' });
// کوڈ کو ٹوکن کے لیے تبدیل کریں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: 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 اینڈ پوائنٹس
| اینڈ پوائنٹ | طریقہ | تفصیل |
|---|---|---|
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 | ویب ہک بنائیں |
https://api.calendly.com/webhook_subscriptions | GET | ویب ہکس کی فہرست |
https://api.calendly.com/invitee_no_shows/{uuid} | GET | No-show کی حیثیت حاصل کریں |
کوڈ مثالیں
کنیکٹر کو شروع کریں
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});شیڈول شدہ ایونٹس کی فہرست
// شیڈول شدہ ایونٹس حاصل کریں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();مدعوئین کو Brevo سے سنک کریں
// شیڈول شدہ ایونٹ کے لیے مدعوئین حاصل کریں اور 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] });}ویب ہک سبسکرپشن سیٹ اپ کریں
// Calendly ایونٹس کو سبسکرائب کریں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 }) });ویب ہک ایونٹس کو ہینڈل کریں
app.post('/webhooks/calendly', async (req, res) => { // ویب ہک سگنیچر کی تصدیق کریں 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/منٹ | تنظیم وسیع حد |
| ویب ہک سبسکرپشنز | فی تنظیم 30 | تمام ایونٹ اقسام میں |
| شیڈولنگ لنکس | لامحدود | فی منٹ کوئی حد نہیں |
پیجینیشن
Calendly API ریسپانسز کرسر پر مبنی پیجینیشن استعمال کرتے ہیں۔ اضافی نتائج حاصل کرنے کے لیے pagination آبجیکٹ سے next_page_token استعمال کریں۔ ڈیفالٹ پیج سائز 20 آئٹمز ہے، زیادہ سے زیادہ 100۔
مسائل کا سراغ
| مسئلہ | وجہ | حل |
|---|---|---|
| ویب ہک موصول نہیں ہوا | غلط اسکوپ | ویب ہکس کے لیے organization اسکوپ استعمال کریں |
| 401 Unauthorized | ٹوکن کی میعاد ختم | نیا ٹوکن تخلیق کریں یا OAuth ٹوکن ریفریش کریں |
| مدعو کا ڈیٹا غائب | سوالات کنفیگر نہیں | ایونٹ کی قسم میں حسب ضرورت سوالات شامل کریں |
| ڈپلیکیٹ رابطے | کوئی ڈی ڈپ منطق نہیں | upserts کے لیے ای میل کو منفرد شناخت کنندہ کے طور پر استعمال کریں |
| ریٹ کی حد 429 | بہت زیادہ درخواستیں | بیک آف اور درخواست بیچنگ نافذ کریں |
ڈیبگ موڈ
connectors: calendly: debug: true log_level: verbose log_webhooks: trueبہترین طریقے
- ویب ہکس استعمال کریں - ریئل ٹائم سنک کے لیے
invitee.createdاورinvitee.canceledکو سبسکرائب کریں - حسب ضرورت سوالات شامل کریں - امیر رابطہ پروفائلز کے لیے کمپنی، رول، اور فون ڈیٹا جمع کریں
- ایونٹ اقسام کو میپ کریں - فی Calendly ایونٹ کی قسم مختلف Brevo فہرستیں تفویض کریں
- No-shows کو ہینڈل کریں - لیڈ اسکورنگ اور فالو اپ سیکوئنسز کو ایڈجسٹ کرنے کے لیے no-shows کو ٹریک کریں
- شیڈولنگ لنکس استعمال کریں - ذاتی بکنگ تجربات کے لیے منفرد شیڈولنگ لنکس تخلیق کریں
- تنظیم کا اسکوپ سیٹ کریں - تمام ٹیم ممبران سے ایونٹس حاصل کرنے کے لیے org-level ویب ہکس استعمال کریں
سیکیورٹی
- OAuth 2.0 - اسکوپڈ ٹوکن پر مبنی توثیق
- ویب ہک سگنیچرز - آنے والے ویب ہکس کے لیے HMAC سگنیچر کی توثیق
- صرف HTTPS - تمام API اینڈ پوائنٹس کو TLS انکرپشن کی ضرورت ہوتی ہے
- ٹوکن کی میعاد - OAuth ٹوکنز کی میعاد ختم ہوتی ہے اور ریفریش فلوز کی ضرورت ہوتی ہے
- کم از کم اسکوپس - صرف ضروری OAuth اسکوپس درخواست کریں
- محفوظ اسٹوریج - ٹوکنز کو ماحولیاتی متغیرات یا سیکریٹ مینیجرز میں محفوظ کریں