diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index bf9a2d5bc3ad714324987fd2ef58d7aaf4e40bbe..125bccf0971000d763f83f6d72cf452cfb0a0667 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -709,6 +709,46 @@ For template fields, use the triple brace `{{{ }}}` notation to avoid Handlebars
 !!! tip
     Look at our [Custom Manager Presets](./presets-customManagers.md), they may have what you need.
 
+### autoReplaceStringTemplate
+
+Allows overwriting how the matched string is replaced.
+This allows for some migration strategies.
+E.g. moving from one Docker image repository to another one.
+
+```yaml title="helm-values.yaml"
+# The image of the service <registry>/<repo>/<image>:<tag>
+image: my.old.registry/aRepository/andImage:1.18-alpine
+```
+
+```json title="The regex definition"
+{
+  "customManagers": [
+    {
+      "customType": "regex",
+      "fileMatch": ["values.yaml$"],
+      "matchStrings": [
+        "image:\\s+(?<depName>my\\.old\\.registry/aRepository/andImage):(?<currentValue>[^\\s]+)"
+      ],
+      "depNameTemplate": "my.new.registry/aRepository/andImage",
+      "autoReplaceStringTemplate": "image: {{{depName}}}:{{{newValue}}}",
+      "datasourceTemplate": "docker"
+    }
+  ]
+}
+```
+
+This will lead to following update where `1.21-alpine` is the newest version of `my.new.registry/aRepository/andImage`:
+
+```yaml
+# The image of the service <registry>/<repo>/<image>:<tag>
+image: my.new.registry/aRepository/andImage:1.21-alpine
+```
+
+### currentValueTemplate
+
+If the `currentValue` for a dependency is not captured with a named group then it can be defined in config using this field.
+It will be compiled using Handlebars and the regex `groups` result.
+
 ### customType
 
 Example:
