Beantrage frühzeitigen Zugang

Gib deinen Vornamen und deine geschäftliche E-Mail-Adresse ein. Wir senden dir einen Link, mit dem du deine Anfrage für den Tajo-Zugang bestätigst.

Calendly Connector

Connector-Status: Geplant Noch nicht gebaut. Tajo betreibt diesen Connector heute nicht.

Illustration · Beispieldaten

Sync-Beispiel

Einen Datensatz prüfen

Quelle

Calendly

Connector-Status: Geplant

Ziel

Ihr anderes Tool

Connector-Status: Eigenes Tool

QuellfeldZielfeldBeispielwert
record.id source_id record_1042
record.updated_at updated_at 2026-10-18T08:00:00Z
record.value value sample_value
  1. Entwerfen
  2. Einen Datensatz prüfen
  3. Diese Version freigeben

Der Status gilt für einzelne Connectoren und garantiert nicht, dass dieser Sync bereit ist. Felder zur Veranschaulichung. Prüfen Sie vor dem Sync das tatsächliche Schema und die Berechtigungen.

Verbinde Calendly über Tajo mit Brevo, um Meeting-Eingeladene automatisch als Kontakte zu synchronisieren, E-Mail-Sequenzen auf Basis von Buchungsereignissen auszulösen und deine Vertriebs- und Onboarding-Workflows zu optimieren.

Überblick

EigenschaftWert
PlattformCalendly
KategorieScheduling (Custom)
EinrichtungsaufwandEinfach
Offizielle IntegrationNein
Synchronisierte DatenEvents, Kontakte, Buchungen, Stornierungen
Auth-MethodeOAuth 2.0 / Personal Access Token

Funktionen

  • Synchronisierung Eingeladener - Erstelle Brevo-Kontakte automatisch aus Meeting-Eingeladenen
  • Buchungs-Trigger - Löse Brevo-Automatisierungen bei gebuchten Meetings aus
  • Umgang mit Stornierungen - Starte Re-Engagement-Flows bei Stornierungen
  • No-Show-Erkennung - Aktualisiere den Kontaktstatus, wenn Eingeladene Meetings verpassen
  • Event-Typ-Zuordnung - Ordne verschiedene Calendly-Event-Typen Brevo-Listen zu
  • Scheduling API - Baue Terminbuchung ohne Redirects direkt in deine App ein

Voraussetzungen

Bevor du beginnst, stelle sicher, dass du Folgendes hast:

  1. Ein Calendly-Konto (Professional-Plan oder höher für API-Zugriff)
  2. Ein Personal Access Token aus Calendly Integrations
  3. Ein Brevo-Konto mit API-Zugriff
  4. Ein Tajo-Konto mit Connector-Berechtigungen

Authentifizierung

Personal Access Token

Terminal window
# Generate at https://calendly.com/integrations/api_webhooks
export CALENDLY_ACCESS_TOKEN=your_personal_access_token
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key

OAuth 2.0

// OAuth 2.0 Authorization Code Flow
const 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 token
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'
})
});

Konfiguration

Grundeinrichtung

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}"

Feldzuordnung

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_STATUS

API-Endpunkte

EndpunktMethodeBeschreibung
https://api.calendly.com/users/meGETAktuelle:n Nutzer:in abrufen
https://api.calendly.com/event_typesGETEvent-Typen auflisten
https://api.calendly.com/scheduled_eventsGETGeplante Events auflisten
https://api.calendly.com/scheduled_events/{uuid}GETEin geplantes Event abrufen
https://api.calendly.com/scheduled_events/{uuid}/inviteesGETEingeladene auflisten
https://api.calendly.com/scheduling_linksPOSTScheduling-Link erstellen
https://api.calendly.com/webhook_subscriptionsPOSTWebhook erstellen
https://api.calendly.com/webhook_subscriptionsGETWebhooks auflisten
https://api.calendly.com/invitee_no_shows/{uuid}GETNo-Show-Status abrufen

Code-Beispiele

Connector initialisieren

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
});

Geplante Events auflisten

// Retrieve 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();

Eingeladene mit Brevo synchronisieren

// Get invitees for a scheduled event and sync to 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]
});
}

Webhook-Abonnements einrichten

// Subscribe to Calendly events
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.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

Die Adresse example.com oben ist ein Platzhalter, bis der Tajo-Endpunkt verfügbar ist.

Webhook-Events verarbeiten

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');
});

Ratenbegrenzungen

RessourceLimitHinweise
API-Anfragen6.000/Min.Organisationsweites Limit
Webhook-Abonnements30 pro OrganisationÜber alle Event-Typen hinweg
Scheduling-LinksUnbegrenztKein Limit pro Minute

Paginierung

Antworten der Calendly-API verwenden cursorbasierte Paginierung. Nutze das next_page_token aus dem pagination-Objekt, um weitere Ergebnisse abzurufen. Die Standard-Seitengröße beträgt 20 Einträge, maximal 100.

Fehlerbehebung

ProblemUrsacheLösung
Webhook wird nicht empfangenFalscher ScopeVerwende den organization-Scope für Webhooks
401 UnauthorizedToken abgelaufenNeues Token generieren oder OAuth-Token erneuern
Fehlende EinladungsdatenFragen nicht konfiguriertBenutzerdefinierte Fragen zum Event-Typ hinzufügen
Doppelte KontakteKeine Dedup-LogikE-Mail als eindeutige Kennung für Upserts verwenden
Rate Limit 429Zu viele AnfragenBackoff und Request-Batching umsetzen

Debug-Modus

connectors:
calendly:
debug: true
log_level: verbose
log_webhooks: true

Best Practices

  1. Webhooks nutzen - Abonniere invitee.created und invitee.canceled für eine Echtzeit-Synchronisierung
  2. Benutzerdefinierte Fragen hinzufügen - Erfasse Unternehmen, Rolle und Telefon für reichere Kontaktprofile
  3. Event-Typen zuordnen - Weise unterschiedliche Brevo-Listen pro Calendly-Event-Typ zu
  4. No-Shows verarbeiten - Verfolge No-Shows, um Lead-Scoring und Follow-up-Sequenzen anzupassen
  5. Scheduling-Links nutzen - Erstelle eindeutige Scheduling-Links für personalisierte Buchungserlebnisse
  6. Organisationsscope setzen - Nutze organisationsweite Webhooks, um Events aller Team-Mitglieder zu erfassen

Sicherheit

  • OAuth 2.0 - Scope-basierte, tokengestützte Authentifizierung
  • Webhook-Signaturen - HMAC-Signaturvalidierung für eingehende Webhooks
  • Nur HTTPS - Alle API-Endpunkte erfordern TLS-Verschlüsselung
  • Token-Ablauf - OAuth-Tokens laufen ab und erfordern Refresh-Flows
  • Minimale Scopes - Fordere nur die erforderlichen OAuth-Scopes an
  • Sichere Speicherung - Tokens in Umgebungsvariablen oder Secret Managern ablegen

Verwandte Ressourcen

Beantrage frühzeitigen Zugang

Gib deinen Vornamen und deine geschäftliche E-Mail-Adresse ein. Wir senden dir einen Link, mit dem du deine Anfrage für den Tajo-Zugang bestätigst.

AI-Assistent

Hallo! Fragen Sie mich alles über die Dokumentation.

Diese Seite als Markdown: calendly.md

Markdown wird geladen …
In Claude öffnen In ChatGPT öffnen