Skip to main content
The OnboardingEmbed atom lets you embed the full Cal.com signup, onboarding, and OAuth authorization flow directly inside your application. Users create a Cal.com account, complete onboarding, and grant your app OAuth access — all without leaving your site. For a demonstration of the onboarding embed flow, please refer to the video below.

When to use this

Use the Onboarding Embed when you want new users to connect their Cal.com account during your app’s own signup or setup flow. Instead of redirecting users to Cal.com and back, the entire process happens in an embedded dialog.

Prerequisites

  • An OAuth client created via OAuth setup
  • The @calcom/atoms package installed in your project

Modes

The component supports two modes for receiving the authorization code:
  • Callback mode — provide onAuthorizationAllowed to receive the authorization code via a callback. No page navigation occurs.
  • Redirect mode — omit onAuthorizationAllowed and the browser navigates to your redirectUri with the code as a query parameter.
After a new user signs up through the embed, Cal.com sends them a verification email to confirm their email address.

Callback mode

Provide onAuthorizationAllowed to receive the authorization code directly. The dialog closes and your callback fires after the user authorizes your OAuth client — no page reload.

Redirect mode

Omit onAuthorizationAllowed and the browser navigates to your redirectUri after the user completes onboarding and grants access:

Props

Authorization props

If the user signs up via Google, the user prop values are ignored — name, email, and username are inferred from the Google account instead.

Trigger and theme

The theme prop controls the appearance of the trigger button, the onboarding steps, and the authorization page. The default trigger renders a “Continue with Cal.com” button: You can pass a custom trigger element via the trigger prop:

User flow walkthrough

Here’s what happens when a user clicks the trigger with onAuthorizationAllowed provided and the user prop set:
1. Trigger — The component renders a “Continue with Cal.com” button. The user clicks it to open the onboarding dialog. 2. Login or signup — The dialog opens with the login form. Existing users can sign in with email or Google. The user.email prop prefills the email field. New users click “Create account” to sign up with Google or email. When signing up with email, the user.email and user.username props are prefilled. 3. Profile — After signup, the user sets up their profile. The user.name prop prefills the name field. 4. Connect calendar — The user can connect a calendar or skip this step. 5. Authorize — The user reviews the requested permissions and clicks “Allow”. The displayed permissions correspond to the scope passed to the component. 6. DoneonAuthorizationAllowed fires with the authorization code. Exchange it for tokens using the token endpoint.

Public clients (PKCE)

Public OAuth clients cannot safely store a client secret (e.g. browser-only apps). Use PKCE to secure the authorization code exchange instead. Generate a code_verifier, derive a code_challenge from it, and pass the challenge to OnboardingEmbed. When you receive the authorization code, exchange it with the code_verifier instead of a client secret.

Error handling

The onError callback receives an error object with the following shape:

How it works

The component opens a dialog containing an iframe that loads Cal.com’s onboarding flow. The iframe runs on Cal.com’s domain with a first-party session, so no third-party cookies are needed. The flow automatically detects the user’s state:
  • No session — starts at signup/login, then profile setup, calendar connection, and OAuth consent.
  • Session with incomplete onboarding — resumes from where the user left off.
  • Session with complete onboarding — skips straight to OAuth consent.
After the user grants access, you receive an authorization code that you exchange for access and refresh tokens using the token endpoint.