@@ -726,6 +766,26 @@ Example:
 }
 ```
 
+### datasourceTemplate
+
+If the `datasource` for a dependency is not captured with a named group then it can be defined in config using this field.
+It will be compiled using Handlebars and the regex `groups` result.
+
+### depNameTemplate
+
+If `depName` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
+It will be compiled using Handlebars and the regex `groups` result.
+
+### depTypeTemplate
+
+If `depType` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
+It will be compiled using Handlebars and the regex `groups` result.
+
+### extractVersionTemplate
+
+If `extractVersion` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
+It will be compiled using Handlebars and the regex `groups` result.
+
 ### matchStrings
 
 Each `matchStrings` must be a valid regular expression, optionally with named capture groups.
@@ -886,35 +946,15 @@ thanos_version: "0.15.0" // a comment
 
 In the above example, each custom manager will match a single dependency each.
 
-### depNameTemplate
-
-If `depName` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
-It will be compiled using Handlebars and the regex `groups` result.
-
-### extractVersionTemplate
-
-If `extractVersion` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
-It will be compiled using Handlebars and the regex `groups` result.
-
 ### packageNameTemplate
 
 `packageName` is used for looking up dependency versions.
 It will be compiled using Handlebars and the regex `groups` result.
 It will default to the value of `depName` if left unconfigured/undefined.
 
-### currentValueTemplate
-
-If the `currentValue` for a dependency is not captured with a named group then it can be defined in config using this field.
-It will be compiled using Handlebars and the regex `groups` result.
-
-### datasourceTemplate
-
-If the `datasource` for a dependency is not captured with a named group then it can be defined in config using this field.
-It will be compiled using Handlebars and the regex `groups` result.
-
-### depTypeTemplate
+### registryUrlTemplate
 
-If `depType` cannot be captured with a named capture group in `matchString` then it can be defined manually using this field.
+If the `registryUrls` for a dependency is not captured with a named group then it can be defined in config using this field.
 It will be compiled using Handlebars and the regex `groups` result.
 
 ### versioningTemplate
@@ -922,46 +962,6 @@ It will be compiled using Handlebars and the regex `groups` result.
 If the `versioning` for a dependency is not captured with a named group then it can be defined in config using this field.
 It will be compiled using Handlebars and the regex `groups` result.
 
-### registryUrlTemplate
-
-If the `registryUrls` for a dependency is not captured with a named group then it can be defined in config using this field.
-It will be compiled using Handlebars and the regex `groups` result.
-
-### autoReplaceStringTemplate
-
-Allows overwriting how the matched string is replaced.
-This allows for some migration strategies.
-E.g. moving from one Docker image repository to another one.
-
-```yaml title="helm-values.yaml"
-# The image of the service <registry>/<repo>/<image>:<tag>
-image: my.old.registry/aRepository/andImage:1.18-alpine
-```
-
-```json title="The regex definition"
-{
-  "customManagers": [
-    {
-      "customType": "regex",
-      "fileMatch": ["values.yaml$"],
-      "matchStrings": [
-        "image:\\s+(?<depName>my\\.old\\.registry/aRepository/andImage):(?<currentValue>[^\\s]+)"
-      ],
-      "depNameTemplate": "my.new.registry/aRepository/andImage",
-      "autoReplaceStringTemplate": "image: {{{depName}}}:{{{newValue}}}",
-      "datasourceTemplate": "docker"
-    }
-  ]
-}
-```
-
-This will lead to following update where `1.21-alpine` is the newest version of `my.new.registry/aRepository/andImage`:
-
-```yaml
-# The image of the service <registry>/<repo>/<image>:<tag>
-image: my.new.registry/aRepository/andImage:1.21-alpine
-```
-
 ## customizeDashboard
 
 You may use the `customizeDashboard` object to customize the Dependency Dashboard.
@@ -1721,6 +1721,31 @@ To abort Renovate for errors for a specific `docker` host:
 
 When this field is enabled, Renovate will abort its run if it encounters either (a) any low-level http error (e.g. `ETIMEDOUT`) or (b) gets a response _not_ matching any of the configured `abortIgnoreStatusCodes` (e.g. `500 Internal Error`);
 
+### artifactAuth
+
+You may use this field whenever it is needed to only enable authentication for a specific set of managers.
+
+For example, using this option could be used whenever authentication using Git for private composer packages is already being handled through the use of SSH keys, which results in no need for also setting up authentication using tokens.
+
+```json
+{
+  "hostRules": [
+    {
+      "hostType": "gitlab",
+      "matchHost": "gitlab.myorg.com",
+      "token": "abc123",
+      "artifactAuth": ["composer"]
+    }
+  ]
+}
+```
+
+Supported artifactAuth and hostType combinations:
+
+| artifactAuth | hostTypes                                   |
+| ------------ | ------------------------------------------- |
+| `composer`   | `gitlab`, `packagist`, `github`, `git-tags` |
+
 ### authType
 
 You may use the `authType` option to create a custom HTTP `authorization` header.
@@ -1783,61 +1808,6 @@ Example config:
 Use an exact host for `matchHost` and not a domain (e.g. `api.github.com` as shown above and not `github.com`).
 Do not combine with `hostType` in the same rule or it won't work.
 
-### maxRequestsPerSecond
-
-In addition to `concurrentRequestLimit`, you can limit the maximum number of requests that can be made per one second.
-It can be used to set minimal delay between two requests to the same host.
-Fractional values are allowed, e.g. `0.25` means 1 request per 4 seconds.
-Default value `0` means no limit.
-
-Example config:
-
-```json
-{
-  "hostRules": [
-    {
-      "matchHost": "api.github.com",
-      "maxRequestsPerSecond": 2
-    }
-  ]
-}
-```
-
-### maxRetryAfter
-
-A remote host may return a `4xx` response with a `Retry-After` header value, which indicates that Renovate has been rate-limited.
-Renovate may try to contact the host again after waiting a certain time, that's set by the host.
-By default, Renovate tries again after the `Retry-After` header value has passed, up to a maximum of 60 seconds.
-If the `Retry-After` value is more than 60 seconds, Renovate will abort the request instead of waiting.
-
-You can configure a different maximum value in seconds using `maxRetryAfter`:
-
-```json
-{
-  "hostRules": [
-    {
-      "matchHost": "api.github.com",
-      "maxRetryAfter": 25
-    }
-  ]
-}
-```
-
-### newLogLevel
-
-For log level remapping, `newLogLevel` will set for the particular log message:
-
-```json
-{
-  "logLevelRemap": [
-    {
-      "matchMessage": "/Error executing maven wrapper update command/",
-      "newLogLevel": "warn"
-    }
-  ]
-}
-```
-
 ### dnsCache
 
 Enable got [dnsCache](https://github.com/sindresorhus/got/blob/v11.5.2/readme.md#dnsCache) support.
@@ -1877,6 +1847,24 @@ For example:
 You usually don't need to configure it in a host rule if you have already configured `matchHost` and only one host type is in use for those, as is usually the case.
 `hostType` can help for cases like an enterprise registry that serves multiple package types and has different authentication for each, although it's often the case that multiple `matchHost` rules could achieve the same thing.
 
+### httpsCertificate
+
+Specifies the [Certificate chains](https://en.wikipedia.org/wiki/X.509#Certificate_chains_and_cross-certification) in [PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) for mTLS authentication.
+
+### httpsCertificateAuthority
+
+By default, Renovate uses the curated list of well-known [CA](https://en.wikipedia.org/wiki/Certificate_authority)s by Mozilla.
+You may use another Certificate Authority instead, by setting it in the `httpsCertificateAuthority` config option.
+
+### httpsPrivateKey
+
+Specifies the private key in [PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) for mTLS authentication.
+
+<!-- prettier-ignore -->
+!!! warning
+    Do _not_ put your private key into this field, to avoid losing confidentiality completely.
+    You must use [secrets](./self-hosted-configuration.md#secrets) to pass it down securely instead.
+
 ### insecureRegistry
 
 Enable this option to allow Renovate to connect to an [insecure Docker registry](https://docs.docker.com/registry/insecure/) that is HTTP only.
@@ -1899,31 +1887,6 @@ Example:
 
 If enabled, this allows a single TCP connection to remain open for multiple HTTP(S) requests/responses.
 
-### artifactAuth
-
-You may use this field whenever it is needed to only enable authentication for a specific set of managers.
-
-For example, using this option could be used whenever authentication using Git for private composer packages is already being handled through the use of SSH keys, which results in no need for also setting up authentication using tokens.
-
-```json
-{
-  "hostRules": [
-    {
-      "hostType": "gitlab",
-      "matchHost": "gitlab.myorg.com",
-      "token": "abc123",
-      "artifactAuth": ["composer"]
-    }
-  ]
-}
-```
-
-Supported artifactAuth and hostType combinations:
-
-| artifactAuth | hostTypes                                   |
-| ------------ | ------------------------------------------- |
-| `composer`   | `gitlab`, `packagist`, `github`, `git-tags` |
-
 ### matchHost
 
 This can be a base URL (e.g. `https://api.github.com`) or a hostname like `github.com` or `api.github.com`.
