Garmin Connect is the most complex wearable integration for Bubble: it requires applying to Garmin's Health API partner program (1–4 week approval), an OAuth 1.0a HMAC-SHA1 signing proxy (Bubble cannot do this natively), and a Bubble Backend Workflow to receive inbound Garmin Ping webhooks. Expect Advanced difficulty, paid Bubble plan, and a Cloudflare Worker as a signing layer between Bubble and Garmin's API.
| Fact | Value |
|---|---|
| Tool | Garmin Connect |
| Category | Health & Fitness |
| Method | Bubble API Connector |
| Difficulty | Advanced |
| Time required | 4–8 hours (after partner approval) |
| Last updated | July 2026 |
Connecting Bubble to Garmin Connect: Partner API, OAuth 1.0a Signing Proxy, and Ping Webhooks
Garmin Connect is the hardest wearable API to integrate from Bubble — and understanding why helps set the right expectations before you commit engineering time. There are three layers of complexity that compound on each other.
First, access control: Garmin's Health API is not a public developer API. It requires applying to Garmin's partner program and waiting for approval, which typically takes 1–4 weeks. There is no sandbox key you can create instantly at a self-serve portal like Fitbit. Before building anything in Bubble, apply for partner access at developer.garmin.com and use the waiting period to build your app with mock data.
Second, authentication complexity: Garmin uses OAuth 1.0a with HMAC-SHA1 request signing — not the modern OAuth 2.0 that Bubble's API Connector handles naturally. OAuth 1.0a requires computing a cryptographic signature for every request, incorporating the consumer key, consumer secret, access token, token secret, timestamp, and nonce. Bubble's API Connector cannot perform HMAC-SHA1 signing natively. Any solution that claims to call Garmin directly from Bubble's API Connector is either using a plugin that runs server-side code or is simply wrong. The reliable solution is an intermediate signing proxy — a Cloudflare Worker is ideal because it is serverless, free for low traffic, and can be deployed in minutes.
Third, Garmin's push-based data model: rather than polling Garmin for new activity data, Garmin Pings your endpoint when a user's device syncs. The Ping contains a summary ID, not the actual activity data — you must then make a separate authenticated GET request to fetch the full details. This inbound webhook architecture requires a Bubble Backend Workflow endpoint (paid plan required).
Despite the complexity, the result is worthwhile for fitness apps targeting serious athletes: Garmin users tend to have more data-rich wearables (GPS watches with advanced metrics) than typical consumer fitness trackers.
Integration method
Bubble's API Connector calls a Cloudflare Worker signing proxy, which adds the OAuth 1.0a HMAC-SHA1 Authorization header that Garmin requires — a signing algorithm Bubble cannot perform natively. A separate Bubble Backend Workflow receives Garmin's inbound Ping webhooks (paid plan required for both components).
Prerequisites
- Approved Garmin Health API partner account — apply at developer.garmin.com before starting any Bubble build (expect 1–4 weeks for approval)
- A Cloudflare account (free) to deploy the OAuth 1.0a signing Worker; basic familiarity with Cloudflare Workers is helpful
- A Bubble account on a paid plan (Starter $32/month minimum) — Backend Workflows required for Garmin Ping webhooks
- Garmin consumer_key and consumer_secret from your approved partner account
- A server or database (can be Bubble itself) to store per-user Garmin OAuth access tokens and token secrets after the OAuth 1.0a user authorization flow
Step-by-step guide
Apply for Garmin Health API partner access and plan while waiting
Navigate to developer.garmin.com and find the Health API partner program application. Submit your application with your company details, use case description, and expected user volume. Garmin reviews applications manually — the approval timeline is typically 1–4 weeks, and some applications may require additional information or a brief call with Garmin's partner team. Do not wait for approval before starting your Bubble build. During the waiting period, set up Bubble's data model so you are ready to connect the moment you have credentials. Create a GarminActivity Data Type with fields: user (User), activity_id (text), activity_type (text), start_time (date), distance_meters (number), duration_seconds (number), avg_heart_rate (number), max_heart_rate (number), calories (number), raw_payload (text — store the full JSON for future field additions). Create a GarminDaily Data Type for daily summaries: user (User), summary_date (date), steps (number), stress_score (number), body_battery_high (number), sleep_score (number). Add Privacy rules to both: visible only to the associated user. Build a UI with mock data using Bubble's static data or a few manually-entered test records so you can refine the UX while waiting for credentials.
Pro tip: In your partner application, be specific about your use case and user audience. Garmin approves applications more quickly when they understand the product context. Mention the types of Garmin devices your target users own and the specific data types (activities, daily summaries, sleep) you need access to.
Expected result: Garmin partner application submitted. Bubble data types GarminActivity and GarminDaily created with Privacy rules. App UI built with mock data, ready to switch to live data after credentials arrive.
Deploy a Cloudflare Worker as an OAuth 1.0a signing proxy
OAuth 1.0a HMAC-SHA1 signing requires computing a cryptographic signature from multiple parameters including a timestamp, nonce, and sorted parameter string — a process that Bubble's API Connector cannot perform natively. A Cloudflare Worker handles this in JavaScript, runs at the network edge (low latency), and is free for up to 100,000 requests per day on Cloudflare's free tier. Create a Cloudflare account at cloudflare.com if you do not have one. Navigate to Workers & Pages → Create a Worker. In the Worker editor, write a JavaScript Worker that: (1) receives an incoming request from Bubble's API Connector with the target Garmin endpoint path, per-user access_token, and token_secret as parameters, (2) builds the OAuth 1.0a Authorization header by computing the HMAC-SHA1 signature using the consumer_key, consumer_secret, access_token, and token_secret, (3) forwards the request to the Garmin Health API base URL (https://healthapi.garmin.com/wellness-api/rest) with the computed Authorization header, (4) returns Garmin's response to Bubble. Store consumer_key and consumer_secret in the Worker's environment variables (Settings → Variables → Environment Variables), never in the Worker code itself. Deploy the Worker and note its URL (https://YOUR-WORKER-NAME.YOUR-SUBDOMAIN.workers.dev). Bubble's API Connector will call this URL, not Garmin directly. RapidDev's team has implemented OAuth 1.0a Workers for Garmin integrations — a free scoping call at rapidevelopers.com/contact can save several hours of signing proxy implementation.
1// Cloudflare Worker: OAuth 1.0a signing proxy for Garmin Health API2// Deploy at workers.cloudflare.com3// Set environment variables: CONSUMER_KEY, CONSUMER_SECRET45export default {6 async fetch(request, env) {7 const url = new URL(request.url);8 const garminPath = url.searchParams.get('path'); // e.g., /dailies9 const accessToken = url.searchParams.get('access_token');10 const tokenSecret = url.searchParams.get('token_secret');1112 const garminBase = 'https://healthapi.garmin.com/wellness-api/rest';13 const garminUrl = garminBase + garminPath + '?' + url.searchParams.toString()14 .replace(/path=[^&]*&?/, '')15 .replace(/access_token=[^&]*&?/, '')16 .replace(/token_secret=[^&]*&?/, '');1718 const timestamp = Math.floor(Date.now() / 1000).toString();19 const nonce = crypto.randomUUID().replace(/-/g, '');2021 // Build OAuth signature (simplified — use a full OAuth 1.0a library in production)22 const authHeader = `OAuth oauth_consumer_key="${env.CONSUMER_KEY}",` +23 `oauth_token="${accessToken}",` +24 `oauth_signature_method="HMAC-SHA1",` +25 `oauth_timestamp="${timestamp}",` +26 `oauth_nonce="${nonce}",` +27 `oauth_version="1.0",` +28 `oauth_signature="<computed_signature>"`;2930 const garminResponse = await fetch(garminUrl, {31 headers: { 'Authorization': authHeader }32 });3334 return new Response(await garminResponse.text(), {35 status: garminResponse.status,36 headers: { 'Content-Type': 'application/json' }37 });38 }39};Pro tip: The code above is a structural outline — computing a correct HMAC-SHA1 OAuth signature requires careful parameter encoding and sorting. Use an established OAuth 1.0a library (e.g., oauth-1.0a npm package bundled into the Worker with Wrangler) rather than writing the signing algorithm from scratch. Incorrect signature computation returns 401 errors from Garmin.
Expected result: A Cloudflare Worker is deployed at a public URL. Sending a test request to the Worker with a valid Garmin access_token and path parameter returns a successful response from the Garmin Health API (or a 401 if credentials are incorrect — which is still a successful proxy call).
Configure Bubble API Connector to call the signing proxy
With the signing proxy deployed, configure Bubble's API Connector to call the Worker URL instead of Garmin directly. In Bubble's editor, click Plugins in the left sidebar, then 'Add plugins', search for 'API Connector' and install it (by Bubble, free). Click 'Add another API' and name it 'Garmin'. Set the base URL to your Cloudflare Worker URL (https://YOUR-WORKER-NAME.workers.dev). Add a shared header: key = 'X-Proxy-Auth', value = a secret token you define that the Worker validates (to prevent unauthorized use of your proxy). Check the 'Private' checkbox on this header — it stays server-side on Bubble's infrastructure and never reaches the browser. For per-user Garmin tokens, you cannot put them in a shared header because they vary by user. Instead, pass them as URL parameters in each API call: add parameters `access_token` (dynamic, from the current user's stored token) and `token_secret` (dynamic). The Worker reads these parameters and uses them when computing the OAuth signature. Mark these parameters as Private in Bubble to keep them server-side. Add your first API call: name it 'Get Daily Summary', method GET, URL suffix `/` with a `path` parameter set to `/dailies` and a `uploadStartTimeInSeconds` date parameter. Click 'Initialize call' — Bubble will send a real request to the proxy and record the response shape. Provide real test values (a valid access_token, token_secret, and a Unix timestamp date range). After successful initialization, the call appears as a usable data source in the editor.
1{2 "api_name": "Garmin",3 "base_url": "https://YOUR-WORKER.workers.dev",4 "shared_headers": [5 { "key": "X-Proxy-Auth", "value": "YOUR_PROXY_SECRET", "private": true }6 ],7 "calls": [8 {9 "name": "Get Daily Summary",10 "method": "GET",11 "path": "/",12 "params": [13 { "key": "path", "value": "/dailies", "private": false },14 { "key": "access_token", "value": "<dynamic: Current User's garmin_access_token>", "private": true },15 { "key": "token_secret", "value": "<dynamic: Current User's garmin_token_secret>", "private": true },16 { "key": "uploadStartTimeInSeconds", "value": "<dynamic: start timestamp>", "private": false },17 { "key": "uploadEndTimeInSeconds", "value": "<dynamic: end timestamp>", "private": false }18 ]19 }20 ]21}Pro tip: If the Initialize call fails with a 401, the most likely cause is an incorrect OAuth signature in the Worker. Check the Worker logs in Cloudflare's dashboard (Workers & Pages → YOUR-WORKER → Logs) to see the exact error message from Garmin.
Expected result: The Garmin API Connector group exists in Bubble with a Private proxy auth header and a 'Get Daily Summary' call that has been successfully initialized. The call is available as a data source in Bubble's editor.
Implement the Garmin OAuth 1.0a user authorization flow
Individual Garmin users must authorize your application to access their health data via OAuth 1.0a. The authorization dance has three steps: request token → authorization URL → callback/access token exchange. This entire flow must happen in your Cloudflare Worker or a separate backend, because OAuth 1.0a token requests also require HMAC-SHA1 signing. The flow: (1) Your Bubble app redirects the user to your Worker with a 'start_auth' flag. The Worker calls Garmin's request token endpoint (https://connectapi.garmin.com/oauth-service/oauth/request_token) with signed credentials, receives a temporary oauth_token, and redirects the user to Garmin's authorization page (https://connect.garmin.com/oauthConfirm?oauth_token=TEMP_TOKEN). (2) The user logs in on Garmin.com and approves access. (3) Garmin redirects back to your callback URL (your Worker or a Bubble Backend Workflow URL) with oauth_token and oauth_verifier parameters. Your Worker or workflow exchanges these for a permanent access_token and token_secret by calling Garmin's access token endpoint. Store the returned access_token and token_secret on the Bubble User record (add fields garmin_access_token and garmin_token_secret to the User data type — mark these Private in Bubble Privacy rules). These credentials are used in every subsequent API call through the signing proxy. This is the most complex part of the Garmin integration. For production apps, test the full OAuth flow end-to-end with a personal Garmin account before enabling it for users.
Pro tip: Garmin OAuth tokens do not expire on a short cycle like Fitbit's 8-hour access tokens — once issued, Garmin access tokens remain valid until the user revokes authorization. This simplifies token management significantly compared to OAuth 2.0 integrations that require refresh token workflows.
Expected result: A user can click 'Connect Garmin' in your Bubble app, be redirected through the OAuth authorization flow, and return with a stored access_token and token_secret on their Bubble User record. The API Connector can now make signed calls using those per-user credentials.
Create Backend Workflow to receive Garmin Ping webhooks
Garmin's data model is push-based: when a user syncs their device, Garmin POSTs a Ping notification to your registered endpoint. The Ping does not contain activity data — it contains a summary ID and notification type. You must make a separate signed GET call to the Garmin API to fetch the actual data using the summary ID from the Ping. First, enable the Workflow API in Bubble: go to Settings → API → check 'Enable Workflow API' (requires paid plan). In the Backend Workflows section (Workflow tab → Backend Workflows), create a new workflow named 'receive_garmin_ping'. Add a 'Detect request data' step to learn the incoming Ping payload shape. To initialize, register your workflow URL in the Garmin partner portal and trigger a test Ping from Garmin's partner testing tools — or send a manual POST to the /initialize URL with a sample Ping payload. A sample Garmin Ping payload looks like: { 'pingType': 'DAILY_SUMMARY', 'callbackURL': 'https://healthapi.garmin.com/wellness-api/rest/dailies/...' }. After Detect request data initializes, add the following steps: (1) Use the API Connector to call your signing proxy with the callbackURL path from the Ping (this fetches the full activity or daily summary data). (2) Parse the response and Create a new GarminActivity or GarminDaily record in Bubble. Register your Backend Workflow URL (https://YOUR-APP.bubbleapps.io/api/1.1/wf/receive_garmin_ping) in the Garmin partner portal as your Ping callback URL for each notification type you subscribe to.
1// Sample Garmin Ping payload (incoming POST to your Backend Workflow)2{3 "activityDetails": [{4 "callbackURL": "https://healthapi.garmin.com/wellness-api/rest/activities/12345",5 "userId": "garmin_user_abc123",6 "userAccessToken": "user_oauth_token"7 }]8}910// After receiving the Ping, fetch the full activity with a signed GET:11// GET https://YOUR-WORKER.workers.dev/?path=/activities/12345&access_token=...&token_secret=...Pro tip: Garmin Pings are by notification type (DAILY_SUMMARY, ACTIVITY, SLEEP, etc.). Register separate callback URLs for each type in the partner portal, or use one Backend Workflow that branches on the pingType field to handle multiple types with different Data Type creation actions.
Expected result: A Backend Workflow exists that receives Garmin Pings, fetches the full activity or summary data via the signing proxy, and creates a GarminActivity or GarminDaily record in Bubble's database. The workflow URL is registered in the Garmin partner portal.
Build the activity dashboard and estimate WU costs
With data flowing into Bubble via Garmin Pings, build the display UI. Create a dashboard page with a Repeating Group bound to 'Do a search for GarminActivities where user is Current User', sorted by start_time descending. Display columns for date, activity type, distance (convert meters to km or miles with a math expression), duration (format as HH:MM:SS), and average heart rate. For trend charts, install a chart plugin (ApexCharts by Zeroqode or similar from the Plugins marketplace). Bind a line chart to a search for GarminDaily records for the past 30 days, with steps on the Y axis and summary_date on the X axis. WU cost estimation is important for Garmin integrations at scale. Each Garmin Ping triggers a Backend Workflow that runs a Bubble API Connector call (via the proxy) plus a Create Data Thing action. For a fitness app with 500 active Garmin users each syncing once daily, that is 500 Backend Workflow executions per day. Consult Bubble's WU pricing page (Settings → Usage) to estimate monthly costs at your expected user volume. Bubble's Workflow logs (Logs tab) show WU consumption per workflow run — check these during testing to calibrate your estimate.
Pro tip: Add a 'Last synced' timestamp to each GarminActivity and GarminDaily record (set to current date/time on creation). Display this on the dashboard so users can see how fresh their data is and understand that data appears only after their Garmin device syncs, not in real time.
Expected result: A Bubble dashboard page displays the current user's recent Garmin activities and daily summary trends. Chart plugins show 30-day step or activity volume trends. WU consumption per sync event has been estimated and is within acceptable plan limits.
Common use cases
Athlete performance tracking dashboard
Build a Bubble app for running coaches or triathlon teams where athletes connect their Garmin devices. When an athlete completes a workout, Garmin Pings the Bubble Backend Workflow, which fetches the activity details (distance, pace, heart rate zones, power data for cyclists) and stores them in a GarminActivity Data Thing. Coaches see an aggregated training load dashboard showing each athlete's weekly volume, average pace trends, and heart rate zone distribution.
Build a Bubble page showing a logged-in athlete's last 10 Garmin activities in a Repeating Group with columns for date, activity type, distance, duration, and average heart rate. Add a coach view that shows all athletes' weekly training load in a sortable table. Data from GarminActivity Data Type filtered by user.
Copy this prompt to try it in Bubble
Corporate wellness wearable program
For enterprise wellness programs providing Garmin devices to employees, build a Bubble dashboard that aggregates daily summary data — steps, stress scores, body battery, and sleep quality — for enrolled participants. Program administrators see team-wide activity trends and can identify employees who may benefit from wellness interventions.
Build a Bubble wellness program admin page with a Repeating Group of enrolled users showing their average daily steps this week, average sleep score, average stress level, and last sync date. Color-code rows based on activity level targets. Pull from GarminDaily Data Type filtered by date range and user.
Copy this prompt to try it in Bubble
Sleep quality analytics application
Garmin's sleep tracking is among the most detailed available, including sleep stage breakdown (light, deep, REM), respiration rate, SpO2, and stress scores during sleep. Build a Bubble app that pulls sleep data via Garmin Pings and displays trends — average sleep duration, REM percentage, and sleep consistency score — over weeks and months.
Build a Bubble page with a weekly sleep dashboard showing daily total sleep duration as a bar chart, average REM percentage, and a 30-day sleep consistency trend line. Data from GarminSleep Data Type filtered by Current User and date range. Add a date range picker to control the view window.
Copy this prompt to try it in Bubble
Troubleshooting
Garmin API returns 401 Unauthorized despite using the correct consumer_key and access_token
Cause: OAuth 1.0a HMAC-SHA1 signature computation error in the Cloudflare Worker — incorrect parameter encoding, wrong sort order, or missing required OAuth parameters in the Authorization header.
Solution: Check the Cloudflare Worker logs (Workers & Pages → YOUR-WORKER → Logs tab → Real-time Logs) to see the exact Authorization header being sent and any error detail from Garmin. Verify that the OAuth parameters are percent-encoded correctly and sorted alphabetically. Use an established OAuth 1.0a library (oauth-1.0a npm package) rather than a hand-rolled implementation. Test with a known-good Garmin API call (e.g., GET /wellness-api/rest/dailies with a real user token) using a standalone OAuth 1.0a testing tool first.
Backend Workflow does not receive Garmin Pings — no entries appear in Bubble's Logs tab
Cause: Either the Workflow API is not enabled in Bubble Settings (requires paid plan), the Backend Workflow URL is not registered in the Garmin partner portal, or the workflow was not initialized with a real payload and Garmin's Ping validation failed.
Solution: Verify: (1) Settings → API → 'Enable Workflow API' is checked (paid plan required — if missing, upgrade). (2) Your Backend Workflow URL is registered in the Garmin partner portal for the correct notification types. (3) The Backend Workflow has been initialized with at least one successful payload via the /initialize endpoint. Check the Garmin partner portal for failed Ping delivery logs — Garmin retries Pings but logs failures that can help diagnose the issue.
API Connector Initialize call fails with 'There was an issue setting up your call'
Cause: The initialization request could not complete a real successful response — either the Cloudflare Worker is returning an error, the test credentials are invalid, or the proxy URL is misconfigured in the API Connector base URL.
Solution: Test the Cloudflare Worker URL directly in your browser or Postman before initializing in Bubble. Confirm the Worker URL is correct (no trailing slash issues), the proxy auth header matches what the Worker expects, and the test access_token and token_secret are valid. Check Worker logs in Cloudflare for any JavaScript errors.
Garmin partner program application has not received a response after two weeks
Cause: Garmin's partner review process is manual and can take longer than expected, especially if the application needs clarification or if Garmin's partner team needs additional information about the use case.
Solution: Contact Garmin's developer support through the partner portal to follow up on the application status. Provide a clear description of your use case, expected user volume, and the specific data types you need. Continue building with mock data in Bubble while waiting — do not block development on partner approval.
Best practices
- Never attempt HMAC-SHA1 signing in Bubble's API Connector or Backend Workflows — always use a Cloudflare Worker or other server-side signing proxy. Incorrect signing results in persistent 401 errors that are difficult to debug inside Bubble.
- Store consumer_key and consumer_secret in Cloudflare Worker environment variables, never in the Worker code or in Bubble. Per-user access_token and token_secret belong on Bubble's User record (text fields) with Privacy rules set to user-only access.
- Apply to the Garmin Health API partner program before writing any code. The 1–4 week approval wait is the longest dependency in this project — submit the application on day one and build with mock data while waiting.
- Initialize every Bubble API Connector call with a real successful response. Without initialization, calls are not usable in the editor. Use the Garmin partner testing tools to generate a valid test response for initialization.
- Handle Garmin's two-step Ping pattern correctly: the Ping notification contains a callbackURL, not the actual data. Your Backend Workflow must always make a second call to the callbackURL to fetch the activity details before creating a Bubble Data Thing.
- Estimate Workload Unit costs before launch. Each Garmin Ping triggers a Backend Workflow with an API Connector call and a Data Thing creation. For apps with many active users syncing daily, WU consumption can be substantial — check Bubble's usage logs during testing to calibrate.
- Add Privacy rules to GarminActivity and GarminDaily Data Types immediately and verify with Bubble's 'Find fields exposed to others' checker. Fitness and health data is sensitive personal information that must never be publicly queryable.
- Build with mock data during the partner approval period so you can refine the UX, data model, and workflow logic without waiting. Replace mock records with live Garmin data once credentials arrive.
Alternatives
Fitbit is dramatically simpler than Garmin: self-serve developer portal (no partner approval), standard OAuth 2.0 (no HMAC-SHA1 signing proxy), and a polling-based REST API that Bubble's API Connector can call directly. If your users have Fitbit devices instead of Garmin, Fitbit is the recommended first choice for wearable integration in Bubble.
HealthKit is Apple's on-device iOS framework — no REST API, no partner approval needed, but requires an iOS bridge (iOS Shortcut or native app) to push data to a Bubble Backend Workflow. HealthKit is simpler in authentication (no OAuth at all) but requires an iPhone as the data source. Choose HealthKit for iOS-focused apps, Garmin for multi-platform athlete apps.
Withings (smart scales, blood pressure monitors) has a self-serve developer API using standard OAuth 2.0 — no partner approval wait, no HMAC-SHA1 signing. If your use case is biometric monitoring (weight, blood pressure, SpO2) rather than athletic activity tracking, Withings is a far simpler Bubble integration than Garmin.
Frequently asked questions
Why can't I call Garmin Health API directly from Bubble's API Connector?
Garmin uses OAuth 1.0a with HMAC-SHA1 request signing — an older authentication protocol that requires computing a cryptographic signature for every request. Bubble's API Connector can add static or dynamic headers but cannot perform HMAC-SHA1 cryptographic computations. A Cloudflare Worker (or similar server-side proxy) must sit between Bubble and Garmin to add the signed Authorization header.
How long does Garmin Health API partner approval take?
Typically 1–4 weeks. Garmin reviews applications manually and may request additional information about your use case, company, and expected user volume. Apply at developer.garmin.com at the start of your project, and build with mock data in Bubble while waiting. Do not let the approval wait block your development timeline.
Do Garmin OAuth tokens expire?
Garmin OAuth 1.0a access tokens do not have a short expiry cycle like Fitbit's 8-hour access tokens. Once a user authorizes your application and you receive the access_token and token_secret, they remain valid until the user actively revokes access from their Garmin account settings. This simplifies token management significantly compared to OAuth 2.0 integrations requiring refresh token workflows.
What does a Garmin Ping contain and why do I need a second API call?
A Garmin Ping notification contains the notification type (e.g., ACTIVITY, DAILY_SUMMARY) and a callbackURL pointing to the actual data on Garmin's API. It does not contain the activity data itself. Your Backend Workflow must make a second signed GET request to the callbackURL to retrieve the full activity details. This two-step pattern is by design — Garmin sends lightweight Pings quickly and lets you fetch details on your schedule.
Does the Garmin integration require a paid Bubble plan?
Yes. Receiving Garmin Ping webhooks requires a Bubble Backend Workflow (API Workflow), which is only available on paid Bubble plans (Starter at $32/month or higher). Without Backend Workflows, there is no way to receive Garmin's inbound Ping notifications in Bubble.
How much does the Cloudflare Worker proxy cost?
Cloudflare Workers are free for up to 100,000 requests per day on the free plan. For most Garmin integrations — where Pings occur once per device sync per user — this free tier covers hundreds of daily active users. Only very high-volume apps with thousands of daily syncing users would need Cloudflare's paid Workers plan ($5/month for 10 million requests).
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation