diff --git a/docs/usage/self-hosted-configuration.md b/docs/usage/self-hosted-configuration.md
index 2c1af6afecbad4538db8e6e1cd3042edec422895..80fed5ff440ddf835a74caa8fe84bc608e811693 100644
--- a/docs/usage/self-hosted-configuration.md
+++ b/docs/usage/self-hosted-configuration.md
@@ -1110,6 +1110,11 @@ For example: `:warning:` will be replaced with `⚠️`.
 Some cloud providers offer services to receive metadata about the current instance, for example [AWS Instance metadata](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html) or [GCP VM metadata](https://cloud.google.com/compute/docs/metadata/overview).
 You can control if Renovate should try to access these services with the `useCloudMetadataServices` config option.
 
+## userAgent
+
+If set to any string, Renovate will use this as the `user-agent` it sends with HTTP requests.
+Otherwise, it will default to `RenovateBot/${renovateVersion} (https://github.com/renovatebot/renovate)`.
+
 ## username
 
 You may need to set a `username` if you:
diff --git a/docs/usage/self-hosted-experimental.md b/docs/usage/self-hosted-experimental.md
index fcf3c95a94e57e65c7694283846da836f782d981..1dc8fd40f5f6a010da95931a8c6a2bcb5cbba0e9 100644
--- a/docs/usage/self-hosted-experimental.md
+++ b/docs/usage/self-hosted-experimental.md
@@ -32,10 +32,6 @@ Skipping the check will speed things up, but may result in versions being return
 
 If set to any value, Renovate will always paginate requests to GitHub fully, instead of stopping after 10 pages.
 
-## `RENOVATE_USER_AGENT`
-
-If set to any string, Renovate will use this as the `user-agent` it sends with HTTP requests.
-
 ## `RENOVATE_X_AUTODISCOVER_REPO_ORDER`
 
 <!-- prettier-ignore -->
diff --git a/lib/config/global.ts b/lib/config/global.ts
index 21b2b56cc25f8d614eb61ea6239d2616cb36671a..c713f8635fd0ba89cc634b258d8a8c3406506f56 100644
--- a/lib/config/global.ts
+++ b/lib/config/global.ts
@@ -33,6 +33,7 @@ export class GlobalConfig {
     'platform',
     'endpoint',
     'httpCacheTtlDays',
+    'userAgent',
   ];
 
   private static config: RepoGlobalConfig = {};
diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts
index 995e05b93cbb90bf359fd19358e26d1f14fb9de9..76ae38a7e3326665958884acc68a7d8b073d5137 100644
--- a/lib/config/options/index.ts
+++ b/lib/config/options/index.ts
@@ -47,6 +47,14 @@ const options: RenovateOptions[] = [
     default: true,
     globalOnly: true,
   },
+  {
+    name: 'userAgent',
+    description:
+      'If set to any string, Renovate will use this as the `user-agent` it sends with HTTP requests.',
+    type: 'string',
+    default: null,
+    globalOnly: true,
+  },
   {
     name: 'allowPostUpgradeCommandTemplating',
     description:
diff --git a/lib/config/types.ts b/lib/config/types.ts
index 2e55575c98927a45acf8ef0f10a8088a5a4a342c..ff309df752a66d99ef30d5c6cf14cb12a91b283a 100644
--- a/lib/config/types.ts
+++ b/lib/config/types.ts
@@ -159,6 +159,7 @@ export interface RepoGlobalConfig {
   privateKey?: string;
   privateKeyOld?: string;
   httpCacheTtlDays?: number;
+  userAgent?: string;
 }
 
 export interface LegacyAdminConfig {
diff --git a/lib/util/http/index.ts b/lib/util/http/index.ts
index b93c659497e729ae2a6a540040b2dee3198c8ea1..7c505db6ef4bf39421b248171b4aafa4797e12a4 100644
--- a/lib/util/http/index.ts
+++ b/lib/util/http/index.ts
@@ -3,6 +3,7 @@ import merge from 'deepmerge';
 import got, { Options, RequestError } from 'got';
 import type { SetRequired } from 'type-fest';
 import { infer as Infer, type ZodError, ZodType } from 'zod';
+import { GlobalConfig } from '../../config/global';
 import { HOST_DISABLED } from '../../constants/error-messages';
 import { pkg } from '../../expose.cjs';
 import { logger } from '../../logger';
@@ -50,7 +51,7 @@ function applyDefaultHeaders(options: Options): void {
   options.headers = {
     ...options.headers,
     'user-agent':
-      process.env.RENOVATE_USER_AGENT ??
+      GlobalConfig.get('userAgent') ??
       `RenovateBot/${renovateVersion} (https://github.com/renovatebot/renovate)`,
   };
 }