diff --git a/components/support/nimbus-fml/src/parser.rs b/components/support/nimbus-fml/src/parser.rs
index 2498445c..dbc814a3 100644
--- a/components/support/nimbus-fml/src/parser.rs
+++ b/components/support/nimbus-fml/src/parser.rs
@@ -2,7 +2,7 @@
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-use std::{collections::HashMap, path::Path};
+use std::{collections::BTreeMap, collections::HashMap, path::Path};
 
 use serde::{Deserialize, Serialize};
 use serde_json::json;
@@ -24,7 +24,7 @@ pub(crate) struct EnumVariantBody {
 #[serde(deny_unknown_fields)]
 pub(crate) struct EnumBody {
     description: String,
-    variants: HashMap<String, EnumVariantBody>,
+    variants: BTreeMap<String, EnumVariantBody>,
 }
 
 #[derive(Debug, Deserialize, Serialize, Clone)]
@@ -43,23 +43,23 @@ pub(crate) struct FieldBody {
 pub(crate) struct ObjectBody {
     description: String,
     failable: Option<bool>,
-    fields: HashMap<String, FieldBody>,
+    fields: BTreeMap<String, FieldBody>,
 }
 
 #[derive(Debug, Deserialize, Serialize, Clone, Default)]
 #[serde(deny_unknown_fields)]
 pub(crate) struct Types {
     #[serde(default)]
-    enums: HashMap<String, EnumBody>,
+    enums: BTreeMap<String, EnumBody>,
     #[serde(default)]
-    objects: HashMap<String, ObjectBody>,
+    objects: BTreeMap<String, ObjectBody>,
 }
 
 #[derive(Debug, Deserialize, Serialize, Clone)]
 #[serde(deny_unknown_fields)]
 pub(crate) struct FeatureBody {
     description: String,
-    variables: HashMap<String, FieldBody>,
+    variables: BTreeMap<String, FieldBody>,
     #[serde(alias = "defaults")]
     default: Option<serde_json::Value>,
 }
@@ -71,7 +71,7 @@ pub(crate) struct ManifestFrontEnd {
     #[serde(default)]
     #[serde(rename = "types")]
     legacy_types: Option<Types>,
-    features: HashMap<String, FeatureBody>,
+    features: BTreeMap<String, FeatureBody>,
     channels: Vec<String>,
 
     // If a types attribute isn't explicitly expressed,
