Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Meetup

Meetup's API is GraphQL — one endpoint (https://api.meetup.com/gql), every request a POST with a query string in the body. In Bubble's API Connector you configure a single call with POST method and a dynamic query variable. GraphQL errors arrive as 200 OK with an errors array rather than HTTP error codes, so a Toolbox plugin JavaScript step must flatten the deeply nested response and check for errors before binding data to your Repeating Group.

What you'll learn

  • How to configure a single API Connector call that handles all Meetup GraphQL queries via a dynamic query variable
  • How Meetup's GraphQL error model works (200 OK with errors array) and how to catch errors in Bubble workflows
  • How to use the Toolbox plugin's Run JavaScript action to flatten deeply nested GraphQL response data
  • How to build an event discovery Repeating Group that reads from flattened Meetup data in Bubble custom state
  • How to create a separate API Connector call for GraphQL mutations (RSVP creation)
  • How to cache the flattened event list and refresh it with a manual Refresh button rather than continuous polling
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate19 min read2–4 hoursSocialLast updated July 2026RapidDev Engineering Team
TL;DR

Meetup's API is GraphQL — one endpoint (https://api.meetup.com/gql), every request a POST with a query string in the body. In Bubble's API Connector you configure a single call with POST method and a dynamic query variable. GraphQL errors arrive as 200 OK with an errors array rather than HTTP error codes, so a Toolbox plugin JavaScript step must flatten the deeply nested response and check for errors before binding data to your Repeating Group.

Quick facts about this guide
FactValue
ToolMeetup
CategorySocial
MethodBubble API Connector
DifficultyIntermediate
Time required2–4 hours
Last updatedJuly 2026

Building a Meetup Event Companion App in Bubble

Meetup powers thousands of professional and hobby communities worldwide. Developer relations teams, tech community organizers, and professional networks use Meetup to run recurring in-person and virtual events. The Bubble use-case is a companion app: a branded event discovery and RSVP portal where community members can browse upcoming events, see venue and RSVP details, and join events — all within a Bubble front-end instead of the default Meetup.com interface.

The first thing that surprises REST-trained Bubble developers about Meetup's API is that it uses GraphQL. Unlike REST APIs with multiple endpoints for different resources, Meetup has exactly one endpoint: https://api.meetup.com/gql. Every operation — reading events, fetching member data, creating RSVPs — is a POST request to this URL with a GraphQL query or mutation string in the JSON body. In Bubble's API Connector, this means you configure one or two calls (one for read queries, one for write mutations) and use a dynamic variable to change the query string per workflow.

The second surprise is how GraphQL handles errors. Unlike REST, where a failed request returns a 4xx or 5xx HTTP status code, GraphQL always returns 200 OK — even when something went wrong. Failed queries arrive with a top-level errors array in the JSON body alongside whatever partial data was returned. Bubble's API Connector evaluates success based on HTTP status only, so it will not automatically surface GraphQL errors. You need a Toolbox plugin JavaScript step that checks the errors array after each call.

The third challenge is the response structure. Meetup's event query response is deeply nested: the events you want to display live at data.groupByUrlname.events.edges[0].node.title, data.groupByUrlname.events.edges[0].node.dateTime, and so on through four levels of nesting. Bubble's Repeating Group cannot natively bind to an array this deep. The Toolbox plugin's 'Run JavaScript' action extracts and flattens this array into a simpler format that Bubble can work with directly.

Authentication is OAuth 2.0 with a Bearer token obtained from your Meetup OAuth app registration. Organizer-level OAuth tokens unlock RSVP lists and member attendance data; plain member tokens give limited event data. For a full-featured community app, register with an organizer account.

Integration method

Bubble API Connector

Single POST endpoint https://api.meetup.com/gql with OAuth 2.0 Bearer token in a Private header; GraphQL query string in the JSON body; Toolbox plugin flattens the nested response.

Prerequisites

  • A Meetup account (organizer account recommended for full RSVP and member data access)
  • A registered Meetup OAuth application from meetup.com/api/oauth/list
  • OAuth 2.0 Bearer token from completing the Meetup OAuth authorization flow
  • Toolbox plugin installed in your Bubble app (Plugins → Add plugins → search 'Toolbox')
  • API Connector plugin installed in your Bubble app (Plugins → Add plugins → search 'API Connector' by Bubble)

Step-by-step guide

1

Register a Meetup OAuth App and Get Your Bearer Token

Go to meetup.com/api/oauth/list while logged into your Meetup organizer account. Click 'Register a new consumer' (or 'Create new OAuth consumer' depending on the current UI). Fill in the application name, description, and a redirect URI. For initial testing you can use a localhost URL (e.g., http://localhost:8888/callback) — you will replace this with your Bubble app URL later. Note your OAuth consumer key and consumer secret. To complete the OAuth flow and get an access token, you need to go through Meetup's authorization code flow: 1. Direct a browser to: https://secure.meetup.com/oauth2/authorize?client_id=[YOUR_CONSUMER_KEY]&response_type=code&redirect_uri=[YOUR_REDIRECT_URI] 2. Authorize the application in the Meetup OAuth dialog. 3. Exchange the returned code for an access token by making a POST to https://secure.meetup.com/oauth2/access?client_id=[KEY]&client_secret=[SECRET]&grant_type=authorization_code&redirect_uri=[URI]&code=[CODE]. The response includes access_token, refresh_token, and token_type=bearer. Store the access_token — this is the Bearer token for your API Connector configuration. For an organizer account, ensure the OAuth authorization dialog shows scopes that include ageless (for long-lived tokens) and event_management if you need to create or manage events. A plain member token will only show limited event data in the API responses. Note: Meetup's access token lifespan and refresh requirements vary — check the current documentation at meetup.com/meetup_api for your specific token type's expiry.

meetup_oauth_flow.txt
1// OAuth authorization URL
2https://secure.meetup.com/oauth2/authorize
3 ?client_id=<your_consumer_key>
4 &response_type=code
5 &redirect_uri=<your_redirect_uri>
6
7// Token exchange (POST)
8POST https://secure.meetup.com/oauth2/access
9Content-Type: application/x-www-form-urlencoded
10
11client_id=<consumer_key>
12&client_secret=<consumer_secret_private>
13&grant_type=authorization_code
14&redirect_uri=<your_redirect_uri>
15&code=<authorization_code>
16
17// Response
18{
19 "access_token": "abc123...",
20 "token_type": "bearer",
21 "expires_in": null
22}

Pro tip: Register your Meetup OAuth app with your organizer account, not a member account. Organizer-scoped tokens unlock the RSVP list endpoint and member attendance data. A member token returns only basic event listings and will not support RSVP management features.

Expected result: You have a valid Meetup Bearer access token. You can confirm it works by visiting https://api.meetup.com/gql in a browser (GET) — it will return a schema introspection response confirming the endpoint is reachable.

2

Configure the API Connector GraphQL Call

Meetup's single GraphQL endpoint requires a specific configuration in Bubble's API Connector that differs from REST API setup. Go to Plugins → API Connector → Add another API. Name it 'Meetup GraphQL'. Set one shared header: - Key: Authorization - Value: Bearer [paste your access token] - Check the 'Private' checkbox Now add a call. Name it 'Query'. Set: - Method: POST - URL: https://api.meetup.com/gql - Body type: JSON In the body section, add the JSON body structure. Use a dynamic variable named 'query' so different GraphQL strings can be passed from workflows: Click 'Add parameter' and set Key: query, Value: [dynamic], mark as a Body parameter. Click 'Add parameter' again: Key: variables, Value: {}, mark as Body parameter (static JSON object). For the Initialize call, you need to send a real GraphQL query string. Enter a test query for your Meetup group in the query parameter field: { groupByUrlname(urlname: \"YOUR-GROUP-URLNAME\") { id name events(input: {first: 10}) { edges { node { id title dateTime description venue { name city } going } } } } } Replace YOUR-GROUP-URLNAME with your actual Meetup group's URL name (the part after meetup.com/ in your group's URL). Click Initialize call. Bubble will hit the live endpoint and detect the response fields. If initialization succeeds, you will see the nested field structure detected. If it returns 'There was an issue setting up your call', check that your Bearer token is valid and the group URL name is correct.

meetup_graphql_connector.json
1{
2 "method": "POST",
3 "url": "https://api.meetup.com/gql",
4 "headers": {
5 "Authorization": "Bearer <your_token_private>",
6 "Content-Type": "application/json"
7 },
8 "body": {
9 "query": "<dynamic_graphql_query_string>",
10 "variables": {}
11 }
12}
13
14// Example events query string:
15"{ groupByUrlname(urlname: \"YOUR-GROUP-URLNAME\") { id name events(input: {first: 10}) { edges { node { id title dateTime description venue { name city } going } } } } }"

Pro tip: Add 'Content-Type: application/json' as a second shared header in the API Connector. Meetup's GraphQL endpoint requires this alongside the Authorization header — without it, the server may return a 400 Bad Request on POST calls.

Expected result: The API Connector shows detected fields from Meetup's GraphQL response including nested fields like data.groupByUrlname.events.edges. The Initialize call completed without errors.

3

Use Toolbox Plugin to Flatten the Nested Response

Meetup's GraphQL response nests event data four levels deep: data → groupByUrlname → events → edges → [] → node → (title, dateTime, etc.). Bubble's Repeating Group cannot directly bind to an array this deep in the response structure. You need to flatten it first using the Toolbox plugin's 'Run JavaScript' action. Ensure the Toolbox plugin is installed (Plugins → Add plugins → search 'Toolbox'). In your page's workflow, after calling the Meetup GraphQL API Connector, add the step: Toolbox → Run JavaScript. In the JavaScript code field, write the flattening function: The JavaScript receives the API Connector response as a variable. Extract the edges array, map each edge to a flat object with the fields you need, then output the result. Bubble's Toolbox plugin surfaces the JavaScript return value as a result that can be stored in a custom state. Create a custom state on your page (or any element) of type 'text' and call it 'events_json'. After the JavaScript step, store its result in this custom state. Then add another JavaScript step that parses the JSON string back into a list that Bubble can iterate. Alternatively, use a Bubble data type (Event) as the store: in the JavaScript result handler, loop through the flattened array and use 'Create a new thing' for each event, storing id, title, date_time, venue_name, and rsvp_count in the Event data type. Clear and repopulate on each refresh to avoid duplicates (use the event's Meetup id as a deduplication key with 'Make changes to a thing' if id already exists). The database storage approach (creating Event things) is more reliable than custom state for Repeating Groups — it survives page refreshes and works with Bubble's search and filter system.

