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
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
Create a GoTo Developer app with Meeting scopes
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.
Complete OAuth2 authorization and store tokens in Cloud → Secrets
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.
Build the GoToMeeting management Edge Function
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.
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
1// supabase/functions/gotomeeting/index.ts2import { serve } from 'https://deno.land/std@0.168.0/http/server.ts';34const corsHeaders = {5 'Access-Control-Allow-Origin': '*',6 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',7};89async 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}`);1415 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}2728serve(async (req) => {29 if (req.method === 'OPTIONS') return new Response('ok', { headers: corsHeaders });3031 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';3637 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 }5354 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 }6162 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 }6768 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.
Build the meeting scheduler UI and store meeting data
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.
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.
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.
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.
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
Zoom has a richer REST API with more granular meeting settings and participant controls, plus broader adoption meaning most attendees already have the Zoom client installed.
Google Meet generates meeting links through Calendar API, making it a better fit if your app is already integrated with Google Workspace and calendar-based scheduling.
GoToWebinar uses the same GoTo OAuth2 API but is purpose-built for large one-to-many webinar presentations with registration forms and post-event analytics.
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.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation