Day Otter
FeaturesIntegrationsPricingCompareDocsGitHub
Sign inSign upGet started
All docs

Build & self-host · 9 min read

Integration setup: IDs, keys & webhooks

Where to get the credentials and which redirect URI / webhook to register for Google, Microsoft, Apple, Salesforce, HubSpot, Zoom, Stripe, Twilio and Resend.

Every integration is optional and env-gated - a provider stays inert until you set its keys, so you only wire up what you need. This guide tells you, per provider, where to get the credentials, which redirect URI or webhook to register, and which environment variable each value goes into.

Two things everything depends on. First, APP_URL: your deployment's public base URL (e.g. https://dayotter.com) - every redirect URI and webhook below is APP_URL plus a fixed path, and it must be the exact public HTTPS origin with no trailing slash. Second: after editing env vars, rebuild/redeploy (some are read at build time). Redirect URIs and webhook URLs must be registered EXACTLY in each provider's console or the callback is rejected.

Google Calendar (and Google sign-in)

  1. Google Cloud Console → create/select a project → enable the Google Calendar API.
  2. Configure the OAuth consent screen and add your account as a test user (or publish).
  3. Credentials → Create OAuth client ID → Web application. Authorized redirect URI: APP_URL/api/calendars/connect/google/callback
  4. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET (and NEXT_PUBLIC_GOOGLE_AUTH=1 to show the Google sign-in button).
  • Scopes: calendar.events, calendar.readonly, openid, email, profile.
  • Real-time push sync auto-registers at APP_URL/api/webhooks/google - Google requires a verified domain over HTTPS; if unavailable it's non-fatal (falls back to polling).

Microsoft 365 / Outlook

  1. Azure Portal → Microsoft Entra ID → App registrations → New registration.
  2. Redirect URI (Web): APP_URL/api/calendars/connect/microsoft/callback
  3. Certificates & secrets → New client secret → copy the VALUE.
  4. API permissions → Microsoft Graph → Delegated: Calendars.ReadWrite, User.Read, offline_access, openid, email, profile.
  5. Set MICROSOFT_CLIENT_ID (the Application/client ID) and MICROSOFT_CLIENT_SECRET (the secret value).

Apple iCloud

No developer setup or env vars. Apple calendars connect over CalDAV with a per-user app-specific password: each user generates one at appleid.apple.com (Sign-In & Security → App-Specific Passwords) and pastes it in Settings → Calendars → Apple - never their real Apple ID password.

Salesforce & HubSpot (CRM sync)

  1. Salesforce: Setup → App Manager → New Connected App. Callback URL: APP_URL/api/integrations/crm/salesforce/callback. Scopes: api, refresh_token. Set SALESFORCE_CLIENT_ID (Consumer Key) and SALESFORCE_CLIENT_SECRET.
  2. HubSpot: developers.hubspot.com → Create app. Redirect URL: APP_URL/api/integrations/crm/hubspot/callback. Scopes: crm.objects.contacts.read + write. Set HUBSPOT_CLIENT_ID and HUBSPOT_CLIENT_SECRET.
  3. Once the keys are set, users connect from Settings → CRM in one click (no keys to paste on their end).

Zoom (video links)

  1. Zoom App Marketplace → Develop → Build App → OAuth (user-managed).
  2. Redirect / OAuth allow-list URL: APP_URL/api/integrations/zoom/callback, with the scope to create meetings.
  3. Set ZOOM_CLIENT_ID and ZOOM_CLIENT_SECRET (the connect button is hidden without them).
  • Google Meet needs no setup - it comes with the Google Calendar connection; Teams links come with the Microsoft connection.

Stripe (Pro billing - cloud edition only)

  1. Developers → API keys → copy the Secret key → STRIPE_SECRET_KEY.
  2. Products → add a Product with a RECURRING price ($9/seat/mo). Open the price and copy its API ID (starts with price_) → STRIPE_PRICE_PRO. It MUST be the price_ ID, not a number.
  3. Developers → Webhooks → Add endpoint: APP_URL/api/webhooks/stripe. Events: checkout.session.completed, customer.subscription.created / updated / deleted. Copy the signing secret → STRIPE_WEBHOOK_SECRET.

Note

The webhook flips an org to Pro after payment and tracks seat/cancel changes. DayOtter also reconciles the plan on the checkout-success redirect, so a single missed webhook won't leave you stuck - but configure the webhook for ongoing changes.

Twilio (SMS / WhatsApp reminders)

  1. Twilio Console → copy Account SID + Auth Token.
  2. Set TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_SMS_FROM (E.164 number), and TWILIO_WHATSAPP_FROM (whatsapp:+…).
  3. For inbound replies, set the number's / Messaging Service's incoming-message webhook to APP_URL/api/webhooks/twilio.

Resend (email) - the #1 setup mistake

  1. Resend → API Keys → create one → RESEND_API_KEY.
  2. Domains → Add domain, add the DNS records, and wait for Verified.
  3. Set EMAIL_FROM to an address ON that verified domain, e.g. "DayOtter <no-reply@yourdomain.com>".

Heads up

An unverified/placeholder domain (like example.com) makes EVERY email bounce with 550 domain is not verified - confirmations and reminders silently fail. Alternative to Resend: any SMTP server via SMTP_URL.

Tip

Full reference with the exact table of env vars, redirect URIs and webhooks lives in docs/INTEGRATIONS.md in the repo. Every failure is logged with a structured event (billing_checkout_failed, confirmation_email_failed, sync_watch_failed) you can grep in your container logs.

Related guides

Self-hosting DayOtter

Run the whole platform on your own infrastructure, with every feature unlocked.

Connect a calendar

Link Google, Outlook, iCloud, or any feed so you're never offered a time you're busy.

CRM sync (Salesforce & HubSpot)

Log every booking to your CRM automatically - contact plus meeting activity.

Developer: API, webhooks & embed

Keys and REST endpoints, signed booking events, and the embeddable widget.

Analytics & privacy

Ready to try it? Get started free, or browse all guides.

On this page

  • Google Calendar (and Google sign-in)
  • Microsoft 365 / Outlook
  • Apple iCloud
  • Salesforce & HubSpot (CRM sync)
  • Zoom (video links)
  • Stripe (Pro billing - cloud edition only)
  • Twilio (SMS / WhatsApp reminders)
  • Resend (email) - the #1 setup mistake
Day Otter

The calm home for your time.

GitHubX

Product

  • Features
  • Integrations
  • Pricing
  • How it works
  • Changelog

Compare

  • vs Calendly
  • vs Cal.com
  • vs Google Calendar
  • vs Motion
  • vs Reclaim
  • All comparisons

For

  • Founders
  • Teams
  • Sales teams
  • Customer success
  • Consultants
  • Freelancers
  • All roles

Resources

  • Docs
  • Glossary
  • Self-hosting
  • Blog
  • About
  • Contact

Community

  • Discussions
  • GitHub
  • Contribute
  • Discord

Legal

  • Privacy
  • Terms
  • Security
  • Status
© 2026 DayOtter · AGPLv3Made for people who value their time.