flatten_meetup_response.js
1// Toolbox Run JavaScript — flatten Meetup GraphQL response
2// In the 'Script' field of the Toolbox Run JavaScript action:
3
4var responseData = JSON.parse(properties.meetup_response);
5var edges = responseData.data.groupByUrlname.events.edges;
6
7var flatEvents = edges.map(function(edge) {
8 var node = edge.node;
9 return {
10 id: node.id,
11 title: node.title,
12 date_time: node.dateTime,
13 description: node.description ? node.description.slice(0, 300) : '',
14 venue_name: node.venue ? node.venue.name : 'Online',
15 venue_city: node.venue ? node.venue.city : '',
16 going_count: node.going || 0
17 };
18});
19
20// Check for GraphQL errors
21if (responseData.errors && responseData.errors.length > 0) {
22 bubble_fn_result({ error: responseData.errors[0].message, events: [] });
23} else {
24 bubble_fn_result({ error: '', events: JSON.stringify(flatEvents) });
25}

Pro tip: Always check responseData.errors before processing the data. GraphQL returns 200 OK even for failed queries — a missing scope, invalid group name, or rate limit shows as a 200 response with an errors array, not an HTTP error code. Without this check, your Bubble workflow will appear to succeed while silently returning empty data.

Expected result: The Toolbox JavaScript action outputs a flat array of event objects. A custom state or Bubble Event data type is populated with title, date_time, venue_name, and going_count fields ready for Repeating Group binding.

4

Build the Event Discovery Repeating Group

With flattened event data in a Bubble data type or custom state, build the UI to display upcoming Meetup events. If you stored events in a Bubble data type (recommended): add a Repeating Group to your page. Set 'Type of content' to 'Event' (your custom type). Set 'Data source' to 'Do a search for Events, sorted by date_time ascending'. Add filter elements: a date range picker that sets a conditional 'date_time is after [start date]' search constraint, and a text search on venue_name or title. Inside each Repeating Group row, add: - A text element bound to 'Current cell's Event's title' - A date/time element bound to 'Current cell's Event's date_time' formatted as a human-readable string - A text element showing 'Current cell's Event's going_count + " attending"' - A text element for venue_name - A button 'RSVP' that triggers the RSVP mutation workflow (Step 5) Add a cache freshness element: a text element showing 'Last updated: [most recent Event's Created Date]'. This tells users the data is cached, not live. Add a 'Refresh Events' button that triggers the full workflow chain: call the Meetup GraphQL API Connector → run the Toolbox flatten JavaScript → update Event records in the database. Use a 5-minute gate: only refresh if the most recent Event record's Created Date is more than 5 minutes ago, to avoid unnecessary API calls if the user clicks Refresh repeatedly. If you are using custom state instead of a data type: set the Repeating Group data source to the custom state list, and note that the state will be empty on page load until a workflow populates it. Add a 'Page is loaded' workflow that triggers the data fetch automatically.

Pro tip: Set a maximum of 10–20 events in your GraphQL query's 'first' parameter. Requesting large event lists in a single GraphQL call increases response latency and makes the Toolbox JavaScript processing slower. Implement pagination by incrementing the 'after' cursor parameter in the GraphQL query for 'Load more' functionality.

Expected result: The Repeating Group displays upcoming Meetup events with title, date/time, venue, and RSVP count. A Refresh button re-fetches data from Meetup's API. The 'last updated' timestamp shows when the data was last synced.

5

Add the RSVP Mutation Call

Read queries and write mutations in GraphQL go to the same endpoint, but they are semantically different — a mutation query changes data on Meetup's side. Configure a separate API Connector call for mutations to keep your read and write logic clearly separated. In the Meetup GraphQL API Connector, click 'Add new call'. Name it 'Mutation'. Set: - Method: POST - URL: https://api.meetup.com/gql - Body type: JSON - Body parameters: query (dynamic), variables (dynamic — for mutation variables) For the RSVP mutation, the GraphQL mutation string looks like: mutation { rsvp(input: {eventId: \"[EVENT_ID]\", rsvp: YES}) { event { id title } rsvp { response } } } Make eventId a dynamic Bubble variable so the RSVP workflow can pass the specific event's Meetup id. In Bubble's workflow editor, create a workflow triggered by the 'RSVP' button click. Add steps: 1. Show a confirmation popup ('Are you sure you want to RSVP to [event title]?'). 2. On confirmation: call the Meetup Mutation API Connector call with the current event's id as the eventId variable. 3. After the call: run a Toolbox JavaScript step to check the response for errors (same error-checking pattern as Step 3 — GraphQL returns 200 even on mutation failures). 4. Show a success or error alert based on the JavaScript check result. 5. Refresh the event data to update the going_count displayed in the row. Note: RSVP mutations require an organizer or member token with the appropriate scope. If the mutation returns an errors array with 'Not authorized', the OAuth token scope does not include RSVP write access — re-authorize with a broader scope. RapidDev's team has connected Bubble apps to GraphQL APIs including Meetup for developer relations teams — if the mutation error handling is getting complex, a free scoping call at rapidevelopers.com/contact can save hours of debugging.

meetup_rsvp_mutation.json
1// RSVP GraphQL mutation string
2"mutation { rsvp(input: {eventId: \"<dynamic_event_id>\", rsvp: YES}) { event { id title } rsvp { response } } }"
3
4// API Connector call configuration
5{
6 "method": "POST",
7 "url": "https://api.meetup.com/gql",
8 "headers": {
9 "Authorization": "Bearer <your_token_private>",
10 "Content-Type": "application/json"
11 },
12 "body": {
13 "query": "<dynamic_mutation_string>",
14 "variables": {"eventId": "<dynamic_event_id>"}
15 }
16}

Pro tip: Always add a confirmation step before executing write mutations. Meetup does not have an 'undo RSVP' quick path in the API — if a user accidentally clicks RSVP, cancelling requires a separate mutation with rsvp: NO. A simple confirmation popup prevents accidental RSVPs.

Expected result: The RSVP button triggers a confirmation popup. On confirmation, the mutation API call fires, GraphQL errors are checked, and a success message or error alert displays. The event's going_count refreshes to reflect the new RSVP.

6

Handle GraphQL Errors and Store the Group URL Name Safely

Two final reliability improvements will make your Meetup integration production-ready: robust GraphQL error handling and storing the group URL name in a Bubble option set rather than hardcoding it in query strings. For error handling: create a reusable Toolbox JavaScript function (or add to each relevant step) that parses the GraphQL response and routes to success or failure paths. GraphQL errors arrive in the format {errors: [{message: '...', locations: [...], path: [...]}]}. The most common errors you will encounter: - 'Not authorized' — OAuth token scope is insufficient for the requested operation - 'Group not found' — the urlname in the query does not match an existing Meetup group - 'Argument type mismatch' — a variable in the query is the wrong type (e.g., passing a number where a string is expected) In Bubble, after each API Connector call, add a conditional branch: if the JavaScript error-check returns a non-empty error string, show an alert with the error message and halt the workflow. If it returns empty (no errors), continue to the data-binding steps. For the group URL name: create a Bubble option set called 'MeetupConfig' with one attribute (group_urlname) and one option set value containing your group's URL name. Reference this option set in your GraphQL query string builder instead of hardcoding the URL name as a text string. This way, changing the Meetup group (e.g., rebranding the community, renaming the Meetup group) requires updating one option set value rather than finding and updating every hardcoded reference across workflows. Note: changing your Meetup group's URL name (on meetup.com) will break the query if you have hardcoded the old name. The option set approach makes this a one-field update instead of a debugging hunt.

meetup_error_check.js
1// Toolbox error checking JavaScript
2var response = JSON.parse(properties.graphql_response);
3
4if (response.errors && response.errors.length > 0) {
5 var errorMsg = response.errors.map(function(e) { return e.message; }).join(', ');
6 bubble_fn_result({ has_error: 'yes', error_message: errorMsg });
7} else if (!response.data) {
8 bubble_fn_result({ has_error: 'yes', error_message: 'Empty response from Meetup API' });
9} else {
10 bubble_fn_result({ has_error: 'no', error_message: '' });
11}

Pro tip: Add Bubble's Logs tab to your development workflow from the start. Every API Connector call shows up in Logs → API Logs with the full request body and response. This is the fastest way to see the raw GraphQL error messages from Meetup when something goes wrong.

Expected result: Every GraphQL call in your Bubble app has a downstream error check. Meetup API errors display as user-friendly alerts rather than silent failures. The group URL name is stored in a Bubble option set and referenced dynamically in queries.

Common use cases

Branded Community Event Portal

Build a custom-branded event discovery portal where community members browse upcoming Meetup events, see venue details, attendee counts, and RSVP — all within a Bubble app that reflects your community's branding rather than the generic Meetup.com interface.

Bubble Prompt

Copy this prompt to try it in Bubble

Developer Relations Event Dashboard

Create an internal dashboard for developer relations teams that aggregates events across multiple Meetup groups, shows RSVP trends, and displays attendance vs target for each scheduled event — pulled from Meetup's GraphQL API and cached in Bubble's database.

Bubble Prompt

Copy this prompt to try it in Bubble

Community Organizer Management Tool

Build an organizer tool that lets Meetup group organizers view their upcoming event schedule, see RSVP counts and waitlist size, and send announcements to RSVPs — using Meetup's GraphQL mutation API for write operations and the query API for read operations.

Bubble Prompt

Copy this prompt to try it in Bubble

Troubleshooting

The API call returns 200 OK but the Repeating Group is empty with no visible error

Cause: GraphQL errors return 200 OK with an errors array in the body — Bubble treats this as a successful call and proceeds to the data-binding step, which binds empty data. The error is silently swallowed without a Toolbox error-check step.

Solution: Add a Toolbox 'Run JavaScript' step after every Meetup API call that checks response.errors. If the array is non-empty, branch to an error display workflow. Common causes of hidden errors: invalid group URL name, expired token, or missing OAuth scope. Check the raw response in Bubble's Logs tab → API Logs to see the actual error message from Meetup.

'There was an issue setting up your call' when initializing the API Connector

Cause: The Initialize call makes a live request to Meetup's API. If the Bearer token is invalid, the group URL name is wrong, or the GraphQL query syntax has an error, the call fails and Bubble cannot detect the response structure.

Solution: Test your query in a standalone GraphQL client (such as Insomnia or the Meetup API explorer at meetup.com/meetup_api/console) first to confirm the query string and token are valid. Copy the working query string exactly into the API Connector's body parameter default value, then click Initialize. Ensure the group URL name exactly matches the path on meetup.com (case-sensitive).

RSVP mutation returns 'Not authorized' in the GraphQL errors array

Cause: The OAuth Bearer token was authorized with insufficient scope — the token can read events but not write RSVPs. This happens when the initial OAuth flow did not request the event_management or rsvp write scope.

Solution: Re-authorize your Meetup OAuth app by sending users through the authorization URL again with the correct scopes explicitly listed in the scope parameter. After re-authorization, update the Bearer token in the API Connector's Authorization header with the new access token that has the broader scope.

Event data is deeply nested in the Repeating Group data source and Bubble cannot bind to it

Cause: Bubble's Repeating Group expects a flat list of items or a Bubble data type. The raw GraphQL response has the event array nested at data.groupByUrlname.events.edges[], which Bubble cannot natively flatten for Repeating Group binding.

Solution: Add the Toolbox plugin (Plugins → Add plugins → search 'Toolbox') and use the 'Run JavaScript' action to extract and flatten the edges[].node array into a flat list. Store the flattened results in a custom state or in a Bubble data type ('Event') and bind the Repeating Group to that state or data type instead of the raw API response.

