Skip to main content
RapidDev - Software Development Agency
lovable-integrationsEdge Function Integration

How to Integrate Lovable with GoToMeeting

To integrate Lovable with GoToMeeting, create a Supabase Edge Function that authenticates with the GoTo API using OAuth2, then creates meetings, lists upcoming sessions, and retrieves attendance records. Store your GoTo Client ID, Client Secret, and refresh token in Cloud → Secrets. GoToMeeting focuses on regular team meetings and conference calls, whereas GoToWebinar handles large one-to-many presentations with registration workflows.

What you'll learn

  • How the GoTo API serves both GoToMeeting and GoToWebinar from a unified authentication system
  • How to complete the GoTo OAuth2 authorization flow and store the resulting refresh token
  • How to write a Deno Edge Function that refreshes GoTo access tokens and creates meetings
  • How to retrieve meeting join URLs and host keys from the GoToMeeting API
  • Key differences between GoToMeeting and GoToWebinar and when to use each
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate12 min read45 minutesCommunicationMarch 2026RapidDev Engineering Team
TL;DR

To integrate Lovable with GoToMeeting, create a Supabase Edge Function that authenticates with the GoTo API using OAuth2, then creates meetings, lists upcoming sessions, and retrieves attendance records. Store your GoTo Client ID, Client Secret, and refresh token in Cloud → Secrets. GoToMeeting focuses on regular team meetings and conference calls, whereas GoToWebinar handles large one-to-many presentations with registration workflows.

Online meeting scheduling and attendance tracking in Lovable with GoToMeeting

GoToMeeting and GoToWebinar are both products from GoTo (formerly LogMeIn), and they share the same underlying REST API and OAuth2 authentication infrastructure at developer.goto.com. The distinction is functional: GoToMeeting targets regular team meetings and internal collaboration calls (similar to Zoom meetings), while GoToWebinar targets one-to-many webinar broadcasts with registration workflows and attendee analytics. If you are building a scheduling app, a CRM with meeting integration, or an internal tool that books team video calls, GoToMeeting is the right product.

The GoTo API for meetings follows the same OAuth2 patterns as GoToWebinar. You create an app in developer.goto.com, complete a one-time browser authorization to obtain a refresh token, and store that token in Cloud → Secrets. Your Edge Function exchanges the refresh token for a short-lived access token on each invocation. Meeting creation, listing, and attendee reports all use the access token in the Authorization header.

One practical consideration: GoToMeeting meetings have a 'joinURL' for participants and a separate 'hostURL' for the meeting organizer (who must use the host URL to start the meeting). Both are returned by the API and should be stored in your Supabase database — participants need join URLs and hosts need host URLs. The join URL is designed to be shareable, while the host URL should be kept private.

Integration method

Edge Function Integration

GoToMeeting has no native Lovable connector. Integration is built through Supabase Edge Functions that use the GoTo API with OAuth2 to create meetings, retrieve join URLs, and access attendance records. The Edge Function manages token refresh using a stored refresh token, so users only complete the browser-based OAuth authorization once. All credentials are encrypted in Cloud → Secrets.

Prerequisites

  • A Lovable project with Lovable Cloud enabled (Cloud tab accessible in the editor)
  • A GoTo account at goto.com with an active GoToMeeting subscription
  • A GoTo Developer Center app created at developer.goto.com with Authorization Code OAuth2
  • Client ID and Client Secret from the developer.goto.com app settings
  • Initial OAuth2 authorization completed to obtain a refresh token and account key

Step-by-step guide

1

Create a GoTo Developer app with Meeting scopes

Navigate to developer.goto.com and sign in with your GoTo account. Click 'My Apps' → 'Add a New App'. Name the app (e.g., 'Lovable Meeting Integration') and select 'Authorization Code' as the authorization type. Add a redirect URI — use https://httpbin.org/get temporarily to complete the initial authorization in a browser and capture the code. On the Scopes tab, add the meeting-specific scopes: 'collab:meetings_management' for creating and managing meetings, and 'collab:meetings_read' for reading meeting data and attendance. Do not add webinar scopes unless you also need GoToWebinar access. Click Save. Copy the Client ID and Client Secret from the app details page. These are your OAuth2 credentials. The next step is completing the browser-based authorization to obtain your initial refresh token, which your Edge Function will use to generate access tokens indefinitely.

Pro tip: GoTo uses the same developer portal for all GoTo products (Meeting, Webinar, Training). Make sure to select only the meeting-specific scopes to follow the principle of least privilege.

Expected result: A GoTo Developer app with Client ID, Client Secret, and meeting scopes configured.

2

Complete OAuth2 authorization and store tokens in Cloud → Secrets

Build and open the authorization URL in your browser to complete the one-time OAuth2 flow. The URL format is: https://authentication.logmeininc.com/oauth/authorize?client_id={yourClientId}&response_type=code&redirect_uri={yourRedirectUri}&scope=collab%3Ameetings_management%20collab%3Ameetings_read. Replace {yourClientId} with your actual Client ID and {yourRedirectUri} with the encoded redirect URI you configured. After authorizing, you will be redirected to your redirect URI with a code parameter in the URL (e.g., https://httpbin.org/get?code=XXXXXXXX). Copy the code value. Now exchange it for tokens by making a POST request to https://authentication.logmeininc.com/oauth/token. Use Basic Auth (your Client ID as username, Client Secret as password) with grant_type=authorization_code, code, and redirect_uri in the body. This returns access_token, refresh_token, and account_key. In Lovable's Cloud tab → Secrets, add: GOTO_CLIENT_ID, GOTO_CLIENT_SECRET, GOTO_REFRESH_TOKEN (the refresh token from above), and GOTO_ACCOUNT_KEY (the numeric account key). These are the same secret names used in GoToWebinar integration — if you have both, you can share the same OAuth app and secrets between both Edge Functions.

Pro tip: You can use a tool like Postman or Hoppscotch to make the token exchange POST request conveniently without writing code. The key is capturing the refresh_token from the response — it does not expire unless revoked.

Expected result: GOTO_CLIENT_ID, GOTO_CLIENT_SECRET, GOTO_REFRESH_TOKEN, and GOTO_ACCOUNT_KEY secrets saved in Cloud → Secrets.

3

Build the GoToMeeting management Edge Function

Create an Edge Function called gotomeeting that handles meeting creation, listing, and attendance retrieval. The function must first refresh the access token using the stored refresh token, then call the appropriate GoToMeeting API endpoint based on the action in the request body. The GoToMeeting API base URL for meeting management is https://api.getgo.com/G2M/rest/v2/me/meetings (note G2M for GoToMeeting, versus G2W for GoToWebinar). For creating a meeting, POST to this endpoint with subject, startTime, endTime, and optionally conferenceCallInfo, passwordRequired, and maxParticipants fields. The response includes meetingId, joinURL, and hostURL. For listing meetings, GET the same endpoint with optional query parameters for time range filtering. For attendance data after a meeting ends, use GET /meetings/{meetingId}/attendees to retrieve participant details including join time, leave time, and duration. This endpoint is only available after the meeting has ended. Ask Lovable to generate the Edge Function with all three operations (create, list, attendance) controlled by an action parameter. Review the deployed code to verify secret names and API endpoints are correct.

Lovable Prompt

Create a Supabase Edge Function called gotomeeting that: 1) Reads GOTO_CLIENT_ID, GOTO_CLIENT_SECRET, GOTO_REFRESH_TOKEN, GOTO_ACCOUNT_KEY from env. 2) Refreshes the access token using the refresh token flow against https://authentication.logmeininc.com/oauth/token. 3) Supports action='create': POST to https://api.getgo.com/G2M/rest/v2/me/meetings with subject, startTime, endTime (ISO 8601), returns meetingId, joinURL, hostURL. 4) Supports action='list': GET upcoming meetings from the same endpoint. 5) Supports action='attendance': GET /meetings/{meetingId}/attendees for post-meeting data. Include CORS headers.

Paste this in Lovable chat

