Skip to main content
The onboarding embed allows you to add a “Continue with Cal.com” button to your application. When a user clicks it, a dialog opens where they can sign up for Cal.com, set up their profile, connect a calendar, and authorize your app with OAuth — all in one flow, without ever leaving your site. This is useful if you are building an integration that needs access to a user’s Cal.com account. Instead of sending users to Cal.com separately, you can embed the entire signup and authorization experience directly in your app.
The onboarding embed is a React component available in the @calcom/atoms package. You need an OAuth client ID from Cal.com to use it. See OAuth setup for details on obtaining credentials.

How it works

The onboarding embed guides users through four steps inside a modal dialog:
  1. Sign up or log in — The user creates a new Cal.com account or signs in to an existing one.
  2. Profile setup — The user enters their name, username, and bio.
  3. Calendar connection — The user optionally connects a calendar (Google Calendar, Apple Calendar, etc.).
  4. OAuth authorization — The user reviews the permissions your app is requesting and clicks “Allow” or “Deny”.
If a user closes the dialog before finishing, they can reopen it and resume where they left off.

Installation

Install the @calcom/atoms package:

Basic usage

Import the OnboardingEmbed component and add it to your page:
By default, the component renders a “Continue with Cal.com” button. Clicking it opens the onboarding dialog.

Configuration

Required props

Authorization object

Optional props

Authorization modes

The onboarding embed supports two ways to handle the authorization result.

Callback mode

If you provide the onAuthorizationAllowed prop, the component calls your function with the authorization code and closes the dialog. This keeps the user on your page.

Redirect mode

If you do not provide onAuthorizationAllowed, the browser redirects to your redirectUri with the authorization code and state as URL parameters:
If the user denies access, the redirect includes an error parameter:

Pre-filling user details

You can pass a user prop to pre-fill the signup form:

Using PKCE

For public clients that cannot securely store a client secret, use PKCE (Proof Key for Code Exchange) by including a codeChallenge in the authorization object:

Custom trigger element

By default, the embed renders a “Continue with Cal.com” button. You can replace it with your own element:

Error handling

The onError callback receives an error object with a code and message. The possible error codes are: