Calendly-koppling
Kopplingens status: Planerad Inte byggd än. Tajo kör inte den här kopplingen i dag.
Illustration · exempeldata
Exempel på synkronisering
Källa
Calendly
Kopplingens status: Planerad
Mål
Ditt andra verktyg
Kopplingens status: Eget verktyg
Fältmappning
| Källfält | Målfält | Exempelvärde |
|---|---|---|
record.id | source_id | record_1042 |
record.updated_at | updated_at | 2026-10-18T08:00:00Z |
record.value | value | sample_value |
- Utkast
- Granska en post
- Godkänn den här versionen
Status gäller varje enskild koppling och garanterar inte att den här synkroniseringen är klar. Fälten är illustrativa. Kontrollera det faktiska schemat och behörigheterna innan synkronisering körs.
Anslut Calendly till Brevo via Tajo för att automatiskt synka mötesinbjudna som kontakter, utlösa e-postsekvenser baserat på bokningshändelser och strömlinjeforma dina sälj- och onboardingflöden.
Översikt
| Egenskap | Värde |
|---|---|
| Plattform | Calendly |
| Kategori | Schemaläggning (Anpassad) |
| Installationskomplexitet | Enkel |
| Officiell integration | Nej |
| Data som synkas | Händelser, kontakter, bokningar, avbokningar |
| Autentiseringsmetod | OAuth 2.0 / Personal Access Token |
Funktioner
- Synk av inbjudna - Skapa automatiskt Brevo-kontakter från mötesinbjudna
- Bokningsutlösare - Avfyra Brevo-automationer när möten bokas
- Hantering av avbokningar - Utlös återengagemangsflöden vid avbokningar
- Detektering av no-show - Uppdatera kontaktstatus när inbjudna missar möten
- Mappning av händelsetyper - Mappa olika Calendly-händelsetyper till Brevo-listor
- Schemaläggnings-API - Bygg schemaläggning direkt in i din app utan omdirigeringar
Förutsättningar
Innan du börjar, se till att du har:
- Ett Calendly-konto (Professional-plan eller högre för API-åtkomst)
- En Personal Access Token från Calendly Integrations
- Ett Brevo-konto med API-åtkomst
- Ett Tajo-konto med kopplingsbehörigheter
Autentisering
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' })});Konfiguration
Grundinställning
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}"Fältmappning
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 | Metod | Beskrivning |
|---|---|---|
https://api.calendly.com/users/me | GET | Hämta aktuell användare |
https://api.calendly.com/event_types | GET | Lista händelsetyper |
https://api.calendly.com/scheduled_events | GET | Lista schemalagda händelser |
https://api.calendly.com/scheduled_events/{uuid} | GET | Hämta en schemalagd händelse |
https://api.calendly.com/scheduled_events/{uuid}/invitees | GET | Lista inbjudna |
https://api.calendly.com/scheduling_links | POST | Skapa schemaläggningslänk |
https://api.calendly.com/webhook_subscriptions | POST | Skapa webhook |
https://api.calendly.com/webhook_subscriptions | GET | Lista webhooks |
https://api.calendly.com/invitee_no_shows/{uuid} | GET | Hämta no-show-status |
Kodexempel
Initiera kopplingen
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});Lista schemalagda händelser
// 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();Synka inbjudna till 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] });}Sätt upp webhook-prenumerationer
// 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
Adressen example.com ovan är en platshållare tills Tajo-endpointen är tillgänglig.
Hantera webhook-händelser
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');});Hastighetsbegränsningar
| Resurs | Gräns | Noteringar |
|---|---|---|
| API-förfrågningar | 6 000/min | Organisationsomfattande gräns |
| Webhook-prenumerationer | 30 per organisation | Över alla händelsetyper |
| Schemaläggningslänkar | Obegränsat | Ingen per-minut-gräns |
Paginering
Calendlys API-svar använder cursor-baserad paginering. Använd next_page_token från pagination-objektet för att hämta ytterligare resultat. Standardsidstorleken är 20 objekt, med ett maxvärde på 100.
Felsökning
| Problem | Orsak | Lösning |
|---|---|---|
| Webhook tas inte emot | Fel scope | Använd organization-scope för webhooks |
| 401 Unauthorized | Token utgången | Generera ny token eller uppdatera OAuth-token |
| Saknar inbjudendata | Frågor ej konfigurerade | Lägg till anpassade frågor i händelsetypen |
| Dubblettkontakter | Ingen dedup-logik | Använd e-post som unik identifierare för upserts |
| Hastighetsbegränsning 429 | För många förfrågningar | Implementera backoff och batcha förfrågningar |
Felsökningsläge
connectors: calendly: debug: true log_level: verbose log_webhooks: trueBästa praxis
- Använd webhooks - Prenumerera på
invitee.createdochinvitee.canceledför synk i realtid - Lägg till anpassade frågor - Samla in företag, roll och telefondata för rikare kontaktprofiler
- Mappa händelsetyper - Tilldela olika Brevo-listor per Calendly-händelsetyp
- Hantera no-shows - Följ no-shows för att justera leadscoring och uppföljningssekvenser
- Använd schemaläggningslänkar - Generera unika schemaläggningslänkar för personliga bokningsupplevelser
- Sätt organisationsscope - Använd webhooks på org-nivå för att fånga händelser från alla teammedlemmar
Säkerhet
- OAuth 2.0 - Scopad tokenbaserad autentisering
- Webhook-signaturer - HMAC-signaturvalidering för inkommande webhooks
- Endast HTTPS - Alla API-endpoints kräver TLS-kryptering
- Token-utgång - OAuth-tokens går ut och kräver refresh-flöden
- Minimala scopes - Begär endast nödvändiga OAuth-scopes
- Säker lagring - Lagra tokens i miljövariabler eller hemlighetshanterare