supabase/functions/gotomeeting/index.ts
1// supabase/functions/gotomeeting/index.ts
2import { serve } from 'https://deno.land/std@0.168.0/http/server.ts';
3
4const corsHeaders = {
5 'Access-Control-Allow-Origin': '*',
6 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
7};
8
9async function getAccessToken(): Promise<string> {
10 const clientId = Deno.env.get('GOTO_CLIENT_ID')!;
11 const clientSecret = Deno.env.get('GOTO_CLIENT_SECRET')!;
12 const refreshToken = Deno.env.get('GOTO_REFRESH_TOKEN')!;
13 const credentials = btoa(`${clientId}:${clientSecret}`);
14
15 const res = await fetch('https://authentication.logmeininc.com/oauth/token', {
16 method: 'POST',
17 headers: {
18 'Authorization': `Basic ${credentials}`,
19 'Content-Type': 'application/x-www-form-urlencoded',
20 },
21 body: `grant_type=refresh_token&refresh_token=${encodeURIComponent(refreshToken)}`,
22 });
23 if (!res.ok) throw new Error(`GoTo auth error: ${await res.text()}`);
24 const data = await res.json();
25 return data.access_token;
26}
27
28serve(async (req) => {
29 if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders });
30
31 try {
32 const { action, meetingId, subject, startTime, endTime } = await req.json();
33 const token = await getAccessToken();
34 const headers = { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' };
35 const baseUrl = 'https://api.getgo.com/G2M/rest/v2';
36
37 if (action === 'create') {
38 const res = await fetch(`${baseUrl}/me/meetings`, {
39 method: 'POST',
40 headers,
41 body: JSON.stringify({ subject, startTime, endTime }),
42 });
43 const data = await res.json();
44 if (!res.ok) throw new Error(`Create error: ${JSON.stringify(data)}`);
45 return new Response(JSON.stringify({
46 meetingId: data.meetingId,
47 joinURL: data.joinURL,
48 hostURL: data.hostURL,
49 subject: data.subject,
50 startTime: data.startTime,
51 }), { headers: { ...corsHeaders, 'Content-Type': 'application/json' } });
52 }
53
54 if (action === 'list') {
55 const now = new Date().toISOString();
56 const future = new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toISOString();
57 const res = await fetch(`${baseUrl}/me/meetings?startDate=${now}&endDate=${future}`, { headers });
58 const data = await res.json();
59 return new Response(JSON.stringify(data), { headers: { ...corsHeaders, 'Content-Type': 'application/json' } });
60 }
61
62 if (action === 'attendance') {
63 const res = await fetch(`${baseUrl}/meetings/${meetingId}/attendees`, { headers });
64 const data = await res.json();
65 return new Response(JSON.stringify(data), { headers: { ...corsHeaders, 'Content-Type': 'application/json' } });
66 }
67
68 throw new Error('Invalid action');
69 } catch (error) {
70 return new Response(
71 JSON.stringify({ error: error.message }),
72 { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
73 );
74 }
75});

Pro tip: GoToMeeting timestamps use ISO 8601 format in UTC. Convert the user's local time to UTC before sending to the API, and convert back to local time when displaying meeting times in your UI.

Expected result: A deployed gotomeeting Edge Function supporting meeting creation, listing, and attendance retrieval via the GoToMeeting API.

4

Build the meeting scheduler UI and store meeting data

With the Edge Function deployed, use Lovable's chat to build the frontend components. A meeting scheduler form should collect a meeting title and start/end time from the user, call the gotomeeting Edge Function with action='create', and display the resulting join URL. Store meeting data in a Supabase table — at minimum, columns for meeting_id, subject, start_time, end_time, join_url, host_url, and created_by (user ID from Supabase Auth). The host_url should only be visible to the meeting organizer — apply a Row Level Security policy that restricts host_url visibility based on the created_by field matching the logged-in user. For meeting participants who need to join, display the join_url prominently with a 'Copy Link' button and a 'Join Now' link that opens in a new tab. Consider sending the join URL via Resend email to invited participants if your app manages guest lists. For complex scheduling scenarios with calendar integration, timezone handling, and recurring meetings, RapidDev's team can help design the full scheduling system.

Lovable Prompt

Create a meeting scheduler form with: title input, date picker, start time and end time pickers, and a 'Create Meeting' button. When submitted, call the gotomeeting Edge Function with action='create'. On success, show the join URL in a card with copy and open buttons. Also show the host URL in a separate card visible only to the organizer (add a note that this is the host-only link). Save all meeting data to a meetings table. Show a loading state during creation.

Paste this in Lovable chat

Pro tip: Keep the host URL private — only the meeting organizer should see it. Apply a Supabase RLS policy that filters columns or uses a view that excludes host_url for non-organizer reads.

Expected result: A meeting scheduler form in Lovable that creates GoToMeeting sessions and displays join URLs to users.

Common use cases

Automated meeting creation from a booking scheduler

When a prospect books a demo or a client schedules a consultation in your Lovable app, automatically create a GoToMeeting session and send both host and participant join links. The Edge Function creates the meeting, stores the join URL in your bookings table, and returns it to display to the user.

Lovable Prompt

Add meeting creation to my booking system. When a booking is confirmed, call my gotomeeting-create Edge Function to create a GoToMeeting session at the booked time. Store the meetingId, joinUrl, and hostUrl in the bookings table. Display the join link to the customer in the confirmation screen.

Copy this prompt to try it in Lovable

Meeting history dashboard with attendance records

Build an admin dashboard showing all past and upcoming GoToMeeting sessions with participant counts and attendance rates. Pull data from the GoToMeeting API via the Edge Function and display it with filtering by date range, host, and meeting type.

Lovable Prompt

Create a meetings dashboard. Show upcoming meetings from my gotomeeting-list Edge Function in a table with meeting name, date, join link, and organizer. For past meetings, show attendee count. Add date range filters and a search box. Cache the data in a meetings table and refresh every 10 minutes.

Copy this prompt to try it in Lovable

CRM integration with automatic follow-up on meeting completion

Connect GoToMeeting to your Lovable CRM so that when a meeting ends, attendance data is automatically pulled and stored. The Edge Function fetches post-meeting attendee data and updates CRM records with meeting outcome, duration, and whether each contact attended.

Lovable Prompt

Build post-meeting automation. After a meeting's scheduled end time, call my gotomeeting-attendance Edge Function to fetch the attendee list for that meetingId. Update each contact in the contacts table with last_meeting_date and attended (boolean). Show a meeting summary card with attendance info.

Copy this prompt to try it in Lovable

Troubleshooting

Token refresh returns 'invalid_grant' and the access token cannot be obtained

Cause: The GOTO_REFRESH_TOKEN in Cloud → Secrets has been revoked, expired due to inactivity, or the scope of the original authorization did not include meeting management scopes.

Solution: Complete the OAuth2 authorization flow again in a browser: build the authorization URL with your Client ID, open it, authorize, capture the new authorization code from the redirect URL, exchange it for tokens, and update GOTO_REFRESH_TOKEN in Cloud → Secrets with the new refresh token.

Meeting creation returns 400 Bad Request with no clear error details

Cause: The startTime or endTime is in the past, not in ISO 8601 format, or the difference between start and end is less than GoToMeeting's minimum meeting duration.

Solution: Ensure startTime is in the future and formatted as ISO 8601 UTC (e.g., '2026-06-15T14:00:00Z'). GoToMeeting requires a minimum meeting duration — ensure endTime is at least 15 minutes after startTime. Check Cloud → Logs for the full error response body from the GoToMeeting API.

Attendance endpoint returns 404 or empty array for a meeting that recently ended

Cause: Attendance data is not immediately available after a meeting ends — GoToMeeting takes several minutes to process and make attendance records available via the API.

Solution: Wait 5-15 minutes after the meeting ends before polling the attendance endpoint. For production apps, implement a polling mechanism that retries the attendance endpoint periodically rather than expecting immediate data availability after the scheduled end time.

GoToMeeting API returns 403 Forbidden when listing meetings

Cause: The OAuth token's scope does not include 'collab:meetings_read', or the token was authorized for a different GoTo product (e.g., only webinar scopes).

Solution: Re-authorize the GoTo app with both meeting management and meeting read scopes. The authorization URL must include scope=collab%3Ameetings_management%20collab%3Ameetings_read (URL-encoded spaces between scopes). Update the refresh token in Secrets after re-authorization.

Best practices

  • Always store both joinURL and hostURL in your database — hosts cannot start the meeting without the hostURL, and participants cannot join without the joinURL
  • Apply Row Level Security to hide hostURL from non-organizer users — leaking the host URL allows anyone to take control of the meeting
  • Refresh the access token at the start of every Edge Function call — the overhead is minimal (~200ms) and eliminates token expiry edge cases
  • Convert times to UTC before sending to the GoToMeeting API and back to local time for display — store UTC in your database and handle timezone conversion on the frontend
  • Wait 5-15 minutes after a meeting ends before requesting attendance data — the API does not make attendance records immediately available
  • For recurring meetings, use GoToMeeting's recurrence settings (recurrenceType, recurrenceEndDate) rather than creating individual meeting instances to simplify management
  • Test meeting creation with a date well in the future during development to avoid validation errors and to prevent unintended test meetings on your GoTo account

Alternatives

Frequently asked questions

What is the difference between GoToMeeting and GoToWebinar in the API?

GoToMeeting (API path /G2M/) is for standard team meetings where all participants can share video and audio. GoToWebinar (API path /G2W/) is for one-to-many presentations where the host presents to a registered audience. They use the same GoTo OAuth2 authentication but different API endpoints and different features — webinars have registration management, GoToMeeting does not.

Does GoToMeeting require attendees to install software?

No — GoToMeeting supports browser-based joining without installation as of recent versions. However, the full-featured desktop app provides better audio and video quality. The joinURL you receive from the API works for both browser and app joining — attendees choose their preferred method.

Can I share the GoTo OAuth app between GoToMeeting and GoToWebinar integrations?

Yes — the same GoTo Developer app, Client ID, Client Secret, and refresh token can be reused for both GoToMeeting and GoToWebinar Edge Functions as long as the app was authorized with scopes for both products. This is convenient for apps that need both meeting and webinar features.

How many meetings can I create via the API on a standard GoToMeeting plan?

GoToMeeting API usage limits are generally tied to your account's meeting capacity rather than separate API-specific limits. Standard plans allow creating meetings up to your plan's maximum participant capacity. For high-volume meeting creation (e.g., creating thousands of unique meeting rooms), contact GoTo sales to confirm plan limits.

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.