@@ -1954,12 +1917,67 @@ registry=https://gitlab.myorg.com/api/v4/packages/npm/
 !!! note
     Values containing a URL path but missing a scheme will be prepended with 'https://' (e.g. `domain.com/path` -> `https://domain.com/path`)
 
-### readOnly
+### maxRequestsPerSecond
 
-If the `readOnly` field is being set to `true` inside the host rule, it will match only against the requests that are known to be read operations.
-Examples are `GET` requests or `HEAD` requests, but also it could be certain types of GraphQL queries.
+In addition to `concurrentRequestLimit`, you can limit the maximum number of requests that can be made per one second.
+It can be used to set minimal delay between two requests to the same host.
+Fractional values are allowed, e.g. `0.25` means 1 request per 4 seconds.
+Default value `0` means no limit.
 
-This option could be used to avoid rate limits for certain platforms like GitHub or Bitbucket, by offloading the read operations to a different user.
+Example config:
+
+```json
+{
+  "hostRules": [
+    {
+      "matchHost": "api.github.com",
+      "maxRequestsPerSecond": 2
+    }
+  ]
+}
+```
+
+### maxRetryAfter
+
+A remote host may return a `4xx` response with a `Retry-After` header value, which indicates that Renovate has been rate-limited.
+Renovate may try to contact the host again after waiting a certain time, that's set by the host.
+By default, Renovate tries again after the `Retry-After` header value has passed, up to a maximum of 60 seconds.
+If the `Retry-After` value is more than 60 seconds, Renovate will abort the request instead of waiting.
+
+You can configure a different maximum value in seconds using `maxRetryAfter`:
+
+```json
+{
+  "hostRules": [
+    {
+      "matchHost": "api.github.com",
+      "maxRetryAfter": 25
+    }
+  ]
+}
+```
+
+### newLogLevel
+
+For log level remapping, `newLogLevel` will set for the particular log message:
+
+```json
+{
+  "logLevelRemap": [
+    {
+      "matchMessage": "/Error executing maven wrapper update command/",
+      "newLogLevel": "warn"
+    }
+  ]
+}
+```
+
+### readOnly
+
+If the `readOnly` field is being set to `true` inside the host rule, it will match only against the requests that are known to be read operations.
+Examples are `GET` requests or `HEAD` requests, but also it could be certain types of GraphQL queries.
+
+This option could be used to avoid rate limits for certain platforms like GitHub or Bitbucket, by offloading the read operations to a different user.
 
 ```json
 {
@@ -1991,24 +2009,6 @@ To adjust it down to 10s for all queries, do this:
 }
 ```
 
-### httpsCertificateAuthority
-
-By default, Renovate uses the curated list of well-known [CA](https://en.wikipedia.org/wiki/Certificate_authority)s by Mozilla.
-You may use another Certificate Authority instead, by setting it in the `httpsCertificateAuthority` config option.
-
-### httpsPrivateKey
-
-Specifies the private key in [PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) for mTLS authentication.
-
-<!-- prettier-ignore -->
-!!! warning
-    Do _not_ put your private key into this field, to avoid losing confidentiality completely.
-    You must use [secrets](./self-hosted-configuration.md#secrets) to pass it down securely instead.
-
-### httpsCertificate
-
-Specifies the [Certificate chains](https://en.wikipedia.org/wiki/X.509#Certificate_chains_and_cross-certification) in [PEM format](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) for mTLS authentication.
-
 ## ignoreDeprecated
 
 By default, Renovate won't update a dependency version to a deprecated release unless the current version was _itself_ deprecated.
@@ -2556,36 +2556,25 @@ You must use the `!/ /` syntax, like this:
 }
 ```
 
-### matchCurrentAge
-
-Use this field if you want to match packages based on the age of the _current_ (existing, in-repo) version.
+### changelogUrl
 
-For example, if you want to group updates for dependencies where the existing version is more than 2 years old:
+Use this field to set the changelog URL for a package, including overriding any existing one.
+Using this field we can specify the exact URL to fetch changelogs from.
 
-```json
+```json title="Setting the changelog URL for the dummy package"
 {
   "packageRules": [
     {
-      "matchCurrentAge": "> 2 years",
-      "groupName": "old dependencies"
+      "matchPackageNames": ["dummy"],
+      "changelogUrl": "https://github.com/org/dummy"
     }
   ]
 }
 ```
 
-The `matchCurrentAge` string must start with one of `>`, `>=`, `<` or `<=`.
-
-Only _one_ date part is supported, so you _cannot_ do `> 1 year 1 month`.
-Instead you should do `> 13 months`.
-
 <!-- prettier-ignore -->
 !!! note
-    We recommend you only use the words hour(s), day(s), week(s), month(s) and year(s) in your time ranges.
-
-### matchDepTypes
-
-Use this field if you want to limit a `packageRule` to certain `depType` values.
-Invalid if used outside of a `packageRule`.
+    Renovate can fetch changelogs from Bitbucket, Gitea (Forgejo), GitHub and GitLab platforms only, and setting the URL to an unsupported host/platform type won't change that.
 
 ### excludeDepNames
 
@@ -2667,113 +2656,101 @@ Use this field to restrict rules to a particular repository. e.g.
 
 This field supports Regular Expressions if they begin and end with `/`, otherwise it will use `minimatch`.
 
-### matchCategories
-
-Use `matchCategories` to restrict rules to a particular language or group.
-Matching is done using "any" logic, i.e. "match any of the following categories".
-The categories can be found in the [manager documentation](modules/manager/index.md).
+### matchBaseBranches
 
-<!-- prettier-ignore -->
-!!! note
-    Rules with `matchCategories` are only applied _after_ extraction of dependencies.
-    If you want to configure which managers are being extracted at all, use `enabledManagers` instead.
+Use this field to restrict rules to a particular branch. e.g.
 
 ```json
 {
   "packageRules": [
     {
-      "matchCategories": ["python"],
-      "addLabels": ["py"]
+      "matchBaseBranches": ["main"],
+      "excludePackagePatterns": ["^eslint"],
+      "enabled": false
     }
   ]
 }
 ```
 
-### matchRepositories
-
-Use this field to restrict rules to a particular repository. e.g.
+This field also supports Regular Expressions if they begin and end with `/`. e.g.
 
 ```json
 {
   "packageRules": [
     {
-      "matchRepositories": ["literal/repo", "/^some/.*$/", "**/*-archived"],
+      "matchBaseBranches": ["/^release/.*/"],
+      "excludePackagePatterns": ["^eslint"],
       "enabled": false
     }
   ]
 }
 ```
 
-For more details on supported syntax see Renovate's [string pattern matching documentation](./string-pattern-matching.md).
+### matchCategories
 
-### matchBaseBranches
+Use `matchCategories` to restrict rules to a particular language or group.
+Matching is done using "any" logic, i.e. "match any of the following categories".
+The categories can be found in the [manager documentation](modules/manager/index.md).
 
-Use this field to restrict rules to a particular branch. e.g.
+<!-- prettier-ignore -->
+!!! note
+    Rules with `matchCategories` are only applied _after_ extraction of dependencies.
+    If you want to configure which managers are being extracted at all, use `enabledManagers` instead.
 
 ```json
 {
   "packageRules": [
     {
-      "matchBaseBranches": ["main"],
-      "excludePackagePatterns": ["^eslint"],
-      "enabled": false
+      "matchCategories": ["python"],
+      "addLabels": ["py"]
     }
   ]
 }
 ```
 
-This field also supports Regular Expressions if they begin and end with `/`. e.g.
+### matchConfidence
 
-```json
+<!-- prettier-ignore -->
+!!! warning
+    This configuration option needs a Mend API key, and is in private beta testing only.
+    API keys are not available for free or via the `renovatebot/renovate` repository.
+
+```json title="Grouping high merge confidence updates"
 {
   "packageRules": [
     {
-      "matchBaseBranches": ["/^release/.*/"],
-      "excludePackagePatterns": ["^eslint"],
-      "enabled": false
+      "matchConfidence": ["high", "very high"],
+      "groupName": "high merge confidence"
     }
   ]
 }
 ```
 
-### matchManagers
+### matchCurrentAge
 
-Use this field to restrict rules to a particular package manager. e.g.
+Use this field if you want to match packages based on the age of the _current_ (existing, in-repo) version.
+
+For example, if you want to group updates for dependencies where the existing version is more than 2 years old:
 
 ```json
 {
   "packageRules": [
     {
-      "matchPackageNames": ["node"],
-      "matchManagers": ["dockerfile"],
-      "enabled": false
+      "matchCurrentAge": "> 2 years",
+      "groupName": "old dependencies"
     }
   ]
 }
 ```
 
-For the full list of available managers, see the [Supported Managers](modules/manager/index.md#supported-managers) documentation.
-
-### matchMessage
-
-For log level remapping, use this field to match against the particular log messages.
-
-For more details on supported syntax see Renovate's [string pattern matching documentation](./string-pattern-matching.md).
-
-### matchDatasources
+The `matchCurrentAge` string must start with one of `>`, `>=`, `<` or `<=`.
 
-Use this field to restrict rules to a particular datasource. e.g.
+Only _one_ date part is supported, so you _cannot_ do `> 1 year 1 month`.
+Instead you should do `> 13 months`.
 
-```json
-{
-  "packageRules": [
-    {
-      "matchDatasources": ["orb"],
-      "labels": ["circleci-orb!!"]
-    }
-  ]
-}
-```
+<!-- prettier-ignore -->
+!!! note
+    We recommend you only use the words hour(s), day(s), week(s), month(s) and year(s) in your time ranges.
 
 ### matchCurrentValue
 
@@ -2875,6 +2852,34 @@ Use the syntax `!/ /` like this:
 }
 ```
 
+### matchDatasources
+
+Use this field to restrict rules to a particular datasource. e.g.
+
+```json
+{
+  "packageRules": [
+    {
+      "matchDatasources": ["orb"],
+      "labels": ["circleci-orb!!"]
+    }
+  ]
+}
+```
+
+### matchDepNames
+
+This field behaves the same as `matchPackageNames` except it matches against `depName` instead of `packageName`.
+
+### matchDepPatterns
+
+### matchDepPrefixes
+
+### matchDepTypes
+
+Use this field if you want to limit a `packageRule` to certain `depType` values.
+Invalid if used outside of a `packageRule`.
+
 ### matchFileNames
 
 Renovate will compare `matchFileNames` glob matching against the dependency's package file and also lock file if one exists.
@@ -2922,13 +2927,29 @@ The following example matches any file in directories starting with `app/`:
 
 It is recommended that you avoid using "negative" globs, like `**/!(package.json)`, because such patterns might still return true if they match against the lock file name (e.g. `package-lock.json`).
 
-### matchDepNames
+### matchManagers
 
-This field behaves the same as `matchPackageNames` except it matches against `depName` instead of `packageName`.
+Use this field to restrict rules to a particular package manager. e.g.
 
-### matchDepPatterns
+```json
+{
+  "packageRules": [
+    {
+      "matchPackageNames": ["node"],
+      "matchManagers": ["dockerfile"],
+      "enabled": false
+    }
+  ]
+}
+```
 
-### matchDepPrefixes
+For the full list of available managers, see the [Supported Managers](modules/manager/index.md#supported-managers) documentation.
+
+### matchMessage
+
+For log level remapping, use this field to match against the particular log messages.
+
+For more details on supported syntax see Renovate's [string pattern matching documentation](./string-pattern-matching.md).
 
 ### matchNewValue
 
@@ -3049,6 +3070,23 @@ Like the earlier `matchPackagePatterns` example, the above will configure `range
     If the fallback is used, Renovate will log a warning, because the fallback will be removed in a future release.
     Use `matchDepPatterns` instead.
 
+### matchRepositories
+
+Use this field to restrict rules to a particular repository. e.g.
+
+```json
+{
+  "packageRules": [
+    {
+      "matchRepositories": ["literal/repo", "/^some/.*$/", "**/*-archived"],
+      "enabled": false
+    }
+  ]
+}
+```
+
+For more details on supported syntax see Renovate's [string pattern matching documentation](./string-pattern-matching.md).
+
 ### matchSourceUrlPrefixes
 
 Here's an example of where you use this to group together all packages from the `renovatebot` GitHub org:
@@ -3102,24 +3140,6 @@ For example to apply a special label to `major` updates:
     When setting up automerge for dependencies, make sure to stop accidental automerges of `0.x` versions.
     Read the [automerge non-major updates](./key-concepts/automerge.md#automerge-non-major-updates) docs for a config example that blocks `0.x` updates.
 
-### matchConfidence
-
-<!-- prettier-ignore -->
-!!! warning
-    This configuration option needs a Mend API key, and is in private beta testing only.
-    API keys are not available for free or via the `renovatebot/renovate` repository.
-
-```json title="Grouping high merge confidence updates"
-{
-  "packageRules": [
-    {
-      "matchConfidence": ["high", "very high"],
-      "groupName": "high merge confidence"
-    }
-  ]
-}
-```
-
 Tokens can be configured via `hostRules` using the `"merge-confidence"` `hostType`:
 
 ```json
@@ -3133,26 +3153,39 @@ Tokens can be configured via `hostRules` using the `"merge-confidence"` `hostTyp
 }
 ```
 
-### changelogUrl
+### prPriority
 
-Use this field to set the changelog URL for a package, including overriding any existing one.
-Using this field we can specify the exact URL to fetch changelogs from.
+Sometimes Renovate needs to rate limit its creation of PRs, e.g. hourly or concurrent PR limits.
+By default, Renovate sorts/prioritizes based on the update type, going from smallest update to biggest update.
+Renovate creates update PRs in this order:
 
-```json title="Setting the changelog URL for the dummy package"
+1. `pinDigest`
+1. `pin`
+1. `digest`
+1. `patch`
+1. `minor`
+1. `major`
+
+If you have dependencies that are more or less important than others then you can use the `prPriority` field for PR sorting.
+The default value is 0, so setting a negative value will make dependencies sort last, while higher values sort first.
+
+Here's an example of how you would define PR priority so that `devDependencies` are raised last and `react` is raised first:
+
+```json
 {
   "packageRules": [
     {
-      "matchPackageNames": ["dummy"],
-      "changelogUrl": "https://github.com/org/dummy"
+      "matchDepTypes": ["devDependencies"],
+      "prPriority": -1
+    },
+    {
+      "matchPackageNames": ["react"],
+      "prPriority": 5
     }
   ]
 }
 ```
 
-<!-- prettier-ignore -->
-!!! note
-    Renovate can fetch changelogs from Bitbucket, Gitea (Forgejo), GitHub and GitLab platforms only, and setting the URL to an unsupported host/platform type won't change that.
-
 ### replacementName
 
 This config option only works with some managers.
@@ -3243,22 +3276,6 @@ For example to replace the npm package `jade` with version `2.0.0` of the packag
 }
 ```
 
-### sourceUrl
-
-Use this field to set the source URL for a package, including overriding an existing one.
-Source URLs are necessary to link to the source of the package and in order to look up changelogs.
-
-```json title="Setting the source URL for the dummy package"
-{
-  "packageRules": [
-    {
-      "matchPackageNames": ["dummy"],
-      "sourceUrl": "https://github.com/org/dummy"
-    }
-  ]
-}
-```
-
 ### sourceDirectory
 
 Use this field to set the directory in which the package is present at the source of the package.
@@ -3279,34 +3296,17 @@ Use this field to set the directory in which the package is present at the sourc
 !!! note
     `sourceDirectory` should be only be configured along with `sourceUrl`.
 
-### prPriority
-
-Sometimes Renovate needs to rate limit its creation of PRs, e.g. hourly or concurrent PR limits.
-By default, Renovate sorts/prioritizes based on the update type, going from smallest update to biggest update.
-Renovate creates update PRs in this order:
-
-1. `pinDigest`
-1. `pin`
-1. `digest`
-1. `patch`
-1. `minor`
-1. `major`
-
-If you have dependencies that are more or less important than others then you can use the `prPriority` field for PR sorting.
-The default value is 0, so setting a negative value will make dependencies sort last, while higher values sort first.
+### sourceUrl
 
-Here's an example of how you would define PR priority so that `devDependencies` are raised last and `react` is raised first:
+Use this field to set the source URL for a package, including overriding an existing one.
+Source URLs are necessary to link to the source of the package and in order to look up changelogs.
 
-```json
+```json title="Setting the source URL for the dummy package"
 {
   "packageRules": [
     {
-      "matchDepTypes": ["devDependencies"],
-      "prPriority": -1
-    },
-    {
-      "matchPackageNames": ["react"],
-      "prPriority": 5
+      "matchPackageNames": ["dummy"],
+      "sourceUrl": "https://github.com/org/dummy"
     }
   ]
 }
@@ -3420,6 +3420,12 @@ You can use variable templating in your commands as long as [`allowPostUpgradeCo
 !!! note
     Do not use `git add` in your commands to add new files to be tracked, add them by including them in your [`fileFilters`](#filefilters) instead.
 
+### executionMode
+
+Defaults to `update`, but can also be set to `branch`.
+This sets the level the postUpgradeTask runs on, if set to `update` the postUpgradeTask will be executed for every dependency on the branch.
+If set to `branch` the postUpgradeTask is executed for the whole branch.
+
 ### fileFilters
 
 A list of glob-style matchers that determine which files will be included in the final commit made by Renovate.
@@ -3428,12 +3434,6 @@ Dotfiles are included.
 Optional field which defaults to any non-ignored file in the repo (`**/*` glob pattern).
 Specify a custom value for this if you wish to exclude certain files which are modified by your `postUpgradeTasks` and you don't want committed.
 
-### executionMode
-
-Defaults to `update`, but can also be set to `branch`.
-This sets the level the postUpgradeTask runs on, if set to `update` the postUpgradeTask will be executed for every dependency on the branch.
-If set to `branch` the postUpgradeTask is executed for the whole branch.
-
 ## prBodyColumns
 
 Use this array to provide a list of column names you wish to include in the PR tables.
diff --git a/test/documentation.spec.ts b/test/documentation.spec.ts
index 6d1d54ce339926453d662d654eb91a2095e9b860..16f0c431cb2a830172de7d9cd9b9b1fc8b143628 100644
--- a/test/documentation.spec.ts
+++ b/test/documentation.spec.ts
@@ -19,6 +19,25 @@ describe('documentation', () => {
   });
 
   describe('website-documentation', () => {
+    function getConfigOptionSubHeaders(
+      file: string,
+      configOption: string,
+    ): string[] {
+      const subHeadings = [];
+      const content = fs.readFileSync(`docs/usage/${file}`, 'utf8');
+      const reg = regEx(`##\\s${configOption}[\\s\\S]+?\n##\\s`);
+      const match = reg.exec(content);
+      const subHeadersMatch = match?.[0]?.matchAll(/\n###\s(?<child>\w+)\n/g);
+      if (subHeadersMatch) {
+        for (const subHeaderStr of subHeadersMatch) {
+          if (subHeaderStr?.groups?.child) {
+            subHeadings.push(subHeaderStr.groups.child);
+          }
+        }
+      }
+      return subHeadings;
+    }
+
     describe('docs/usage/configuration-options.md', () => {
       function getConfigHeaders(file: string): string[] {
         const content = fs.readFileSync(`docs/usage/${file}`, 'utf8');
@@ -64,11 +83,42 @@ describe('documentation', () => {
           .sort();
       }
 
+      function getParentNames(): Set<string> {
+        const childrens = options
+          .filter((option) => option.stage !== 'global')
+          .filter((option) => !option.globalOnly)
+          .filter((option) => option.parents);
+
+        const parentNames = new Set<string>();
+        for (const children of childrens) {
+          const parents = children.parents ?? [];
+          for (const parent of parents) {
+            parentNames.add(parent);
+          }
+        }
+
+        return parentNames;
+      }
+
       it('has headers for every required sub-option', () => {
         expect(getConfigSubHeaders('configuration-options.md')).toEqual(
           getRequiredConfigSubOptions(),
         );
       });
+
+      it.each([...getParentNames()])(
+        '%s has sub-headers sorted alphabetically',
+        (parentName: string) => {
+          expect(
+            getConfigOptionSubHeaders('configuration-options.md', parentName),
+          ).toEqual(
+            getConfigOptionSubHeaders(
+              'configuration-options.md',
+              parentName,
+            ).sort(),
+          );
+        },
+      );
     });
 
     describe('docs/usage/self-hosted-configuration.md', () => {