Backend Workflows for receiving Meetup webhook events are not available on my Bubble plan

Cause: Meetup's webhook/notification system requires inbound HTTP requests to a Bubble Backend Workflow endpoint. Backend Workflows (API Workflows) are not available on Bubble's free plan.

Solution: Upgrade to a paid Bubble plan (Starter $32/month or above) to enable Backend Workflows. For the event listing and RSVP use cases described in this guide, Backend Workflows are not required — only the outbound API Connector calls are used. Backend Workflows are only needed if you want Meetup to push real-time event updates to your Bubble app.

Best practices

  • Configure one API Connector call for read queries and a separate call for write mutations — both go to the same https://api.meetup.com/gql URL but keeping them separate makes it clear which workflows can modify data on Meetup's side.
  • Always check the GraphQL errors array after every Meetup API call in a Toolbox JavaScript step. Meetup returns 200 OK even for failed queries — without explicit error checking, your workflows will appear to succeed while silently binding empty data to Repeating Groups.
  • Store the Meetup group URL name in a Bubble option set, not hardcoded in query strings. Group URL names can change when communities rebrand or merge, and a single option set value is far easier to update than hunting through every workflow for hardcoded strings.
  • Mark the Authorization Bearer token header as Private in the API Connector. Bubble proxies all calls server-side, so the token never reaches the browser — but the Private checkbox provides an additional safeguard and prevents the token from appearing in Bubble's editor logs.
  • Implement a 5-minute refresh gate on your event data: only re-fetch from Meetup's API if the cached data is older than 5 minutes. Meetup's event listings change slowly, and unnecessary polls burn Bubble Workload Units without surfacing newer data.
  • Request only the GraphQL fields you will actually display. GraphQL's strength is field-level selection — don't query the full event object if you only display title, date, and venue. Smaller responses are faster to process in the Toolbox JavaScript flattening step.
  • Add a visible 'Last updated' timestamp on every screen showing Meetup data. Users should understand they are seeing cached data from Bubble's database, not a live feed from Meetup's servers.

Alternatives

Frequently asked questions

Why does Meetup use GraphQL instead of REST? Do I need to know GraphQL to use this integration?

Meetup migrated to a GraphQL API because it allows clients to request exactly the fields they need rather than receiving fixed response shapes. You do not need deep GraphQL expertise to use this integration — the key things to know are: every request is a POST to one endpoint, the body is a JSON object with a 'query' string, you can select exactly which fields to return in that string, and mutations (writes) follow the same pattern. The query strings in this guide are copy-paste ready for standard event and RSVP use cases.

Can I use this integration on Bubble's free plan?

The outbound API Connector calls (reading events, creating RSVPs) work on Bubble's free plan. However, if you want to receive inbound events from Meetup via webhooks — for example, getting notified when someone RSVPs on Meetup.com itself — that requires Backend Workflows, which are only available on paid Bubble plans (Starter $32/month or above).

The Meetup API returns all events in UTC. How do I display event times in the attendee's local timezone?

In the Toolbox JavaScript flattening step, use JavaScript's Date object to convert the UTC dateTime string to the local timezone: new Date(node.dateTime).toLocaleString('en-US', {timeZone: 'America/New_York'}) or use Intl.DateTimeFormat. Alternatively, store the UTC timestamp in Bubble and use Bubble's ':formatted as' expression with a timezone offset input element that users set themselves. For community events where attendees span timezones, displaying both the event's local timezone and UTC is the clearest approach.

My Meetup group changed its URL name. Now the integration is broken. What do I do?

If you stored the group URL name in a Bubble option set (as recommended in Step 6), update the option set value to the new URL name. If you hardcoded it in query strings, search your Bubble app's workflow list for every workflow that references the old URL name and update each one. This is why the option set approach is strongly recommended — it turns a debugging hunt into a one-field change.

What's the difference between using a member token vs an organizer token for the Meetup API?

A member token allows reading public event listings and creating RSVPs for the authenticated user. An organizer token (from an account that organizes the group) also allows reading the full RSVP list, accessing member profiles, seeing waitlist data, and making management mutations like editing events. For a read-only event discovery app, a member token is sufficient. For any admin or management functionality, use an organizer account when registering the OAuth app and authorizing.

RapidDev

Talk to an Expert

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

Book a free consultation

Integrations are where projects stall

We wire Bubble integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

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.