Integrations

Providers, BYOK, and platform keys.

Supported providers

CategoryProviders
LLM (7)OpenAI, Anthropic, Google Gemini, Groq, OpenRouter, xAI (Grok), Mistral
Speech-to-TextDeepgram, AssemblyAI
Text-to-SpeechElevenLabs, OpenAI, Deepgram Aura, Cartesia
Telephony / MessagingTwilio (voice + SMS)

BYOK vs Platform

On the Integrations page, each provider can be set to Platform (use our key, billed in tokens) or BYOK (your key, you pay the provider directly; that usage spends no tokens but carries a flat orchestration fee — $0.06/voice-min, $0.006/message). Connect a key and click Test to validate it before you rely on it. Admins set platform-wide keys under Platform Keys.

Note · All keys are encrypted at rest (AES-256-GCM) and resolved business → platform → environment. They're never exposed to the browser.

Connect your accounts (Calendar, Stripe, Shopify…)

Beyond the AI providers, you can connect external accounts that your agent's tools use. Open Integrations, pick the service, paste the credential, and click Test:

ServiceWhat to pasteUsed by
Google CalendarConnect via OAuth (Connect Google Account)create_booking
Apple / CalDAVCalDAV URL + username + app-specific passwordcreate_booking
Microsoft OutlookPublished calendar ICS URLavailability lookups
StripeSecret key (sk_live_…)payment/customer lookups
ShopifyShop domain + Admin API access tokenshopify_order
Custom APIBase URL + optional keyyour webhook tools

Once connected, the matching built-in tool works automatically: create_booking writes a real event to your calendar (Google or CalDAV), and shopify_order looks up real orders by number, email, or phone. If no calendar is connected, create_booking still records the booking and tells the agent to connect one.

Tip · Zero data retention with the AI providers is separate — arrange it with the provider on your own account and connect that BYOK key. See GDPR & Privacy in Settings.

Data export & deletion

Under Settings → GDPR & Privacy you can export everything we hold for your account as a JSON bundle (business, agents, phone numbers, calls + transcripts) or file a deletion request. Requests are tracked with a status and an append-only audit trail.

Connecting a calendar (step by step)

Option A — Google Calendar (OAuth)

  1. Integrations → Google Calendar → click Connect Google Account and approve access.
  2. Leave the Calendar field as `primary` to use your main calendar.
  3. To target a different calendar, open Google Calendar → Settings for my calendars → pick the calendar → Integrate calendar → copy the Calendar ID (your email, or a …@group.calendar.google.com address) and paste it into the Calendar field.
  4. Click Test — it should say connected.
Important · Google OAuth must be configured on the platform (GOOGLE_OAUTH_CLIENT_ID / GOOGLE_OAUTH_CLIENT_SECRET from Google Cloud Console). If the Connect button does nothing, use CalDAV below instead — it needs no OAuth.

Option B — Apple / CalDAV (paste only, no OAuth)

Works with iCloud, Fastmail, Nextcloud, and any CalDAV server.

  1. Create an app-specific password — for iCloud: appleid.apple.com → Sign-In and Security → App-Specific Passwords.
  2. Integrations → Apple / CalDAV Calendar.
  3. Paste the CalDAV URL (iCloud uses your calendar collection URL), your username (e.g. you@icloud.com), and the app-specific password.
  4. Click Test, then add the create_booking tool to your agent.

Once either is connected, create_booking writes real events to that calendar automatically.

Owner / platform setup (external services)

Most integrations need nothing but a pasted key. A few depend on platform-level configuration the account owner sets once (in Vercel env vars or a provider console). This section is the checklist for whoever operates the platform.

Google Calendar (OAuth) — already provisioned

Google Calendar uses OAuth, not a pasted key. The Google Cloud project (OAuth consent screen + Web client) is already set up by the owner. To verify or move it, confirm the following:

  1. Two env vars exist in Vercel (Production): GOOGLE_OAUTH_CLIENT_ID and GOOGLE_OAUTH_CLIENT_SECRET. The Integrations page reads env.googleOauth from these — if either is missing the Connect button is hidden and status shows "not configured".
  2. In Google Cloud Console → APIs & Services → Credentials, the OAuth client is type "Web application".
  3. That client's Authorized redirect URIs must contain EXACTLY the callback the app builds: `${NEXT_PUBLIC_APP_URL}/api/integrations/google/callback` (e.g. https://your-app.vercel.app/api/integrations/google/callback). It must be an exact string match — no trailing slash, correct scheme/host. If NEXT_PUBLIC_APP_URL is unset the app falls back to the request origin, so set it to avoid drift.
  4. The OAuth consent screen requests these scopes: calendar.events, calendar.readonly, openid, email. Add them to the consent screen's scope list (and to any test-user / verification config).
  5. The Google Calendar API must be enabled for the project (APIs & Services → Library → Google Calendar API → Enable).
Note · CLIENT_ID/SECRET live in Vercel env vars, NOT in the app database and NOT in any per-business setting. They are platform-wide. Per-business state is only the OAuth refresh token captured after a user clicks Connect (stored encrypted in Integration.config).
Important · The exact redirect URI the code constructs is `${NEXT_PUBLIC_APP_URL ?? requestOrigin}/api/integrations/google/callback`. If Google returns redirect_uri_mismatch, the value registered in Console does not byte-for-byte equal this — fix the Console entry or set NEXT_PUBLIC_APP_URL.

Microsoft Outlook — Sign in with Microsoft (Azure AD + Graph)

Outlook works like Google: a one-time Azure app registration by the owner, then each business clicks "Connect Microsoft Account". One-time owner steps:

  • Azure Portal → Microsoft Entra ID → App registrations → New registration. Name it (e.g. "CustomWeb Calendar").
  • Supported account types: "Accounts in any organizational directory and personal Microsoft accounts" (so both Outlook.com personal and work/school accounts can connect).
  • Redirect URI (platform = Web): `${NEXT_PUBLIC_APP_URL}/api/integrations/microsoft/callback` (e.g. https://your-app.vercel.app/api/integrations/microsoft/callback) — exact match, no trailing slash.
  • Copy the Application (client) ID. Then Certificates & secrets → New client secret → copy the secret VALUE (not the ID).
  • API permissions → Microsoft Graph → Delegated: add offline_access, openid, email, User.Read, Calendars.ReadWrite.
  • Add the two values to Vercel env: MS_OAUTH_CLIENT_ID and MS_OAUTH_CLIENT_SECRET. The Integrations page reads env.microsoftOauth from these — if missing, the Connect button is hidden and only the read-only ICS fallback shows.
Note · Without the Azure app, Outlook still offers a read-only "Published ICS URL" fallback (availability only, can't create events). With OAuth connected, the agent can read availability AND book events via Microsoft Graph.

Per-business pasted credentials (no platform setup)

These need nothing from the owner — each business pastes its own credential and clicks Test:

ServiceCredential to obtainWhere to get it
Apple / CalDAVApp-specific password (iCloud URL = https://caldav.icloud.com)appleid.apple.com → Sign-In and Security → App-Specific Passwords
Microsoft OutlookClick "Connect Microsoft Account" (OAuth) — or paste a published ICS URL for read-onlyOne-click sign-in once the owner registers the Azure app (above)
StripeRestricted/secret key (sk_live_… or sk_test_…)dashboard.stripe.com → Developers → API keys
ShopifyAdmin API access token (shpat_…) + shop domainShopify admin → Apps → Develop apps → Admin API access token
Make.comWebhook URLMake scenario → Custom webhook module → copy address
TwilioAccount SID + Auth Tokenconsole.twilio.com dashboard
N&N CRM / Custom APIAPI base URL + keyyour own service
Tip · Each row above is testable in-app — paste, click Test connection, and the platform makes a live probe call to the provider before you rely on it. AI/voice provider keys (OpenAI, Anthropic, ElevenLabs, …) work the same way.

Webhooks

Webhooks let your agent call your own systems. There are two directions:

  • Outbound (tools) — a webhook tool POSTs the model's arguments to your URL during a call/chat and feeds the JSON response back to the agent. Define the parameter schema so the LLM knows what to send. 10-second timeout with retry.
  • Inbound (platform) — Twilio voice/SMS webhooks (signature-verified) drive calls, and Stripe billing webhooks (signing-secret verified) drive subscriptions and token grants. All handlers are idempotent so retries never double-charge.
POST https://your-api.com/book
Content-Type: application/json
{ "name": "Jane", "date": "2026-06-10T14:00:00Z", "service": "Consultation" }

// your endpoint replies, and the agent uses it:
{ "ok": true, "confirmationId": "BK-1042" }