Skip to main content
RapidDev - Software Development Agency
bolt-ai-integrationsBolt Chat + API Route

How to Integrate Bolt.new with Google Meet

Integrate Bolt.new with Google Meet by enabling the Google Calendar API in Google Cloud Console, registering OAuth 2.0 credentials, and creating calendar events with conferenceData through a Next.js API route. Google Meet has no standalone API — all meeting creation happens through Calendar events. The OAuth redirect flow requires a deployed URL for production; for development, use a service account to test meeting creation in Bolt's WebContainer preview.

What you'll learn

  • Why Google Meet links are created via the Google Calendar API, not a standalone Meet API
  • How to create a Google Cloud service account and configure Calendar API access for server-to-server use
  • How to create calendar events with Google Meet conference links from a Next.js API route
  • How to fetch upcoming meetings and display them in a Bolt app dashboard
  • When to use service accounts versus OAuth 2.0 user delegation for Google Meet integration
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate17 min read40 minutesCommunicationApril 2026RapidDev Engineering Team
TL;DR

Integrate Bolt.new with Google Meet by enabling the Google Calendar API in Google Cloud Console, registering OAuth 2.0 credentials, and creating calendar events with conferenceData through a Next.js API route. Google Meet has no standalone API — all meeting creation happens through Calendar events. The OAuth redirect flow requires a deployed URL for production; for development, use a service account to test meeting creation in Bolt's WebContainer preview.

Creating Google Meet Links from Bolt.new via the Calendar API

The most important thing to understand about Google Meet is that there is no Google Meet API. There is no endpoint at meet.googleapis.com that creates a meeting and returns a join link. Instead, Google Meet conference links are attached to Google Calendar events — when you create a Calendar event with a conferenceData.createRequest field, Google automatically generates a Meet link and attaches it to the event. The Meet link is then accessible on all invited participants' Google calendars. This design reflects Google's philosophy that meetings are fundamentally calendar events, not standalone sessions.

This architectural decision has a significant implication for Bolt apps: your server needs access to Google Calendar API, not a Google Meet API. The most developer-friendly authentication path for server-to-server use (where your app creates meetings without requiring a user to log in) is a Google service account. Service accounts are robot accounts that have their own Google identity and can be granted access to specific Google Workspace resources. You create the service account in Google Cloud Console, download a JSON key file, and use it to authenticate API requests from your Next.js routes. This approach works from Bolt's WebContainer — it's a standard outbound HTTPS call to the Google Calendar API.

For user-specific integration — where meetings appear on a real user's personal Google calendar — you need OAuth 2.0 with user consent, and the OAuth redirect flow requires a publicly accessible redirect URI. This means you'll need to deploy to Netlify or Vercel before testing user-level calendar access. However, for many common use cases (generating a Meet link for a booking, creating internal team meetings), the service account approach is simpler and fully functional in development.

Integration method

Bolt Chat + API Route

Google Meet does not have a standalone REST API — meeting links are created through the Google Calendar API by creating a calendar event with conferenceData.createRequest. Bolt generates the integration code through conversation: describe the meeting scheduling features you need and Bolt writes the API routes and React components. For server-to-server use (creating meetings programmatically without user login), a Google service account is the recommended approach and works in Bolt's WebContainer preview. For user-specific calendar integration (adding meetings to individual users' calendars), OAuth 2.0 with a deployed redirect URI is required.

Prerequisites

  • A Google account with access to Google Cloud Console (console.cloud.google.com)
  • A Google Cloud project with the Google Calendar API enabled
  • A service account created in Google Cloud Console with a downloaded JSON key file (for server-to-server use)
  • A Google Calendar that the service account has been shared with (for creating events on a specific calendar)
  • A Next.js project in Bolt.new — prompt 'Create a Next.js app' if starting fresh

Step-by-step guide

1

Enable the Google Calendar API and create a service account

