Working on advanced running metrics (GCT, Vertical Oscillation, Vertical Ratio, Step Length) — help us cover more devices before we ship it

A few of you have asked for Ground Contact Time, Vertical Oscillation and Vertical Ratio as real activity streams instead of needing to set up a Custom Stream by hand. We’re building this now — support for Garmin (watch + HRM-Pro/Tri or Running Dynamics Pod) and Coros (with a POD 2) is implemented on our end, along with Step Length and GCT Balance/%, but it hasn’t shipped yet.

Where we need your help before we release this: we don’t have a confirmed sample from every device that reports this data, and want to make sure the field names line up rather than assume it works everywhere:

  • Suunto users (with a Stryd pod, or a recent Suunto with native running dynamics) — could you share a raw .fit from an activity with this data so we can check the field names line up before we release?
  • Amazfit / Zepp users — same ask. We know at least one Zepp file has this data; want to confirm it’s the same field names across firmware/models before this goes out.
  • Huawei users (GT Runner 2, GT 5, Watch Fit 4 and similar) — if you can get a FIT file out of the Huawei ecosystem, we’d like to take a look.
  • Polar users — Polar doesn’t export FIT natively, so this only applies if you’re pairing with a Stryd pod and pulling the file from Stryd’s own app.

Separately — several of you have asked about Stryd’s own extra metrics beyond GCT/VO: Leg Spring Stiffness, Form Power, Air Power, Impact Loading Rate. These live in Stryd’s own developer fields rather than the standard FIT profile, so they need a bit more care and aren’t part of this first pass. If you run with a Stryd pod, we’d love a sample activity (ideally the raw .fit, since Custom Stream exports can lose the original field name) so we can scope that as a follow-up.

If you’re willing to share a file just reply here and we’ll follow up.
No ETA yet — depends on getting these samples in.
Thanks!

10 Likes

@jimmy_james @Ruben_Fernandez_Gale @QuocNgo @ostero

For newer Coros watches with latest firmware update you get some of them without the POD, ‘from the wrist’ as Coros calls it.

  • vertical_oscillation (mm) is Vertical Oscillation
  • vertical_ratio (percent) is Vertical Ratio
  • stance_time (ms) is Ground Contact Time
  • step_length (mm) is Step Length

Balance is not being recorded from the wrist.

These names are almost surely identical to those from Coros + POD, but just wanted to share for completeness.

2 Likes

Hi @ryandev,

That´s great that you are implementing full Garmin Running Dynamics in intervals.icu ActivityStreamSet.

The Garmin Pod Running Dynamics Set that Stryd implements in Stryd NextGen an in Stryd v5.0 for Garmin watches is:

  • cadence (rpm)
  • fractional_cadence (rpm)
  • vertical_oscillation (mm)
  • vertical_ratio (percent)
  • stance_time (ms)
  • stance_time_balance (percent)
  • stance_time_ percent (percent)
  • step_length (mm)

Previous Stryd models (without RD pod support) use Developer Fields

Hope this helps

1 Like

I notice my Apple Watch is not on the list… but I took a look since I know the data exists:

Vertical Oscillation, avg_vertical_oscillation

Ground Contact Time, avg_stance_time

Stride length, avg_fractional_cadence

Vertical Ratio, avg_vertical_ratio

Step Length, avg_step_length

2 Likes

There are those Custom Streams and the remaining:

vertical_oscillation_balance = streams.get(“StrydVOBalance”)?.data || [];

leg_spring_stiffness_balance = streams.get(“StrydLSSBalance”)?.data || [];

impact_loading_rate_balance = streams.get(“StrydILRBalance”)?.data || [];

Vertical Ratio, Step Length, Step Time Percent - Duty Factor are derived metrics and easily calculated from velocity, cadence, stance time and vertical oscillation, for devices without them I created Custom Streams with those calculations.

1 Like

I run with Stryd. You can look at my activities, no problem.

Mine is a single pod setup, there is also the possibility to run with two Stryd pods. I guess that adds streams, but don’t know.

Suunto user with two Stryd pods. Happy to share .fit files.

All of my workouts are using Stryd and exported from Watchletic on Apple Watch or Wear OS. Feel free to inspect my FIT files and since I’m the developer of Watchletic I have some knowledge on how Stryd encodes their FIT files so happy to share if you have any questions.

@miguell @MedTechCD Regarding step_length for Coros and Garmin is that heel-strike of one foot → heel-strike of the opposite foot (half a full gait cycle) OR heel-strike of one foot → heel-strike of the same foot again (a full gait cycle)

