# Custom HR zone range collapses to a single BPM when one end has a non-numeric zone ID (ZX)

**URL:** <https://forum.intervals.icu/t/custom-hr-zone-range-collapses-to-a-single-bpm-when-one-end-has-a-non-numeric-zone-id-zx/133566>\
**Category:** Bug Reports\
**Created:** [10 November 2026 11:48 UTC](https://forum.intervals.icu/t/custom-hr-zone-range-collapses-to-a-single-bpm-when-one-end-has-a-non-numeric-zone-id-zx/133566 "2026-11-10T11:48:40Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![einomies](https://forum.intervals.icu/user_avatar/forum.intervals.icu/einomies/32/74218_2.png) [@einomies](https://forum.intervals.icu/u/einomies)\
**Post date:** [10 November 2026 11:48 UTC](https://forum.intervals.icu/t/custom-hr-zone-range-collapses-to-a-single-bpm-when-one-end-has-a-non-numeric-zone-id-zx/133566/1 "2026-11-10T11:48:40Z")

</div>

**Steps to reproduce**

1. Set up custom HR zones for Run with the IDs Z1, Z2, ZX, Z3, ZY, Z4, Z5 (80/20 style, based on LTHR).
2. Create a planned run with a step that uses a zone range with ZX-Z3:

```auto
   - RPE 5-6 Easy 30m CZZX-CZZ3 HR

```

1. See the HR printed wrong
2. This HR is synced to device also.

**Expected vs. actual behaviour**

- Expected: the 30m step targets the span from the bottom of ZX to the top of Z3.
- Actual: the target is a single value, 156–156 bpm, which looks like the boundary between ZX and Z3. Same failure with ZX at the upper end of a range (e.g. `CZZ2-CZZX`).
- Ranges between numeric IDs work fine: `CZZ2-CZZ3 HR` gives the correct span.
- Renaming the zone ID from ZX to Z23 makes the range work. So the parser seems to fail when a range endpoint has a non-numeric ID.

**Device & browser**

- Intervals.icu web

**Screenshots**

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

 ![image](https://forum.intervals.icu/uploads/default/original/3X/a/5/a5c1ce5b491acc0092777946296128354699e249.png)