Go to console.cloud.google.com and sign in with your Google account. Create a new project by clicking the project dropdown at the top → New Project. Give it a name and click Create. Wait for the project to be created (typically 10–15 seconds), then select it. Enable the Calendar API: In the left sidebar, go to APIs & Services → Library. Search for 'Google Calendar API' and click it. Click Enable. This activates the Calendar API for your project. Create a service account: Go to APIs & Services → Credentials. Click Create Credentials → Service account. Give it a name like 'bolt-meet-service' and click Create and Continue. For the role, select Editor or a custom role with Calendar access. Click Done. Generate a key: Click on the service account you just created in the list. Go to the Keys tab. Click Add Key → Create new key → JSON. Google downloads a JSON file with the service account credentials — keep this file secure. The JSON contains the service account email address, private key, and project ID. In your Bolt project, you need to store the service account credentials in a way that is accessible to your server-side routes. The JSON key file contains sensitive private key material that must never go in client-side code. The cleanest approach is to extract the two key fields — client_email and private_key — and store them as separate environment variables in .env.local. The private key contains literal newline characters (\n) that must be preserved.

Bolt.new Prompt

Set up Google Calendar API integration with a service account. Add GOOGLE_SERVICE_ACCOUNT_EMAIL and GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY to .env.local as placeholders. Also add GOOGLE_CALENDAR_ID (the calendar ID where meetings will be created — use 'primary' for the service account's default calendar). Create lib/google-calendar.ts with a getGoogleAuthToken function that uses JWT to authenticate with the Calendar API.

Paste this in Bolt.new chat

.env.local
1// .env.local
2GOOGLE_SERVICE_ACCOUNT_EMAIL=bolt-meet-service@your-project.iam.gserviceaccount.com
3# Copy the private_key from the JSON file exactly, including -----BEGIN/END----- lines
4GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----\n"
5GOOGLE_CALENDAR_ID=primary
6
7// lib/google-calendar.ts
8let cachedToken: { token: string; expiresAt: number } | null = null;
9
10export async function getCalendarToken(): Promise<string> {
11 if (cachedToken && Date.now() < cachedToken.expiresAt - 60_000) {
12 return cachedToken.token;
13 }
14
15 const email = process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL!;
16 // Restore newlines that env vars may have encoded as \n
17 const privateKey = process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY!.replace(/\\n/g, '\n');
18
19 const now = Math.floor(Date.now() / 1000);
20 const claim = {
21 iss: email,
22 scope: 'https://www.googleapis.com/auth/calendar',
23 aud: 'https://oauth2.googleapis.com/token',
24 exp: now + 3600,
25 iat: now,
26 };
27
28 // Build JWT manually (avoiding native crypto module issues in some environments)
29 const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');
30 const payload = Buffer.from(JSON.stringify(claim)).toString('base64url');
31 const signingInput = `${header}.${payload}`;
32
33 const { createSign } = await import('node:crypto');
34 const sign = createSign('RSA-SHA256');
35 sign.update(signingInput);
36 const signature = sign.sign(privateKey, 'base64url');
37 const jwt = `${signingInput}.${signature}`;
38
39 const tokenResp = await fetch('https://oauth2.googleapis.com/token', {
40 method: 'POST',
41 headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
42 body: new URLSearchParams({
43 grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
44 assertion: jwt,
45 }),
46 });
47
48 if (!tokenResp.ok) throw new Error(`Google auth failed: ${tokenResp.status}`);
49 const data = await tokenResp.json();
50 cachedToken = { token: data.access_token, expiresAt: Date.now() + data.expires_in * 1000 };
51 return cachedToken.token;
52}

Pro tip: The service account private key in the downloaded JSON file uses literal newlines. When storing it as an environment variable, most systems require you to escape newlines as \n (two characters: backslash and n). The replace(/\\n/g, '\n') call in the code above converts them back to real newlines before using the key.

Expected result: The service account is created and the Calendar API is enabled. Your .env.local contains the service account email and private key, and the getCalendarToken function successfully fetches a Google access token.

2

Share a calendar with the service account

A service account has its own Google identity but by default can only access its own calendar. To create events on a specific Google Calendar (such as your personal work calendar or a shared team calendar), you must share that calendar with the service account's email address. Open Google Calendar at calendar.google.com. In the left sidebar, find the calendar you want the service account to create events on. Click the three-dot menu next to it → Settings and sharing. Scroll down to 'Share with specific people or groups'. Click Add people, enter your service account's email address (found in Google Cloud Console → IAM & Admin → Service Accounts, or in the downloaded JSON as client_email), and set the permission to 'Make changes to events'. Click Send. If you want the service account to create meetings on its own default calendar (which is simpler for many use cases), use 'primary' as the calendar ID. The service account's primary calendar is only accessible from API calls — it is not visible in any Google Calendar UI. You can also create meetings with Google Meet links on the service account's calendar and then share the joinWebLink with users without sharing the calendar itself. Update GOOGLE_CALENDAR_ID in your .env.local to match. For a shared team calendar, the calendar ID looks like a long string ending in @group.calendar.google.com, visible in that calendar's Settings and sharing page. For your personal Google Calendar, use your full Google account email address as the calendar ID.

Bolt.new Prompt

Add the Google Calendar ID configuration to my app and create a test endpoint. Update the GOOGLE_CALENDAR_ID placeholder in .env.local to use 'primary'. Create app/api/google/calendar/test/route.ts that calls the Calendar API to get the calendar details (name, ID, timezone) using the service account token. Display the result on a test page to confirm the service account has access.

Paste this in Bolt.new chat

app/api/google/calendar/test/route.ts
1// app/api/google/calendar/test/route.ts
2import { NextResponse } from 'next/server';
3import { getCalendarToken } from '@/lib/google-calendar';
4
5export async function GET() {
6 const calendarId = process.env.GOOGLE_CALENDAR_ID ?? 'primary';
7 const token = await getCalendarToken();
8
9 const response = await fetch(
10 `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}`,
11 { headers: { Authorization: `Bearer ${token}` } }
12 );
13
14 if (!response.ok) {
15 const error = await response.json();
16 return NextResponse.json({ error }, { status: response.status });
17 }
18
19 const calendar = await response.json();
20 return NextResponse.json({
21 id: calendar.id,
22 summary: calendar.summary,
23 timeZone: calendar.timeZone,
24 accessRole: calendar.accessRole,
25 });
26}

Pro tip: If the calendar test returns 404 or 403, the service account does not have access to the specified calendar. Verify the service account email was added with 'Make changes to events' permission in the calendar sharing settings.

Expected result: GET /api/google/calendar/test returns the calendar name, ID, and timezone, confirming the service account can access the calendar. A 403 means the calendar hasn't been shared with the service account yet.

3

Create Google Meet links via Calendar events

With authentication working, you can create calendar events with Google Meet conference links. The Google Calendar API endpoint is POST /calendars/{calendarId}/events. The key field that generates a Google Meet link is conferenceData.createRequest — include it with a requestId (a random unique string) and conferenceDataVersion: 1 as a query parameter on the request URL. The event body requires summary (the event title), start with dateTime and timeZone, and end with dateTime and timeZone. Adding attendees as an array of {email} objects sends calendar invitations to those addresses and includes them in the Meet session's participant list. The organizer's calendar shows the event; attendees receive email invites with the Meet link. After creating the event, the response includes a conferenceData object if the Meet link was successfully created. The join URL is at conferenceData.entryPoints[0].uri where entryPoint.entryPointType === 'video'. This is the Google Meet join URL you display to users. It looks like https://meet.google.com/abc-defg-hij. Note on WebContainer compatibility: this is an outbound HTTPS POST to Google's Calendar API — it works perfectly in Bolt's development preview. The service account authentication (JWT-based) also runs server-side in your Next.js route, so there are no browser sandbox restrictions. You can create real Google Meet links during development without deploying.

Bolt.new Prompt

Create the Google Meet event creation API route. Build app/api/google/meetings/create/route.ts that accepts a POST with topic, startTime (ISO 8601), durationMinutes, timezone (e.g. 'America/New_York'), and optional attendeeEmails array. Create a Google Calendar event with a Meet link. Return meetLink, eventId, htmlLink (calendar event URL), and startTime.

Paste this in Bolt.new chat

app/api/google/meetings/create/route.ts
1// app/api/google/meetings/create/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3import { getCalendarToken } from '@/lib/google-calendar';
4
5export async function POST(request: NextRequest) {
6 const {
7 topic,
8 startTime,
9 durationMinutes = 60,
10 timezone = 'UTC',
11 attendeeEmails = [],
12 } = await request.json();
13
14 if (!topic || !startTime) {
15 return NextResponse.json({ error: 'topic and startTime are required' }, { status: 400 });
16 }
17
18 const calendarId = process.env.GOOGLE_CALENDAR_ID ?? 'primary';
19 const token = await getCalendarToken();
20
21 const start = new Date(startTime);
22 const end = new Date(start.getTime() + durationMinutes * 60_000);
23
24 const event = {
25 summary: topic,
26 start: { dateTime: start.toISOString(), timeZone: timezone },
27 end: { dateTime: end.toISOString(), timeZone: timezone },
28 conferenceData: {
29 createRequest: {
30 requestId: `meet-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`,
31 conferenceSolutionKey: { type: 'hangoutsMeet' },
32 },
33 },
34 attendees: attendeeEmails.map((email: string) => ({ email })),
35 reminders: { useDefault: true },
36 };
37
38 const response = await fetch(
39 `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events?conferenceDataVersion=1`,
40 {
41 method: 'POST',
42 headers: {
43 Authorization: `Bearer ${token}`,
44 'Content-Type': 'application/json',
45 },
46 body: JSON.stringify(event),
47 }
48 );
49
50 if (!response.ok) {
51 const error = await response.json();
52 return NextResponse.json({ error }, { status: response.status });
53 }
54
55 const created = await response.json();
56 const meetEntry = created.conferenceData?.entryPoints?.find(
57 (ep: { entryPointType: string }) => ep.entryPointType === 'video'
58 );
59
60 return NextResponse.json({
61 eventId: created.id,
62 meetLink: meetEntry?.uri ?? null,
63 htmlLink: created.htmlLink,
64 startTime: created.start.dateTime,
65 topic: created.summary,
66 });
67}

Pro tip: The conferenceDataVersion=1 query parameter is required on the events POST URL — without it, Google silently ignores the conferenceData field and no Meet link is generated. The event is created successfully but meetLink will be null in the response.

Expected result: POST /api/google/meetings/create returns a Google Meet link (https://meet.google.com/xxx-xxxx-xxx), calendar event ID, and a link to view the event in Google Calendar.

4

List upcoming meetings and build the dashboard

To display upcoming meetings in your Bolt app, call the Calendar API events list endpoint: GET /calendars/{calendarId}/events with parameters timeMin (current time in ISO 8601), orderBy=startTime, singleEvents=true (expands recurring events), and maxResults to limit the response. This returns a list of calendar events sorted by start time. For each event, check if conferenceData is present to identify events with Google Meet links. Map the response to the fields your UI needs: event summary, start time, end time, organizer, attendee list, and the Meet join URL from conferenceData.entryPoints[0].uri. Setting singleEvents=true is important for recurring events — without it, the API returns the recurring event series object rather than individual instances, and the start/end times reflect the series pattern rather than the specific occurrence dates. Build the dashboard UI in Bolt by describing the layout: a list of upcoming meetings grouped by date, each card showing the meeting title, start time, duration, attendee count, and a Join Meeting button. Bolt will generate a React component that fetches from your /api/google/meetings/list route on page load. The data fetching is server-side and works without any CORS concerns in the WebContainer — it's the same outbound HTTP pattern as the meeting creation route.

Bolt.new Prompt

Add a meetings list endpoint and dashboard. Create app/api/google/meetings/list/route.ts that returns all calendar events with Google Meet links for the next 7 days, sorted by start time. For each event return: id, title, startTime, endTime, meetLink, attendeeCount, organizerEmail. Then build a MeetingsDashboard React component that displays these as cards grouped by date with a 'Join' button for each.

Paste this in Bolt.new chat

app/api/google/meetings/list/route.ts
1// app/api/google/meetings/list/route.ts
2import { NextResponse } from 'next/server';
3import { getCalendarToken } from '@/lib/google-calendar';
4
5export async function GET() {
6 const calendarId = process.env.GOOGLE_CALENDAR_ID ?? 'primary';
7 const token = await getCalendarToken();
8
9 const now = new Date().toISOString();
10 const sevenDaysFromNow = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString();
11
12 const params = new URLSearchParams({
13 timeMin: now,
14 timeMax: sevenDaysFromNow,
15 orderBy: 'startTime',
16 singleEvents: 'true',
17 maxResults: '50',
18 });
19
20 const response = await fetch(
21 `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events?${params}`,
22 { headers: { Authorization: `Bearer ${token}` } }
23 );
24
25 if (!response.ok) {
26 const error = await response.json();
27 return NextResponse.json({ error }, { status: response.status });
28 }
29
30 const data = await response.json();
31
32 // Only return events that have a Google Meet link
33 const meetings = (data.items ?? [])
34 .filter((event: Record<string, unknown>) => event.conferenceData)
35 .map((event: Record<string, unknown>) => {
36 const entryPoints = (event.conferenceData as Record<string, unknown>)?.entryPoints as Array<Record<string, unknown>> ?? [];
37 const meetEntry = entryPoints.find((ep) => ep.entryPointType === 'video');
38 return {
39 id: event.id,
40 title: event.summary,
41 startTime: (event.start as Record<string, unknown>)?.dateTime,
42 endTime: (event.end as Record<string, unknown>)?.dateTime,
43 meetLink: meetEntry?.uri ?? null,
44 attendeeCount: (event.attendees as unknown[])?.length ?? 0,
45 organizerEmail: (event.organizer as Record<string, unknown>)?.email,
46 };
47 });
48
49 return NextResponse.json({ meetings, total: meetings.length });
50}

Pro tip: Filter events by conferenceData presence to show only meetings with Google Meet links rather than all calendar events. This avoids showing dentist appointments and personal events mixed in with your video calls.

Expected result: GET /api/google/meetings/list returns upcoming meetings with Google Meet links for the next 7 days. The dashboard component displays them grouped by date with working Join buttons.

Common use cases

Instant meeting link generator for booking confirmations

When a user books an appointment or demo call through your Bolt app, automatically generate a Google Meet link and include it in the confirmation email and booking record. The Meet link is created as a calendar event on your service account's calendar and the joinWebLink is displayed to the user immediately.

Bolt.new Prompt

Create a meeting booking form with fields for meeting topic, date/time picker, duration, and attendee email. When submitted, call /api/google/meetings/create to create a Calendar event with a Google Meet link. Display the returned Meet link as a clickable button. Also show the event's start time and organizer calendar link.

Copy this prompt to try it in Bolt.new

Meeting dashboard showing upcoming scheduled calls

Build a dashboard that displays all upcoming meetings from your Google Calendar for the next 7 days, with their Meet join links, attendee counts, and meeting topics. Sales reps or team leads can see their schedule at a glance and join meetings directly from the Bolt interface.

Bolt.new Prompt

Create a meetings dashboard at /meetings that fetches all calendar events for the next 7 days from /api/google/meetings/list. Display each event in a card with title, start time, duration, attendee count, and a 'Join Meeting' button linking to the Google Meet URL. Group events by day.

Copy this prompt to try it in Bolt.new

Automated recurring team standup scheduler

Create a workflow that generates a recurring weekly Google Meet link for team standups. The calendar event repeats every weekday using an RRULE, and the persistent Meet link (Google Meet links attached to recurring events don't change week-to-week) is shared with the team once.

Bolt.new Prompt

Create an API route at /api/google/meetings/recurring that creates a recurring calendar event (every Monday at 9:30 AM, for 30 minutes) with a Google Meet link. Use RRULE:FREQ=WEEKLY;BYDAY=MO for recurrence. Return the meetLink and calendarEventId. Add a form to configure the day, time, and topic.

Copy this prompt to try it in Bolt.new

Troubleshooting

Meeting creation returns 200 but meetLink is null in the response

Cause: The conferenceDataVersion=1 query parameter is missing from the Calendar events POST URL. Without this parameter, Google ignores the conferenceData field and creates the event without a Meet link.

Solution: Ensure the URL for the events POST includes ?conferenceDataVersion=1: https://www.googleapis.com/calendar/v3/calendars/{calendarId}/events?conferenceDataVersion=1. Also verify conferenceSolutionKey.type is set to 'hangoutsMeet' and a unique requestId is provided.

typescript
1// Correct URL with conferenceDataVersion
2const url = `https://www.googleapis.com/calendar/v3/calendars/${encodeURIComponent(calendarId)}/events?conferenceDataVersion=1`;

Service account authentication returns 400 with 'invalid_grant' error

Cause: The private key stored in the environment variable has malformed newlines — either the \n escape sequences were not restored to actual newlines before signing, or the key was truncated when copying from the JSON file.

Solution: Ensure the private_key from the service account JSON is stored with \n as literal backslash-n in your .env.local, then call replace(/\\n/g, '\n') before using it. Verify the key starts with -----BEGIN RSA PRIVATE KEY----- and ends with -----END RSA PRIVATE KEY----- with no extra whitespace.

typescript
1// Restore escaped newlines in the private key
2const privateKey = process.env.GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY!.replace(/\\n/g, '\n');

Calendar API returns 403 Forbidden with 'insufficientPermissions' when creating events

Cause: The service account does not have write access to the specified calendar. Either the calendar has not been shared with the service account email, or it was shared with 'View only' access instead of 'Make changes to events'.

Solution: Go to Google Calendar → calendar settings → Share with specific people and verify the service account email is listed with 'Make changes to events' permission. The service account email is in the format name@project.iam.gserviceaccount.com and can be found in the service account JSON file as client_email.

The service account works in development but fails on Netlify/Vercel with 'private key parsing error'

Cause: Environment variables on hosting platforms may handle multiline values differently than .env.local files. The private key's newlines may not be preserved correctly when set through the hosting dashboard UI.

Solution: In Netlify or Vercel's environment variable settings, store the private key as a single line with literal \n escape sequences (backslash-n). Some hosting platforms have a 'multiline' toggle for environment variables — use it if available. Alternatively, base64-encode the entire service account JSON and decode it at runtime.

typescript
1// Base64 encode the entire service account JSON as one env var
2// In your hosting platform: GOOGLE_SERVICE_ACCOUNT_JSON=<base64-encoded JSON>
3const credentials = JSON.parse(
4 Buffer.from(process.env.GOOGLE_SERVICE_ACCOUNT_JSON!, 'base64').toString()
5);

Best practices

  • Store GOOGLE_SERVICE_ACCOUNT_EMAIL and GOOGLE_SERVICE_ACCOUNT_PRIVATE_KEY as server-side environment variables only — never prefix them with NEXT_PUBLIC_ or expose the private key in client-side code or version control.
  • Always include conferenceDataVersion=1 as a query parameter on the Calendar events POST URL — this is the most common error that silently creates events without Meet links.
  • Use a dedicated Google Calendar for your Bolt app's meetings rather than a personal calendar — this keeps app-generated events organized and makes it easier to filter the events list to only show app-created meetings.
  • Cache the Google OAuth token with its expiry time — service account tokens last one hour, and requesting a new JWT and token on every API call wastes latency and hits token endpoint rate limits.
  • Test meeting creation and listing fully in Bolt's WebContainer preview — service account authentication and Calendar API calls are outbound HTTPS requests that work without deployment. Only set up OAuth user flows after deploying.
  • Generate a unique requestId for each conferenceData.createRequest — use a combination of timestamp and random string to ensure uniqueness across concurrent requests. Duplicate requestIds can cause Google to return the same conference data.
  • For meeting invitations to attendees, verify that the service account's calendar visibility allows attendees to accept or decline events — by default, some Google Workspace organizations block service account calendar invites.

Alternatives

Frequently asked questions

Does Google Meet have a standalone API for creating meeting links?

No. Google Meet does not have a standalone REST API. Meeting links are created by making calendar events with conferenceData through the Google Calendar API. When you include conferenceData.createRequest in a calendar event POST, Google automatically generates a Meet link and attaches it to the event. The Meet link (meet.google.com/xxx-xxxx-xxx) is returned in the event response under conferenceData.entryPoints.

Can I create Google Meet links in Bolt's preview without deploying?

Yes, using service account authentication. Service accounts use JWT-based token acquisition which is a standard outbound HTTPS call — it works from Bolt's WebContainer. The entire flow (get token, create calendar event, return Meet link) runs server-side in your Next.js API route without any browser-side redirect. For OAuth user flows where a real Google user must authorize access, you need a deployed redirect URI and must test on the deployed version.

What is the difference between a service account and OAuth 2.0 for Google Meet integration?

A service account is a robot account that acts as itself when calling the Calendar API. It can create events on any calendar shared with it, without any user clicking an 'Authorize' button. This is ideal for server-to-server use. OAuth 2.0 user authorization lets a real user grant your app access to their own Google Calendar — events appear on their personal calendar and are sent from their account. Use service accounts for app-generated meetings, user OAuth for personal calendar integration.

Does Bolt.new have a native Google Meet integration?

No. Google Meet is not one of Bolt's native connectors. You build the integration manually using Next.js API routes and the Google Calendar API. Bolt's AI can generate much of the boilerplate when you describe the meeting features you need, but you must set up the Google Cloud project, enable the Calendar API, and manage service account credentials yourself.

Can Google Meet links be created without attendees having Google accounts?

Yes. Google Meet links generated by the Calendar API can be joined by anyone — attendees do not need a Google account to join a Meet call. They click the join link and can join via the browser without a Google sign-in (depending on the meeting host's Google Workspace settings). Only the meeting organizer needs a Google account.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.