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

**URL:** <https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701>\
**Category:** Training\
**Created:** [16 July 2026 12:52 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701 "2026-07-16T12:52:54Z")\
**Posts on this page:** 20\
**Page:** 3

<div class="post-metadata">

**Author:** ![Povedano](https://forum.intervals.icu/user_avatar/forum.intervals.icu/povedano/32/43576_2.png) [@Povedano](https://forum.intervals.icu/u/Povedano)\
**Post date:** [7 August 2026 05:06 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/41 "2026-08-07T05:06:11Z")

</div>

Exactly. so we both agree that neither metric alone is sufficient 😉

---

<div class="post-metadata">

**Author:** ![Dflasse](https://forum.intervals.icu/user_avatar/forum.intervals.icu/dflasse/32/85462_2.png) [@Dflasse](https://forum.intervals.icu/u/Dflasse)\
**Post date:** [8 August 2026 12:21 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/42 "2026-08-08T12:21:33Z")

</div>

On the metrics themselves now that they are streams: only two of them have ever changed a training decision for me, and both because of how they drift rather than what they read.

Stance time percent, duty factor, is the one I trust. At the same pace it rises with fatigue, and it does that before the legs say anything. Readable inside a single easy run.

Vertical ratio is the second, but only against yourself and only at a fixed pace. Compared between two runners it mostly tells you how tall they are.

The rest I read as descriptive. Absolute GCT and vertical oscillation move with speed, shoes and surface, so a target value copied off an article means very little.

@Antoinette_Tinker on your earlier question about display: spm and step length in metres are how runners actually talk. And what made these usable here was less the platform than the per-interval averages that landed on 3 August. Holding pace still and watching one number move beats any dashboar

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [8 August 2026 13:05 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/44 "2026-08-08T13:05:15Z")

</div>

Just notice icu.streams.vertical\_speed calculated present , that’s great news, thank you.

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [8 August 2026 13:25 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/45 "2026-08-08T13:25:45Z")

</div>

@Antoinette_Tinker @ryandev Just notice `icu.streams.vertical_speed` calculated and `icu.streams.stance_time_percent` calculated present for Apple and new Coros watches that’s huge, that’s great news, thank you for your good work.

 ![imagem](https://forum.intervals.icu/uploads/default/original/3X/a/1/a116e42f976c2ce36bc67894203577a08e0d8f0c.png)

---

<div class="post-metadata">

**Author:** ![miguell](https://forum.intervals.icu/letter_avatar_proxy/v4/letter/m/85f322/32.png) [@miguell](https://forum.intervals.icu/u/miguell)\
**Post date:** [8 August 2026 13:50 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/46 "2026-08-08T13:50:12Z")

</div>

That’s the full deck set. Now most of my Custom Streams and Fields are redundant so obsolete, and that’s great. Thank you Intervals.icu dev team.

---

<div class="post-metadata">

**Author:** ![Andre\_Bernardinelli](https://forum.intervals.icu/user_avatar/forum.intervals.icu/andre_bernardinelli/32/72648_2.png) [@Andre\_Bernardinelli](https://forum.intervals.icu/u/Andre_Bernardinelli)\
**Post date:** [11 August 2026 18:08 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/48 "2026-08-11T18:08:59Z")

</div>

I know it´s different sports, but as you´re working on it, can you also include swim details for workout steps?

[Swim workout steps — support stroke type, drill and equipment - Feature Requests - Intervals.icu Forum](https://forum.intervals.icu/t/swim-workout-steps-support-stroke-type-drill-and-equipment/130878)

---

<div class="post-metadata">

**Author:** ![etabeta888](https://forum.intervals.icu/user_avatar/forum.intervals.icu/etabeta888/32/86752_2.png) [@etabeta888](https://forum.intervals.icu/u/etabeta888)\
**Post date:** [12 August 2026 10:25 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/49 "2026-08-12T10:25:31Z")

</div>

The new `stance_time_balance` chart appears to have Left/Right reversed compared with Garmin Connect.

For the same activity, the time-series shape matches Garmin exactly, but the side attribution is inverted. At approximately 25:46, Garmin Connect reports **54.8% L / 45.2% R** , whereas the corresponding point in Intervals.icu is plotted at approximately **55% R / 45% L**.

Garmin therefore shows this section as **Left-dominant GCT** , while Intervals.icu shows the same section as **Right-dominant**. It looks like the L/R interpretation of `stance_time_balance` is reversed.

To be clear I am referring to the Y Axis labels. The time-series matches Garmin, however if you look at the Y Axis labels R is at the top and L at the bottom. I think Y Axis should have the L label at the top and R label at the bottom similar to the Garmin chart.

 ![image](https://forum.intervals.icu/uploads/default/original/3X/2/d/2d2a5efd0348b66e13fc6275d61896beda78d5ec.png)

 ![image](https://forum.intervals.icu/uploads/default/original/3X/1/c/1caec2145bcf7f6c5967d857ab2f0e59face9a4c.png)

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [12 August 2026 15:11 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/50 "2026-08-12T15:11:02Z")

</div>

For me and at this time, seems correct.  
 ![imagem](https://forum.intervals.icu/uploads/default/original/3X/1/7/17b6c9f83c16a79c1cbcaf697a21f80f992b581c.png)

 ![imagem](https://forum.intervals.icu/uploads/default/original/3X/c/d/cd6824893b6be5eacf735acc4f05d5661f8f486b.png) ![imagem](https://forum.intervals.icu/uploads/default/original/3X/1/e/1e4abd7f4f12f7c05a4e79a50b482d7328115aec.png) ![imagem](https://forum.intervals.icu/uploads/default/original/3X/4/5/452a616fd06f4f0ca5707946bb3defdb9d648bef.png)

---

<div class="post-metadata">

**Author:** ![Wesley\_Stocker](https://forum.intervals.icu/user_avatar/forum.intervals.icu/wesley_stocker/32/29271_2.png) [@Wesley\_Stocker](https://forum.intervals.icu/u/Wesley_Stocker)\
**Post date:** [12 August 2026 16:13 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/51 "2026-08-12T16:13:45Z")

</div>

I like [smashrun.com](https://smashrun.com/wesley.stocker/run/2026/8/7) and am a premium user there as well.

 ![image](https://forum.intervals.icu/uploads/default/original/3X/2/4/244cc6253610b3c3dd7184ff94cc7261bb5949f6.png)

---

<div class="post-metadata">

**Author:** ![Wesley\_Stocker](https://forum.intervals.icu/user_avatar/forum.intervals.icu/wesley_stocker/32/29271_2.png) [@Wesley\_Stocker](https://forum.intervals.icu/u/Wesley_Stocker)\
**Post date:** [12 August 2026 16:19 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/52 "2026-08-12T16:19:22Z")

</div>

I also need to get back to using my [Striv](https://striv.run/), it would be cool if their added data was available too. I have a original KickStarter version and they are soon launching the next-gen pod.

---

<div class="post-metadata">

**Author:** ![etabeta888](https://forum.intervals.icu/user_avatar/forum.intervals.icu/etabeta888/32/86752_2.png) [@etabeta888](https://forum.intervals.icu/u/etabeta888)\
**Post date:** [12 August 2026 16:42 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/53 "2026-08-12T16:42:01Z")

</div>

Yes the time-series matches Garmin values, however if you look at the Y Axis labels R is at the top and L at the bottom. I think Y Axis should have the L label at the top and R label at the bottom similar to the Garmin chart.

Apologies for not being clear on my previous post.

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [12 August 2026 17:01 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/54 "2026-08-12T17:01:16Z")

</div>

@etabeta888 Good catch, also with Stance B

---

<div class="post-metadata">

**Author:** ![Printzell](https://forum.intervals.icu/user_avatar/forum.intervals.icu/printzell/32/35377_2.png) [@Printzell](https://forum.intervals.icu/u/Printzell)\
**Post date:** [12 August 2026 18:36 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/55 "2026-08-12T18:36:07Z")

</div>

Impact Loading Rate seems to be missing even though I’m using Stryd5 and I can see it in Fitfileviewer. See this activity as an example:

> **[Intervals.icu](https://intervals.icu/activities/i174983808)**
>
> Intervals.icu integrates with Strava, Zwift, Garmin Connect, Suunto, Wahoo and Dropbox, analyzes your rides, runs, swims and other activities and helps plan your training

---

<div class="post-metadata">

**Author:** ![jonaspacheco](https://forum.intervals.icu/user_avatar/forum.intervals.icu/jonaspacheco/32/39656_2.png) [@jonaspacheco](https://forum.intervals.icu/u/jonaspacheco)\
**Post date:** [12 August 2026 19:44 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/56 "2026-08-12T19:44:24Z")

</div>

that’s amazing! waiting for an update for running for a long time!

please, please, don’t forget the option to set the skyline on the calendar to be visualized by pace. atm it works just with power (even if you set pace as the main reference in the settings)… which for huge majority of runners, isn’t useful.

there’s a whole topic requesting it:

> [@Running activity skyline by pace](https://forum.intervals.icu/t/running-activity-skyline-by-pace/71964/27):
>
> runners, let’s vote for having our skylines by pace!

---

<div class="post-metadata">

**Author:** ![Antoinette\_Tinker](https://forum.intervals.icu/user_avatar/forum.intervals.icu/antoinette_tinker/32/66758_2.png) [@Antoinette\_Tinker](https://forum.intervals.icu/u/Antoinette_Tinker)\
**Post date:** [18 August 2026 13:58 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/57 "2026-08-18T13:58:00Z")

</div>

@miguell @povedano @MedTechCD @pepe

I need some clarity regarding Duty Factor / stance\_time\_percent and Flight Ratio.

From the Garmin FIT files is seems like stance\_time\_percent is calculates as :

stance\_time\_percent = stance\_time × cadence(rpm) ÷ 600

Note - it seems like Garmin is using cadence as rpm not spm.

Example:

stance\_time = 287ms

cadence(rpm) = 84

flight\_time = 71ms

Garmin stance\_time\_percent = 287 \* 84 / 600 = 40.18%

Would that then mean **Flight Ratio = 100 - 40.18% = 59.82** % ?

Or should Flight Ratio be calculated as:

flight\_ratio = flight\_time / (flight\_time + stance\_time) \*100

**Flight Ratio = 71 /(71 + 287) \* 100 = 19.8% ?**

I have also seen Flight Ratio calcualted as:

Flight Ratio = flight\_time / stance time

**Flight Ratio = 71/287 \* 100 = 24.7%**

What would be the correct way of calculating Flight Ratio?

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [18 August 2026 14:19 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/58 "2026-08-18T14:19:27Z")

</div>

> [@Antoinette\_Tinker](#):
>
> stance\_time\_percent = stance\_time × cadence(rpm) ÷ 600

Correct

For the others:

Flight Ratio = ((step\_time - stance\_time) / step\_time) \* 100;

Flight Time = (30000/cadence(rpm)) - stance\_time

Ratio expressed as percentage

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [18 August 2026 15:53 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/59 "2026-08-18T15:53:01Z")

</div>

> [@Antoinette\_Tinker](#):
>
> stance\_time = 287ms
> 
> cadence(rpm) = 84

**Stride Time** = **Total single-foot cycle duration** = **60000 / cadence(rpm)** = **60000 / 84 = 714.29 ms** // duration between two consecutive same-foot strikes

**Step Time** = **Total single-foot cycle duration** = **30000 / cadence(rpm)** = **30000 / 84 = 357.1 ms** // duration between two consecutive-foot strikes both foot

**Flight Time** = **Step Time - stance\_time** = **(30000/cadence(rpm)) - stance\_time** = 357.1 − 287 = 70.1

**Flight Ratio** = **(flight time / step time) x 100** = **(flight time / (flight time + stance time)) x 100** \*\* = 71 /(71 + 287) \* 100 = 19.8%\*\*

**flight\_time / stance\_time** is **Flight-to-Stance Ratio** not **Flight Ratio**

---

<div class="post-metadata">

**Author:** ![miguell](https://forum.intervals.icu/letter_avatar_proxy/v4/letter/m/85f322/32.png) [@miguell](https://forum.intervals.icu/u/miguell)\
**Post date:** [18 August 2026 17:30 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/60 "2026-08-18T17:30:06Z")

</div>

Perfect. Edited my formulas in post above, adding reduced formula versions.

---

<div class="post-metadata">

**Author:** ![Povedano](https://forum.intervals.icu/user_avatar/forum.intervals.icu/povedano/32/43576_2.png) [@Povedano](https://forum.intervals.icu/u/Povedano)\
**Post date:** [19 August 2026 08:08 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/62 "2026-08-19T08:08:46Z")

</div>

@pepe @Antoinette_Tinker, I disagree on the flight time and flight ratio. It should use SPM, not RPM for calculation.

RPM = 84 (one leg only)  
SPM = 84 RPM × 2 = 168 (steps per minute, both feet)  
Stance time = 287 ms (Garmin Ground Contact Time, GCT)

Stride Time (ms) = 60000 / RPM = 60000 / 84 = 714.3 ms (how long it takes one specific foot to hit the ground again)

Step Time (ms) = 60000 / SPM = 60000 / (RPM × 2) = 60000 / 168 = 357.1 ms (one foot strike to the opposite foot’s strike)

Flight Time (ms) = Step Time − Stance Time = 357.1 − 287 = 70.1 ms (time in the air between one foot leaving the ground and the other foot landing) - using stride time here is wrong.

Duty Factor (%) = (Stance time / Stride Time) × 100 = (Stance time × RPM) / 600 = (287 × 84) / 600 = 40.2% (what fraction of a full stride, both legs, one foot spends on the ground. Garmin calls it stance\_time\_percent)

Flight Ratio (%) = Flight Time / (Flight Time + Stance time) × 100 = Flight Time / Step Time × 100 = 71 / (71 + 287) × 100 = 19.8% (of one step, not a full stride, what % is spent airborne. How fast you’re moving and how efficiently you move at a current speed)

Flight-to-Stance Ratio (%) = Flight Time / Stance time × 100 = 71 / 287 × 100 = 24.7% (compares air time directly to ground time) - It’s not the standard “Flight Ratio” metric.

Garmin running dynamics also provides Vertical Oscillation in cm (how many cm you bounces up/down per stride), so you can get Vertical Ratio:  
Vertical Ratio (%) = Vertical Oscillation (cm) / Stride Length (cm) × 100 (up-and-down movement efficiency)

---

<div class="post-metadata">

**Author:** ![pepe](https://forum.intervals.icu/user_avatar/forum.intervals.icu/pepe/32/36539_2.png) [@pepe](https://forum.intervals.icu/u/pepe)\
**Post date:** [19 August 2026 10:05 UTC](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701/63 "2026-08-19T10:05:48Z")

</div>

You are correct regarding **flight time** and **flight ratio**. I will update the formulas in my previous post. These metrics are specific to the **step gait model** , whereas **Garmin** utilizes the **stride gait model** , which explains the confusion.

[Previous page](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701.md?page=2)

[Next page](https://forum.intervals.icu/t/working-on-advanced-running-metrics-gct-vertical-oscillation-vertical-ratio-step-length-help-us-cover-more-devices-before-we-ship-it/130701.md?page=4)
