calcom/cal.com
app-store
Purpose
packages/app-store/ is Cal.diy's third-party-integration directory: 111 sub-packages that connect the product to calendars (Google, Office 365, Apple, CalDAV, Lark, Feishu), conferencing (Zoom, Daily, Google Meet, Webex, Jitsi, Office 365 Video, Whereby, Element Call, ...), payments (Stripe, PayPal, HitPay, btcpayserver, Mock), CRMs (HubSpot, Salesforce, Close, Pipedrive, Attio, Zoho, Lyra, Linear), analytics (Plausible, PostHog, GA4, Fathom, Matomo, Umami, MetaPixel, GTM, Databuddy, Twipla), automation (Zapier, n8n, Make, Pipedream), AI receptionists (Retell, Bolna, Synthflow, Telli, Famulor, Greetmate, Lindy, Monobot, Millis, Fonio), messaging (Telegram, Discord, Signal, WhatsApp, Intercom), and a long tail of tools (Linear, Granola, Raycast, Vimcal, Amie, Framer, ...).
A companion package, packages/app-store-cli, owns the CLI used to scaffold and edit these integrations.
Directory layout
packages/app-store/
├── _components/, _lib/, _pages/, _utils/ # Shared scaffolding (renderers, install button, types)
├── _appRegistry.ts # Build-time registry indexer
├── apps.metadata.generated.ts (11 KB) # Generated registry (DO NOT EDIT)
├── apps.server.generated.ts (3.7 KB) # Server-side registry (DO NOT EDIT)
├── apps.schemas.generated.ts # Zod schemas (DO NOT EDIT)
├── apps.keys-schemas.generated.ts # Per-app credential key schemas (DO NOT EDIT)
├── apps.browser.generated.tsx # Client-side registry (DO NOT EDIT)
├── analytics.services.generated.ts # Per-category registries (DO NOT EDIT)
├── calendar.services.generated.ts
├── crm.apps.generated.ts
├── payment.services.generated.ts
├── video.adapters.generated.ts
├── bookerApps.metadata.generated.ts
├── redirect-apps.generated.ts
├── server.ts # Server-side helpers
├── locations.ts # Location strings (Zoom, Google Meet, ...)
├── utils.ts / utils.test.ts
├── delegationCredential.ts # Per-app delegation helper
├── appStoreMetaData.ts # Aggregated metadata
├── eventTypeAppCardZod.ts # Per-app event-type card schema
├── tests/ # Cross-app tests
├── templates/ # Templates used by app-store-cli to scaffold new apps
└── <appName>/ # 111 individual integrations
├── api/ # OAuth / webhook handlers
├── components/ # React UI for the install flow
├── lib/ # Service classes (CalendarService, VideoApiAdapter, ...)
├── static/ # Logo / screenshots
├── _metadata.ts # Constants (slug, type, categories, ...)
├── config.json # User-facing app metadata
├── package.json
└── index.tsThe _-prefixed directories are conventional "private" support code; numbered/lettered directories are individual integrations.
How an integration is wired in
graph LR
Authoring[Author writes <app>/config.json + lib/CalendarService.ts]
CLI[app-store-cli walks packages/app-store/*]
Generated[*.generated.ts files]
Web[apps/web reads metadata + adapters]
Browser[apps/web client renders install button + settings]
Authoring --> CLI
CLI --> Generated
Generated --> Web
Generated --> BrowserThe CLI source is packages/app-store-cli. It produces:
apps.metadata.generated.ts— every app's user-visible metadata (name, description, categories, logo path)apps.server.generated.ts— server-side imports (handlers, services)apps.browser.generated.tsx— lazy-loaded React components for the install flowapps.schemas.generated.ts— combined Zod schema covering every app'sevent-typecardapps.keys-schemas.generated.ts— per-app credential key schemas (used to validate the encryptedCredential.keyJSON)- Per-category registries:
calendar.services.generated.ts,analytics.services.generated.ts,crm.apps.generated.ts,payment.services.generated.ts,video.adapters.generated.ts
AGENTS.md explicitly forbids editing any *.generated.* file by hand.
Categories and adapter shapes
| Category | Adapter shape | Example | Generated registry |
|---|---|---|---|
| Calendar | CalendarService extending BaseCalendarService |
googlecalendar/lib/CalendarService.ts |
calendar.services.generated.ts |
| Conferencing / video | VideoApiAdapter |
dailyvideo/lib/VideoApiAdapter.ts, zoomvideo/lib/VideoApiAdapter.ts |
video.adapters.generated.ts |
| Payment | PaymentService |
stripepayment/lib/PaymentService.ts, paypal/lib/PaymentService.ts |
payment.services.generated.ts |
| CRM | CrmService |
hubspot/lib/CrmService.ts, salesforce/lib/CrmService.ts |
crm.apps.generated.ts |
| Analytics | AnalyticsService |
posthog/lib/AnalyticsService.ts |
analytics.services.generated.ts |
| Automation / messaging / other | Per-app handlers in api/ |
zapier/api/, telegram/api/ |
apps.server.generated.ts |
The Calendar, VideoApiAdapter, PaymentService, and CrmService interfaces are defined in packages/types/ and packages/lib/. New apps in a category just implement the existing interface.
Authoring flow
yarn create-app # interactive scaffold
yarn edit-app # edit an existing app's config
yarn delete-app # remove an app cleanly
yarn app-store:build # rebuild all *.generated.* files
yarn app-store:watch # rebuild on change during devUnder the hood, yarn create-app runs packages/app-store-cli which copies a template from packages/app-store/templates/ and walks the user through the metadata.
Credential storage
Every installed app stores its OAuth tokens / API keys in the Credential Prisma table. The key JSON column is encrypted with CALENDSO_ENCRYPTION_KEY and validated against the per-app schema in apps.keys-schemas.generated.ts. Never select credential.key into anything that flows to a client (AGENTS.md).
packages/lib/delegationCredential.ts and packages/features/credentials handle the rare case of system-wide delegation credentials (e.g., Google Workspace domain-wide delegation).
Notable individual apps
googlecalendar— the original calendar provider; reference for new calendar adapters.office365calendar/exchangecalendar/exchange2013calendar/exchange2016calendar— Microsoft graph + Exchange variants.caldavcalendar/applecalendar/ics-feedcalendar— CalDAV-based providers.larkcalendar/feishucalendar/zohocalendar— non-US providers.dailyvideo— first-party video, owned by Cal.com (uses Daily.co).stripepayment— first-class payment provider; deeply integrated with the booking pipeline (deposits, no-show fees, refund flow).zapier,n8n,make,pipedream— automation outbound webhooks.hubspot,salesforce,pipedrive-crm,closecom,attio,zoho-bigin,zohocrm— CRM dispatch on booking events.retell-ai,bolna,synthflow,telli,famulor,greetmate-ai,monobot,millis-ai,fonio-ai,lindy— AI voice receptionists.
Integration points
- Booking pipeline consumes calendar adapters (
getBusyTimes,createEvent,updateEvent,deleteEvent), video adapters (createMeeting, ...), and payment services. - Event-type editor uses generated React components from
apps.browser.generated.tsxto render per-app config cards. - Admin UI under
apps/web/app/(use-page-wrapper)/(main-nav)/apps/lists installed apps and surfaces the per-appcomponents/install flow.
Entry points for modification
- Adding a new integration:
yarn create-app. Pick a template (calendar, video, payment, CRM, analytics, generic). Implement the adapter interface inlib/. Add OAuth handlers inapi/. Runyarn app-store:build. - Updating credentials schema: edit the per-app
zoddefinition; the regeneration will updateapps.keys-schemas.generated.ts. - Disabling an integration: set
published: falsein the app'sconfig.jsonand rebuild.
Related pages
- features —
features/calendars,features/credentials,features/conferencingconsume these adapters - features → calendars
- primitives → credential
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.