Hi @Antoinette_Tinker ,

Running Dynamics metrics are per side. As Garmin started with (single side) footpods it introduced running cadence in rpm, creating confusion. Metrics like GCT VO VR Step_length are per side, Stride length is per cycle/rotation. StepTime percent is duty factor = stance time / step time

Duty Factor metric:

  1. duty factor = stance time / stride time
  2. flight ratio = flight time / stride time. //where stride time is one foot cycle/rotation duration

If you want to calculate L/R Avg per side: with units as cadence in rpm, gct in ms (assuming Lgctbalancevalue=gctbalance; and Rgctbalancevalue = 100-gctbalance)

(((gct))/(60/cadence*1000))*100
or
stance_time_percent = stance_time × cadence(rpm) ÷ 600

Only the Left

(gct/(60/cadence*1000)*100)*2*((gctbalance)/100) 
or
left_duty_factor = (stance_time * cadence(rpm) * stance_time_balance) / 30000

Only the right:

(gct/(60/cadance*1000)*100)*2*((100-gctbalance))/100)
or
right_duty_factor = (stance_time * cadence(rpm) * (100 - stance_time_balance)) / 30000



True if gctbalance is defined as Left share of total stance time in percent
(so Right share is 100−gctbalance).

If you use Stryd with Garmin Running Dynamics Pod functionality implemented, just use stance_time_percent stream, and stance_time_balance if you want calculate L /R values

If you really need flight time percent per side average

(cadence * 2) * 1000) - GCT)/(60 / (cadence * 2) * 1000) )*100
or
stance_time_percent = stance_time × cadence(rpm) ÷ 600

For the left side :

(1 - (GCT * (gctbalance/100)) / ((60 / (cadence * 2) * 1000))) * 100
or
left_flight_ratio = 100 - ((stance_time * cadence(rpm) * stance_time_balance) / 30000)

For the right side:

(1 - (GCT * ((100 - gctbalance)/100)) / ((60 / (cadence * 2) * 1000))) * 100
or
right_flight_ratio = 100 - ((stance_time * cadence(rpm) * (100 - stance_time_balance)) / 30000)

Important: Garmin Connect metric “Stride Length”(wrongly named), it is technically calculating step length—the distance from one footfall to the very next.

Formula for Step Length:

(60*speed/(cadence*2)) //speed m/s  cadence rpm
or
step_length = (30 * speed) / cadence(rpm)

Formula for Vertical Ratio

(vertical_oscillation/(30*(speed/cadence))/10)     // vertical_oscillation in mm //speed m/s  cadence rpm
or
vertical_ratio = (vertical_oscillation * cadence(rpm)) / (300 * speed)

(edited, reduced versions added)

Idem: Step length from Coros is single step. Not full cycle.

Another Stryd Duo advanced running metric customs streams i just created, only available in intervals.icu:
Left Vertical Ratio and Right Vertical Ratio

1 Like

Thanks for the feedback @miguell & @MedTechCD

What is the norm amongst runners regarding ‘Cadance’ should it be displayed as rpm as is currently done or should it be steps per minute i.e double the current value?

Screenshot 2026-07-23 at 16.03.48

Am I correct in saying the ‘Stride’ field shows the step length and not the stride length, should this be renamed?

Runners use steps/min (spm), thus double cadence (rpm).
And yes, values around 70-100 cm are Step Length. Stride is measured from the same foot landing and ~double of step length. Step length is from alternating feet.

For displaying:

Cadence 166 spm

Stride Length 1.56 m

Step Length 0.78 m

Vertical Oscillation 6.5 cm

For ActivityStreamSet icu.streams… perhaps is better to keep as are, but i understand that is debatable.

Are there any platforms with really nice running metrics?

Only Stryd Power Center, i guess.

Hi everybody thanks for all your help.

We have added these streams for now. Please let us know if there are any problems or issues when using them:

  • stride_length
  • stance_time
  • stance_time_percent
  • stance_time_balance
  • vertical_oscillation
  • vertical_ratio
  • vertical_speed
  • step_length
  • leg_spring_stiffness
  • impact_loading_rate

We have also exposed new intervals (averages) for each of these streams:

  • average_stance_time
  • average_vertical_oscillation
  • average_vertical_ratio
  • average_step_length
  • average_stance_time_percent
  • average_stance_time_balance
  • average_vertical_speed
  • average_leg_spring_stiffness
  • average_impact_loading_rate
4 Likes

That ´s amazing, i will start to test and convert my scripts accordingly

Thank you for your work.