Connect Bubble to GoToWebinar using OAuth 2.0 Authorization Code flow — the only available auth method. Build a Bubble callback page that captures the OAuth code, exchanges it for tokens via API Connector, and stores the access_token, refresh_token, and organizer_key in the user's database record. A scheduled Backend Workflow refreshes the token every 50 minutes before the 1-hour expiry. The key output builders care about: registrant POST returns a joinUrl you can display or email to attendees.
| Fact | Value |
|---|---|
| Tool | GoToWebinar |
| Category | Communication |
| Method | Bubble API Connector |
| Difficulty | Advanced |
| Time required | 2 hours |
| Last updated | July 2026 |
Building a Webinar Registration Portal in Bubble
GoToWebinar is a popular platform for marketing webinars, training sessions, and product demos. The most common Bubble use-case is a custom registration portal: a branded Bubble page where visitors enter their information, Bubble calls GoToWebinar's API to register them, and GoToWebinar returns a personal joinUrl that Bubble can display or email to the registrant.
This sounds straightforward until you hit the authentication wall. GoToWebinar uses OAuth 2.0 Authorization Code flow — there is no admin API key or static credential you can paste into a header. Instead, the GoToWebinar account owner (the organizer) must go through a browser-based authorization flow, granting your Bubble app permission to act on their behalf. Once authorized, your app receives tokens it can use for API calls.
The organizer_key is the piece most developers miss. When the token exchange completes, the response includes not just the access_token and refresh_token, but also an organizer_key — a numeric ID that must be included in the URL path for every GoToWebinar API endpoint. Forgetting to store and use this key breaks every subsequent API call.
Token management is the ongoing operational concern. Access tokens expire after 3,600 seconds (one hour). If the token expires mid-session, all API calls return 401. The solution is a Backend Workflow scheduled to run every 50 minutes that checks the stored expiry timestamp and fetches a new token using the refresh_token. This scheduled workflow requires Bubble's paid plan (Starter $32/month or higher).
GoToWebinar itself requires a paid plan starting at $49/host/month (Lite). There is no free tier with API access. Make sure the GoToWebinar account owner has an active paid subscription before starting this integration.
Integration method
Full OAuth 2.0 Authorization Code flow: Bubble callback page exchanges the code for tokens, stores them in the User record, and a scheduled Backend Workflow refreshes them every 50 minutes.
Prerequisites
- A GoToWebinar account with an active paid plan (Lite from $49/host/month — no free tier with API access)
- A GoTo Developer Center account at developer.goto.com — create an OAuth application to get client_id and client_secret
- A Bubble app with a dedicated OAuth callback page (e.g., /oauth-callback) created in the page editor
- The API Connector plugin by Bubble installed (Plugins tab → Add plugins → search 'API Connector')
- A Bubble app on Starter plan ($32/month) or higher — required for the scheduled token refresh Backend Workflow
- Three additional fields added to Bubble's built-in User data type: access_token (text), refresh_token (text), organizer_key (text), token_expiry (date)
Step-by-step guide
Create Your GoTo Developer Application
Navigate to developer.goto.com and sign in with your GoToWebinar account. Click 'My Apps' in the top navigation, then click 'Create an app'. Fill in the application name (e.g., 'My Bubble App'), a description, and select the product 'GoToWebinar' from the available products list. The most critical field here is the Redirect URI — this must be set to your Bubble callback page URL. Use the format: https://yourapp.bubbleapps.io/oauth-callback (or your custom domain if configured). If you have not yet created the callback page in Bubble, create a new page called 'oauth-callback' now, then come back and enter this URL. The redirect URI must match EXACTLY — including whether or not there is a trailing slash — what your Bubble app will send during the OAuth flow. After saving the app, copy the Client ID and Client Secret. Store the Client Secret securely — you will put it in your Bubble API Connector marked as Private. Also note that the Authorization URL for GoToWebinar is: https://authentication.logmeininc.com/oauth/authorize And the Token URL is: https://oauth.getgo.com/oauth/v2/token Before testing, confirm that your GoToWebinar account has the correct permissions. If the account is a plain user account rather than an organizer/host account, webinar creation and management calls will fail with permission errors. The integration works with any GoToWebinar paid plan where the account has organizer rights.
Pro tip: Create a test GoToWebinar account (using a secondary email) and a test Bubble app for development. This way you can run the full OAuth flow and test API calls without affecting your production GoToWebinar schedule or your live Bubble app users.
Expected result: Your GoTo Developer application has a Client ID, Client Secret, and a Redirect URI set to your Bubble callback page URL. The app shows 'GoToWebinar' as a selected product.
Set Up the OAuth API Connector Calls in Bubble
Open your Bubble app editor and click the Plugins tab. Install the API Connector plugin if not already present. Click 'API Connector' to open the configuration panel. Click 'Add another API' and name this group 'GoToWebinar OAuth'. Do not add any shared headers to this group — authorization varies by call. Add your first call named 'Exchange Code for Token'. Set method to POST and URL to https://oauth.getgo.com/oauth/v2/token. Set 'Use as' to 'Action'. For the body parameters, add: - grant_type: 'authorization_code' (static text) - code: '[code]' (dynamic — the code that arrives in the callback page URL) - client_id: your actual client_id (static — not secret, but you can also make it dynamic) - client_secret: '[client_secret]' (dynamic, mark as Private — or put your actual secret here and mark the field Private) - redirect_uri: 'https://yourapp.bubbleapps.io/oauth-callback' (static, must match exactly what is registered) Add a second call named 'Refresh Token'. Method POST, same URL, body: - grant_type: 'refresh_token' (static) - refresh_token: '[refresh_token]' (dynamic, mark Private) - client_id: your client_id - client_secret: '[client_secret]' (dynamic, Private) For the Initialize call on 'Exchange Code for Token': you need a real OAuth code, which you can only get by completing an actual OAuth flow. Skip initialization for now — we will complete it after building the callback page. This means Bubble will not have auto-detected response fields yet, but you can manually define them by adding the expected fields (access_token, refresh_token, token_type, expires_in, organizer_key) as text parameters in the response detection area.
1{2 "call_name": "Exchange Code for Token",3 "method": "POST",4 "url": "https://oauth.getgo.com/oauth/v2/token",5 "body": {6 "grant_type": "authorization_code",7 "code": "<code -- dynamic>",8 "client_id": "<your_client_id>",9 "client_secret": "<your_client_secret -- PRIVATE>",10 "redirect_uri": "https://yourapp.bubbleapps.io/oauth-callback"11 }12}Pro tip: After the Initialize call completes successfully (in a later step), verify that 'organizer_key' appears in the detected response fields. This key is critical for all subsequent API calls. If it does not appear, manually add it as a detected field in the API Connector response configuration.
Expected result: Two API calls exist in the GoToWebinar OAuth group: 'Exchange Code for Token' and 'Refresh Token'. Both have the correct method, URL, and body parameters. The client_secret is marked Private.
Build the Authorization Button and Callback Page Workflow
Now build the two Bubble UI elements that drive the OAuth flow: an authorization button on your settings page, and a workflow on the callback page that processes the code. For the authorization button: create a button labeled 'Connect GoToWebinar Account' on your admin or settings page. In its workflow, add the action 'Go to external website' (or 'Open an external website in a new tab'). Set the URL to the following constructed string — you must build this as a Bubble dynamic expression: https://authentication.logmeininc.com/oauth/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=https://yourapp.bubbleapps.io/oauth-callback Replace YOUR_CLIENT_ID with your actual client ID. You can store this as an app-level text option or hardcode it in the URL expression (the client_id is not secret). For the callback page: in your Bubble editor, open the 'oauth-callback' page. Add a Page Loaded workflow (from the Workflow tab, add an Event → 'Page is loaded'). In this workflow: Step 1: Call the 'Exchange Code for Token' API action. For the 'code' parameter, use the expression: 'Get data from page URL → key: code'. This reads the ?code= value that GoToWebinar appends to your callback URL. Step 2: Save the results to the current user's fields. Add a 'Make changes to current user' action. Set: - access_token = Result of Step 1's access_token - refresh_token = Result of Step 1's refresh_token - organizer_key = Result of Step 1's organizer_key - token_expiry = Current date/time + 3550 seconds (just under 1 hour as a safety buffer) Step 3: Navigate the user back to your main admin page. To test this: click the 'Connect GoToWebinar Account' button in your Bubble app preview, complete the GoToWebinar login, and confirm you land back on your Bubble callback page. Then check your User record in Bubble's Data tab — all four fields should be populated. If the exchange fails, check that the redirect_uri in the API call body exactly matches what is registered in the GoTo Developer portal (trailing slash matters).
Pro tip: RapidDev has built this OAuth callback pattern for GoToWebinar, Zoom, and several other platforms in Bubble. The most common failure point is a redirect_uri mismatch — if the GoTo portal has 'https://yourapp.bubbleapps.io/oauth-callback' but you send 'https://yourapp.bubbleapps.io/oauth-callback/' (trailing slash), it fails with a generic error. Check for this first if the code exchange returns an error. For help with the full OAuth setup, reach out at rapidevelopers.com/contact.
Expected result: Clicking the authorization button opens the GoTo login page. After authorizing, you land on the Bubble callback page and are redirected to the admin panel. The current user's access_token, refresh_token, organizer_key, and token_expiry fields are populated in Bubble's Data tab.
Add GoToWebinar API Calls for Webinars and Registrants
Now add the functional API calls that your app will use. Add a second API group named 'GoToWebinar API'. Add a shared header: Authorization: Bearer [access_token] — mark as 'Private' and set as Dynamic. This token value will come from the current user's access_token field at runtime. Add the following calls: Call 1 — List Webinars: method GET, URL https://api.getgo.com/G2W/rest/v2/organizers/[organizer_key]/webinars, 'Use as' Data. The [organizer_key] parameter is dynamic. Call 2 — Register Attendee: method POST, URL https://api.getgo.com/G2W/rest/v2/organizers/[organizer_key]/webinars/[webinarKey]/registrants, 'Use as' Action. Body: { 'firstName': '[first_name]', 'lastName': '[last_name]', 'email': '[email]' }. The response includes 'joinUrl' — the most important field to detect. Call 3 — Create Webinar (optional, for organizer dashboards): method POST, URL https://api.getgo.com/G2W/rest/v2/organizers/[organizer_key]/webinars, 'Use as' Action. Body: { 'subject': '[title]', 'times': [{ 'startTime': '[start_iso8601]', 'endTime': '[end_iso8601]' }] }. For Initialize on each call: you need the authenticated user's real organizer_key and access_token. After completing Step 3 (OAuth flow), you will have these values. Use a test webinarKey from an existing webinar in your GoToWebinar account (visible in GoToWebinar's dashboard). For the Register Attendee call, provide real test values including a valid email address — GoToWebinar will actually attempt to send a confirmation email, so use a personal test email. The dates for Create Webinar must be in ISO 8601 UTC format with milliseconds: '2026-07-15T14:00:00.000Z'. Bubble does not produce this format natively — use a text expression with the date formatted as 'YYYY-MM-DDTHH:mm:ss.000Z'.
1{2 "api_group": "GoToWebinar API",3 "shared_headers": {4 "Authorization": "Bearer <access_token -- PRIVATE, DYNAMIC>"5 },6 "calls": [7 {8 "name": "List Webinars",9 "method": "GET",10 "url": "https://api.getgo.com/G2W/rest/v2/organizers/[organizer_key]/webinars",11 "use_as": "Data"12 },13 {14 "name": "Register Attendee",15 "method": "POST",16 "url": "https://api.getgo.com/G2W/rest/v2/organizers/[organizer_key]/webinars/[webinarKey]/registrants",17 "use_as": "Action",18 "body": {19 "firstName": "<first_name -- dynamic>",20 "lastName": "<last_name -- dynamic>",21 "email": "<email -- dynamic>"22 }23 }24 ]25}Pro tip: The Register Attendee response contains 'joinUrl' — save this to your Registrant record immediately after the API call succeeds. This URL is unique per registrant and expires after the webinar ends. Display it in a confirmation message and send it in your confirmation email workflow.
Expected result: The GoToWebinar API group has at least two initialized calls: List Webinars (returning an array of upcoming webinars with their webinarKey values) and Register Attendee (returning a joinUrl). The Initialize calls completed successfully using the real access_token and organizer_key from the OAuth flow.
Build the Scheduled Token Refresh Backend Workflow
GoToWebinar access tokens expire every hour. Without a refresh mechanism, any user who authorized the integration more than an hour ago will start seeing 401 Unauthorized errors on all API calls. The solution is a scheduled Backend Workflow that runs every 50 minutes (a 10-minute safety buffer) and refreshes tokens for all users whose token_expiry is approaching. First, ensure your app is on Bubble's Starter plan ($32/month or higher) and that Backend Workflows are enabled: Settings → API → toggle 'This app exposes a Workflow API'. Navigate to Backend Workflows in the left panel. Click 'New API workflow' and name it 'refresh-goto-tokens'. Set the workflow to accept no external parameters (it will be triggered on a schedule, not from an external call). Inside the workflow, add these steps: Step 1: Search for Users where token_expiry is less than 'Current date/time + 10 minutes' AND access_token is not empty. This finds all users whose tokens will expire within 10 minutes. Step 2: For each user in the result list (use 'Schedule API workflow for a list' targeting 'refresh-single-user' — a second Backend Workflow you create next), pass the user's refresh_token. Create a second Backend Workflow named 'refresh-single-user' that takes a refresh_token parameter. In this workflow, call the 'Refresh Token' API action with the provided refresh_token and client_secret. Then update the User record: set access_token to the new result, refresh_token to the new refresh_token (GoToWebinar may rotate it), and update token_expiry to Current date/time + 3550 seconds. Finally, schedule 'refresh-goto-tokens' to run every 50 minutes using Bubble's 'Schedule a recurring event' feature. In a Backend Workflow, add action 'Schedule a recurring event' → select 'refresh-goto-tokens' → set frequency to every 50 minutes starting from Current date/time. Trigger this once when you deploy to set the recurring schedule in motion.
Pro tip: After setting up the recurring schedule, verify it is running by checking Backend Workflow logs in Bubble's Logs tab 50 minutes after activation. You should see 'refresh-goto-tokens' in the logs. If the refresh call fails with a 400 error, the refresh_token may have been invalidated — the user will need to re-authorize through the OAuth flow.
Expected result: Two Backend Workflows exist: 'refresh-goto-tokens' (bulk, scheduled every 50 minutes) and 'refresh-single-user' (per-user refresh). The Logs tab shows successful runs of the refresh workflow with updated token_expiry timestamps in user records.
Build the Registration Form and Test End-to-End
With all the pieces in place, build the user-facing registration form and test the complete flow. Create a page with a registration form — at minimum, fields for first name, last name, and email. Add a dropdown or static display of available webinars (use the List Webinars API call, display each webinar's subject and startTime in a Repeating Group or Dropdown, store the selected webinarKey). On the Submit button workflow: Step 1: Call 'Register Attendee' with the current user's organizer_key (from their User record), the selected webinarKey, and the form input values for firstName, lastName, and email. Step 2: Create a new Registrant record in Bubble's database storing the firstName, lastName, email, webinarKey, and joinUrl (from Step 1's result). Step 3: Show an alert or navigate to a confirmation page displaying the joinUrl. Step 4 (optional): Trigger an email workflow to send the joinUrl to the registrant's email. Test with a real email address on a real GoToWebinar session. Log in to your GoToWebinar organizer account and check the webinar's registrant list — the test registrant should appear there. Click the joinUrl returned by Bubble to confirm it loads the GoToWebinar waiting room correctly. For debugging, open Bubble's Logs tab and look for the Register Attendee API call. A successful call shows the full response including joinUrl. A 400 error usually means a malformed request body (check that firstName/lastName/email all have values). A 401 means the access_token has expired — check token_expiry against current time.
Pro tip: Webinar times from GoToWebinar's List Webinars call are returned in ISO 8601 UTC. Display them in the user's local timezone by using Bubble's date formatting with 'user's timezone' context, so registrants see the webinar time in their own timezone — a common UX issue with webinar registration portals.
Expected result: Submitting the registration form calls the GoToWebinar API, creates a Registrant record with the joinUrl, and the registrant appears in the GoToWebinar organizer dashboard. The joinUrl opens the correct webinar waiting room.
Common use cases
Custom Branded Webinar Registration Page
Replace GoToWebinar's default registration page with a branded Bubble page that matches your company's design. Visitors enter their name and email, Bubble calls the GoToWebinar registrant API, and the returned joinUrl is stored in the Registrant record and sent in a confirmation email. The registration form can include custom qualifying questions not available in GoToWebinar's default form.
When a user submits the webinar registration form with their name, email, and company, call the GoToWebinar API Connector 'Register Attendee' action with the stored organizer_key and webinarKey, then save the returned joinUrl to the Registrant record and trigger a confirmation email workflow.
Copy this prompt to try it in Bubble
Automated Webinar Creation from Bubble CMS
Allow marketing team members to schedule new GoToWebinar sessions directly from a Bubble admin panel. When a team member creates a webinar record in Bubble with a title, date, and description, a workflow calls GoToWebinar's POST /webinars endpoint to create the session, then stores the returned webinarKey for future registrant management.
When the admin clicks 'Create Webinar', take the Title, Start Time (formatted as ISO 8601 UTC), End Time, and Description from the form inputs, call the GoToWebinar Create Webinar API action with the stored organizer_key, and save the returned webinarKey to the Webinar record.
Copy this prompt to try it in Bubble
Webinar Attendee Report Dashboard
Build a Bubble dashboard that shows which registrants actually attended each webinar. After a webinar ends, fetch the attendee list from GoToWebinar's API and sync it to your Bubble database — marking each Registrant record as Attended or No-Show. This data can drive email follow-up campaigns or CRM updates.
Schedule a daily Backend Workflow that calls GoToWebinar GET /webinars/{webinarKey}/attendees for each completed webinar in the Bubble database, then updates each matching Registrant record's attended_status field based on whether their email appears in the attendee list.
Copy this prompt to try it in Bubble
Troubleshooting
OAuth callback returns 'redirect_uri_mismatch' error
Cause: The redirect_uri in your API Connector call body does not exactly match the URI registered in the GoTo Developer portal. This includes any difference in trailing slash, http vs https, or URL path.
Solution: In the GoTo Developer portal, check your app's redirect URI under 'OAuth Settings'. Copy it exactly, character by character, and paste it into your Bubble 'Exchange Code for Token' call's redirect_uri parameter. The most common differences are a trailing slash (e.g., /oauth-callback vs /oauth-callback/) or using http instead of https. Even a single character difference causes this error with no additional detail in the error message.
All API calls return 401 Unauthorized after working initially
Cause: The access_token has expired (GoToWebinar tokens expire after 3,600 seconds) and the token refresh workflow has not run yet or failed.
Solution: Check the user's token_expiry field in Bubble's Data tab. If it is in the past, the token has expired. Manually trigger the 'refresh-goto-tokens' Backend Workflow from your Bubble editor to force a refresh. If the refresh fails with a 400 error, the refresh_token may have been invalidated — have the user click 'Connect GoToWebinar Account' again to re-authorize. After the re-auth, the new tokens will be stored and the scheduled refresh will maintain them going forward.
API calls return 404 on organizer endpoints even with valid token
Cause: The organizer_key stored in the User record is missing, incorrectly stored, or not being passed in the API call URL.
Solution: Check the User record in Bubble's Data tab — confirm the organizer_key field has a value (it is a numeric string). If empty, the user needs to re-authorize: the organizer_key comes from the token exchange response. In your callback page workflow, verify that 'Result of Step 1's organizer_key' is being saved to the User's organizer_key field. In API calls, confirm the [organizer_key] dynamic parameter is bound to 'Current User's organizer_key' or the relevant User record's organizer_key.
Create Webinar returns 400 Bad Request with 'Invalid time format'
Cause: The startTime or endTime values are not in the correct ISO 8601 UTC format with milliseconds, or are in local timezone format without UTC offset.
Solution: GoToWebinar requires times in the format: '2026-07-15T14:00:00.000Z' — note the milliseconds (.000) and the UTC 'Z' suffix. In Bubble, format a date field as 'YYYY-MM-DDTHH:mm:ss' and append '.000Z' using a text expression: 'Webinar start date:formatted as YYYY-MM-DDTHH:mm:ss' + '.000Z'. Ensure the stored date is in UTC — if users enter local time, convert to UTC by subtracting the timezone offset before saving.
Initialize call on GoToWebinar API calls fails with 'There was an issue setting up your call'
Cause: The access_token used for initialization has expired, or the organizer_key or webinarKey used for initialization is invalid.
Solution: First complete the OAuth flow (Steps 2-3) to get a fresh access_token. Copy this token from your User record in Bubble's Data tab and use it temporarily as the Authorization header value for the Initialize call. Also use a real, current webinarKey from a webinar that exists in your GoToWebinar organizer account. The Initialize call needs to return a real successful response to detect the response shape — placeholder values will cause it to fail.
Best practices
- Store the organizer_key alongside tokens in the User record from the moment the OAuth flow completes. Every GoToWebinar API endpoint URL includes the organizer_key — missing this key breaks all calls and it can only be retrieved by re-running the OAuth token exchange.
- Set token_expiry to 3550 seconds (slightly under 1 hour) from the current time when storing or refreshing tokens. This 10-minute buffer prevents edge cases where a token is used milliseconds before its actual expiry, which can cause unexpected 401 errors.
- Set privacy rules on any Bubble data type storing tokens (access_token, refresh_token) in Data → Privacy. These fields should only be readable by the owning user and backend workflows — not visible to all logged-in users or the public.
- For the registration form, always show webinars from the List Webinars call rather than hardcoding webinarKey values. GoToWebinar keys change when webinars are deleted and recreated. Fetching the list dynamically prevents broken registrations when organizers modify their webinar schedule.
- Always save the joinUrl returned by the Register Attendee call to a persistent Bubble data field immediately. Do not rely on re-fetching it from GoToWebinar — the registrant list endpoint returns different data than the individual registration endpoint, and joinUrls can be harder to retrieve after the fact.
- Use Bubble's Logs tab to monitor Backend Workflow runs for the token refresh. Set a calendar reminder to check the logs periodically in the first week after launch — a failed refresh that goes unnoticed results in all users experiencing 401 errors until they re-authorize.
- Test the registration flow with GoToWebinar's own confirmation email system. GoToWebinar sends its own confirmation email to each new registrant by default. If you are also sending a Bubble-triggered confirmation email, the registrant may receive duplicate emails. Check GoToWebinar's webinar settings to disable the default confirmation if you prefer to control the email from Bubble.
- If supporting multiple GoToWebinar organizers (multi-tenant), store the tokens per-user record rather than as app-level settings. Each organizer's tokens and organizer_key are separate — mixing them causes API calls to fail with permission errors when the organizer_key does not match the authenticated token.
Alternatives
Zoom has a Bubble plugin (Zeroqode) that handles OAuth and meeting creation without manual token management. Zoom is more widely used for external meetings. GoToWebinar is better for large-scale marketing webinars with registration portals, but requires significantly more setup time in Bubble.
Webex meetings use a permanent Bot token with no OAuth flow or token refresh needed — far simpler to set up than GoToWebinar. However, Webex is primarily an enterprise messaging and meetings platform, not a purpose-built marketing webinar tool with registration portals.
Webex Events is purpose-built for virtual event and conference registration — closer in scope to GoToWebinar. GoToWebinar has stronger brand recognition in the B2B marketing segment, but Webex Events may be preferable for organizations already in the Cisco ecosystem.
Frequently asked questions
Does GoToWebinar have a free plan with API access?
No. GoToWebinar requires a paid plan starting at Lite ($49/host/month) for API access. The API is not available on any free tier. Additionally, the Bubble integration requires at least Starter plan ($32/month) for the scheduled token refresh Backend Workflow. Factor both costs into your project budget.
What happens if the GoToWebinar access token expires before the refresh runs?
All GoToWebinar API calls made with an expired token return 401 Unauthorized. The user will need to either wait for the next scheduled refresh cycle or re-authorize through the OAuth flow. To prevent this, set the token_expiry to 3550 seconds (under 1 hour) and schedule the refresh every 50 minutes. If the refresh itself fails (e.g., the refresh_token was invalidated), have the user click your 'Connect GoToWebinar Account' button again to re-authorize.
Can I register attendees for other organizers' webinars, or only my own?
Only webinars owned by the authorizing account. The organizer_key returned in the token exchange is specific to the GoToWebinar account that went through the OAuth flow. Your API calls can only manage webinars and registrants for that account. If you need to support multiple organizers, each organizer must authorize your Bubble app separately, and you store separate tokens and organizer_keys per user.
How do I get the joinUrl for a registrant I already registered?
The joinUrl is returned in the Register Attendee response body at the time of registration. If you did not save it then, you can retrieve it by calling GET /organizers/{organizerKey}/webinars/{webinarKey}/registrants/{registrantKey}. The registrantKey is also returned in the registration response. This is why saving both the joinUrl and registrantKey to your Bubble database at registration time is strongly recommended — re-fetching them later requires additional API calls.
Why do I need to store the organizer_key separately? Can I use my GoToWebinar account ID instead?
The organizer_key is different from your GoToWebinar account email or numeric account ID. It is a specific key returned by the GoTo OAuth token exchange in the access token response JSON. Every GoToWebinar REST API endpoint uses /organizers/{organizerKey}/ in the URL path — without the correct organizer_key, all API calls return 404. There is no way to derive the organizer_key from your account email or login credentials.
Can I build the registration flow without requiring users to log in to my Bubble app?
Yes — the registration form itself does not require the registrant to be a logged-in Bubble user. The OAuth flow (connecting GoToWebinar) only needs to be done once by the organizer (you or your admin). After that, registration form submissions can call the GoToWebinar API using the stored organizer access_token from a backend workflow. The registrant fills in their name and email on a public Bubble page, submits, and your Backend Workflow handles the API call using the organizer's stored credentials.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation