Skip to content

Strava API import (Android)

On Android, Grom can import recent workouts directly from the Strava API using your own Strava API application credentials (bring-your-own / BYO). Nothing is stored on the Grom server: Client ID, Client Secret, and OAuth tokens stay on the device. This flow is not available in the web client.

For a full history (or activities older than the sync window), use Strava bulk import (ZIP archive).

Prerequisites

  1. A Strava account with an active subscription (required by Strava to create an API application).
  2. Create an API application at strava.com/settings/api.
  3. Copy the Client ID and Client Secret into Grom.

If Connect fails with HTTP 403 on token exchange, re-check that Client ID and Client Secret match the API application, then retry.

New Strava apps start in single-player mode (only the app owner can authorize), which matches personal BYO use.

User flow

  1. Open Integration → External services → Strava (Android only).
  2. Enable Import workouts from Strava.
  3. Enter Client ID, Client Secret, and optionally Workouts per sync (default 10, max 200).
  4. Tap Connect with Strava, authorize with scope activity:read, and confirm the status shows OK.
  5. On Home, tap the sync icon in the app bar (same placement/behavior as the former Health Sync button).
  6. Grom shows a “Synchronizing…” dialog, then a snackbar with how many workouts were imported (or that none were new).

Turning the toggle off only hides the Home sync button; credentials and tokens remain on the device. Logging out of Grom also leaves Strava settings intact.

Sync rules

Rule Behavior
Limit Up to the user-configured Workouts per sync count (default 10, max 200) of the most recent activities
Order Newest first
Stop Stops at the first activity that already exists in Grom with external_id.name=strava and matching id
Visibility activity:read only — Everyone / Followers activities (not “Only You”)
Metrics Distance, moving/elapsed time, speeds, elevation, heart rate, cadence, power, and calories come from the Strava activity object when present — not from recomputing the track
Streams Requests all Strava stream types (time, latlng, distance, altitude, velocity_smooth, heartrate, cadence, watts, temp, moving, grade_smooth); missing types are ignored
Track Always builds a FIT from streams when at least two useful samples exist (sensor and/or GPS). Records without valid GPS omit position fields so indoor/strength HR series still attach. Empty or all-zero streams (e.g. speed) are omitted from the FIT so unused charts are not created. Incomplete GPS does not replace activity metrics
No streams Creates a workout from summary fields without a track (still sends avg/max HR, cadence, watts, calories when Strava provides them)
Device Uses Strava device_name when present: written into the generated FIT (product_name) and sent as the create device field (otherwise server default Grom App). The FIT does not use manufacturer=development, so the workout is not labeled "Development"
Photos Best-effort download via the activity photos API; failures do not fail the workout
Equipment equipment_ids omitted so the server applies last_equipment_by_sport

Already-imported activities are not updated by sync (delete and re-import if you need a corrected track).

Duplicate detection uses the same external_id namespace as the ZIP importer (strava + Strava activity id), so API and archive imports do not create duplicates for the same activity.

Privacy note

Client secrets and refresh tokens are stored in app preferences on the device. Treat the phone like any other place you keep personal API credentials. Grom does not send these values to your Grom instance.