diff --git a/.eslintrc.yml b/.eslintrc.yml
index 1bb28aae21aa432cd6ed5a41133809d9c1988b6f..b0ed0343b5db72c599fba51399a2bf3c19467c43 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -117,6 +117,14 @@ rules:
       message: 'Migrate to GlSkeletonLoader, or import GlDeprecatedSkeletonLoading.'
     - selector: ImportSpecifier[imported.name='GlSafeHtmlDirective']
       message: 'Use directive at ~/vue_shared/directives/safe_html.js instead.'
+    - selector: Literal[value=/docs.gitlab.+\u002Fee/]
+      message: 'No hard coded url, use `DOCS_URL_IN_EE_DIR` in `jh_else_ce/lib/utils/url_utility`'
+    - selector: Literal[value=/(?=.*docs.gitlab.*)(?=^(?!.*\u002Fee\b).*$)/]
+      message: 'No hard coded url, use `DOCS_URL` in `jh_else_ce/lib/utils/url_utility`'
+    - selector: Literal[value=/(?=.*about.gitlab.*)(?=^(?!.*\u002Fblog\b).*$)/]
+      message: 'No hard coded url, use `PROMO_URL` in `jh_else_ce/lib/utils/url_utility`'
+    - selector: TemplateLiteral[expressions.0.name=DOCS_URL] > TemplateElement[value.cooked=/\u002Fjh/]
+      message: '`/ee` or `/jh` path found in docs url, use `DOCS_URL_IN_EE_DIR` in `jh_else_ce/lib/utils/url_utility`'
   no-restricted-imports:
     - error
     - paths:
diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml
index a4addfce491723a9ba93ccc367ca1074acac8873..9f225dabd440b7e8b26bb344e7fd6240cef2fd3e 100644
--- a/.gitlab/ci/rules.gitlab-ci.yml
+++ b/.gitlab/ci/rules.gitlab-ci.yml
@@ -465,7 +465,7 @@
   - ".stylelintrc"
   - "Dockerfile.assets"
   - "vendor/assets/**/*"
-  - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
+  - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
   - "*_VERSION"
   - "{,jh/}Gemfile{,.lock}"
   - "Rakefile"
@@ -492,7 +492,7 @@
   - ".stylelintrc"
   - "Dockerfile.assets"
   - "vendor/assets/**/*"
-  - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
+  - ".{eslintrc.yml,eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}"
   - ".gitlab-ci.yml"
   - "*_VERSION"
   - "{,jh/}Gemfile{,.lock}"
diff --git a/app/assets/javascripts/lib/logger/hello.js b/app/assets/javascripts/lib/logger/hello.js
index ccfdfe91e60f23c76899af7c04f66485d10a68af..4ad99ec09d827ed87549abe8174024066f1855c4 100644
--- a/app/assets/javascripts/lib/logger/hello.js
+++ b/app/assets/javascripts/lib/logger/hello.js
@@ -1,4 +1,5 @@
 import { s__, sprintf } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 const HANDSHAKE = String.fromCodePoint(0x1f91d);
 const MAG = String.fromCodePoint(0x1f50e);
@@ -15,7 +16,7 @@ ${s__(
 
 ${sprintf(s__('HelloMessage|%{handshake_emoji} Contribute to GitLab: %{contribute_link}'), {
   handshake_emoji: `${HANDSHAKE}`,
-  contribute_link: 'https://about.gitlab.com/community/contribute/',
+  contribute_link: `${PROMO_URL}/community/contribute/`,
 })}
 ${sprintf(s__('HelloMessage|%{magnifier_emoji} Create a new GitLab issue: %{new_issue_link}'), {
   magnifier_emoji: `${MAG}`,
@@ -27,7 +28,7 @@ ${
         s__(
           'HelloMessage|%{rocket_emoji} We like your curiosity! Help us improve GitLab by joining the team: %{jobs_page_link}',
         ),
-        { rocket_emoji: `${ROCKET}`, jobs_page_link: 'https://about.gitlab.com/jobs/' },
+        { rocket_emoji: `${ROCKET}`, jobs_page_link: `${PROMO_URL}/jobs/` },
       )}`
     : ''
 }`,
diff --git a/app/assets/javascripts/projects/compare/constants.js b/app/assets/javascripts/projects/compare/constants.js
index f689d543455383dc7356cd1a788205f43b4f5df7..2f07cf57521fa15a2e6b720de9d9e99239bbc31b 100644
--- a/app/assets/javascripts/projects/compare/constants.js
+++ b/app/assets/javascripts/projects/compare/constants.js
@@ -1,4 +1,5 @@
 import { __, s__ } from '~/locale';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
 
 export const COMPARE_OPTIONS_INPUT_NAME = 'straight';
 export const COMPARE_OPTIONS = [
@@ -21,5 +22,4 @@ export const I18N = {
   openMr: s__('CompareRevisions|Create merge request'),
 };
 
-export const COMPARE_REVISIONS_DOCS_URL =
-  'https://docs.gitlab.com/ee/user/project/repository/branches/#compare-branches';
+export const COMPARE_REVISIONS_DOCS_URL = `${DOCS_URL_IN_EE_DIR}/user/project/repository/branches/#compare-branches`;
diff --git a/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_activation_errors.vue b/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_activation_errors.vue
index 7684ce352e69f6b188255cd4033c5a485eab39e7..bcd721fd2b2dea1458e6cf6333cca07add1b8538 100644
--- a/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_activation_errors.vue
+++ b/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_activation_errors.vue
@@ -2,6 +2,7 @@
 import { GlAlert, GlLink, GlSprintf } from '@gitlab/ui';
 import { s__ } from '~/locale';
 import { helpPagePath } from '~/helpers/help_page_helper';
+import { PROMO_URL, DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
 import {
   CONNECTIVITY_ERROR,
   howToActivateSubscription,
@@ -62,7 +63,7 @@ export const i18n = Object.freeze({
 });
 
 export const links = Object.freeze({
-  purchaseSubscriptionLink: 'https://about.gitlab.com/pricing/',
+  purchaseSubscriptionLink: `${PROMO_URL}/pricing/`,
   supportLink,
   licenseSupportLink:
     'https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293',
@@ -70,10 +71,9 @@ export const links = Object.freeze({
   troubleshootingHelpLink: helpPagePath('/user/admin_area/license.html', {
     anchor: 'cannot-activate-instance-due-to-connectivity-error',
   }),
-  addSeats: 'https://docs.gitlab.com/ee/subscriptions/self_managed/#add-seats-to-a-subscription',
-  deactivateUser:
-    'https://docs.gitlab.com/ee/user/admin_area/moderate_users.html#deactivate-a-user',
-  blockUser: 'https://docs.gitlab.com/ee/user/admin_area/moderate_users.html#block-a-user',
+  addSeats: `${DOCS_URL_IN_EE_DIR}/subscriptions/self_managed/#add-seats-to-a-subscription`,
+  deactivateUser: `${DOCS_URL_IN_EE_DIR}/user/admin_area/moderate_users.html#deactivate-a-user`,
+  blockUser: `${DOCS_URL_IN_EE_DIR}/user/admin_area/moderate_users.html#block-a-user`,
 });
 
 export default {
diff --git a/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_details_user_info.vue b/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_details_user_info.vue
index b62419f0980fe16eda3040c85ad9e914b134d829..5a79ef5fe4aa123b4586a39792f7a7831167bb06 100644
--- a/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_details_user_info.vue
+++ b/ee/app/assets/javascripts/admin/subscriptions/show/components/subscription_details_user_info.vue
@@ -2,12 +2,12 @@
 import { GlCard, GlLink, GlSprintf } from '@gitlab/ui';
 import { helpPagePath } from '~/helpers/help_page_helper';
 import { s__, n__, __ } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 export const billableUsersURL = helpPagePath('subscriptions/self_managed/index', {
   anchor: 'billable-users',
 });
-export const trueUpURL =
-  'https://about.gitlab.com/pricing/licensing-faq/#what-does-users-over-license-mean';
+export const trueUpURL = `${PROMO_URL}/pricing/licensing-faq/#what-does-users-over-license-mean`;
 
 export const usersInSubscriptionUnlimited = __('Unlimited');
 
diff --git a/ee/app/assets/javascripts/billings/qrtly_reconciliation/constants.js b/ee/app/assets/javascripts/billings/qrtly_reconciliation/constants.js
index f5a19cab556af21e0ebd10b474e276b1c7b1df86..013f420b05dc14ea4d8f2e62de391479f376c2bb 100644
--- a/ee/app/assets/javascripts/billings/qrtly_reconciliation/constants.js
+++ b/ee/app/assets/javascripts/billings/qrtly_reconciliation/constants.js
@@ -1,5 +1,6 @@
 import { helpPagePath } from '~/helpers/help_page_helper';
 import { s__, __ } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 const qrtlyReconciliationHelpPageUrl = helpPagePath('subscriptions/quarterly_reconciliation');
 
@@ -22,7 +23,7 @@ Otherwise, you will receive an invoice. For more information about the timing of
     },
     secondary: {
       text: __('Contact support'),
-      link: 'https://about.gitlab.com/support/#contact-support',
+      link: `${PROMO_URL}/support/#contact-support`,
     },
   },
 };
diff --git a/ee/app/assets/javascripts/billings/verification_reminder/constants.js b/ee/app/assets/javascripts/billings/verification_reminder/constants.js
index 574cd322d97481da1184800a4213370e482f9c85..fc9d4e26a1c4176cbb904c7843807e38ae5b49da 100644
--- a/ee/app/assets/javascripts/billings/verification_reminder/constants.js
+++ b/ee/app/assets/javascripts/billings/verification_reminder/constants.js
@@ -1,7 +1,8 @@
 import { s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 export const FEATURE_NAME = 'verification_reminder';
-export const DOCS_LINK = 'https://docs.gitlab.com/runner/install/';
+export const DOCS_LINK = `${DOCS_URL}/runner/install/`;
 export const EVENT_LABEL = 'verification_reminder';
 export const MOUNTED_EVENT = 'shown';
 export const DISMISS_EVENT = 'dismissed';
diff --git a/ee/app/assets/javascripts/ci/runner/constants.js b/ee/app/assets/javascripts/ci/runner/constants.js
index 66cb3f391982410c3b7e86b01afd7bdf6ff6378b..6b21545f7530c6ff474ab3b2424a373e752ead1b 100644
--- a/ee/app/assets/javascripts/ci/runner/constants.js
+++ b/ee/app/assets/javascripts/ci/runner/constants.js
@@ -1,4 +1,5 @@
 import { s__ } from '~/locale';
+import { DOCS_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 // Filtered search parameter names
 // - Used for URL params names
@@ -24,7 +25,7 @@ export const I18N_UPGRADE_STATUS_RECOMMENDED_TOOLTIP = s__(
 
 // Runner install help page is external from this repo, must be
 // hardcoded because is located at https://gitlab.com/gitlab-org/gitlab-runner
-const RUNNER_HELP_PATH = 'https://docs.gitlab.com/runner';
+const RUNNER_HELP_PATH = `${DOCS_URL}/runner`;
 
 export const RUNNER_INSTALL_HELP_PATH = `${RUNNER_HELP_PATH}/install/`;
 
diff --git a/ee/app/assets/javascripts/dependencies/components/dependencies_table.vue b/ee/app/assets/javascripts/dependencies/components/dependencies_table.vue
index 6c6e7bacc4e9a582eea1c22b38da92e57fa2cb4a..50ba658c937ee87ba4067cf2db9137006d39fb0b 100644
--- a/ee/app/assets/javascripts/dependencies/components/dependencies_table.vue
+++ b/ee/app/assets/javascripts/dependencies/components/dependencies_table.vue
@@ -10,6 +10,7 @@ import {
 } from '@gitlab/ui';
 import { cloneDeep } from 'lodash';
 import { s__ } from '~/locale';
+import { DOCS_URL_IN_EE_DIR } from 'jh_else_ce/lib/utils/url_utility';
 import { NAMESPACE_PROJECT } from '../constants';
 import DependencyLicenseLinks from './dependency_license_links.vue';
 import DependencyLocation from './dependency_location.vue';
@@ -103,8 +104,7 @@ export default {
     { key: 'projects', label: s__('Dependencies|Projects'), tdClass: tdClass() },
   ],
   DEPENDENCIES_PER_PAGE: 20,
-  DEPENDENCY_PATH_LINK:
-    'https://docs.gitlab.com/ee/user/application_security/dependency_list/#dependency-paths',
+  DEPENDENCY_PATH_LINK: `${DOCS_URL_IN_EE_DIR}/user/application_security/dependency_list/#dependency-paths`,
   i18n: {
     tooltipText: s__(
       'Dependencies|The component dependency path is based on the lock file. There may be several paths. In these cases, the longest path is displayed.',
diff --git a/ee/app/assets/javascripts/dora/components/deployment_frequency_charts.vue b/ee/app/assets/javascripts/dora/components/deployment_frequency_charts.vue
index 5357b62eacb0e42737a7e6769f0c1b8c3618a9a6..22e6bf536d69d0e874d11906788836697466bc8a 100644
--- a/ee/app/assets/javascripts/dora/components/deployment_frequency_charts.vue
+++ b/ee/app/assets/javascripts/dora/components/deployment_frequency_charts.vue
@@ -14,6 +14,7 @@ import { nDaysAfter } from '~/lib/utils/datetime_utility';
 import { SUMMARY_METRICS_REQUEST } from '~/analytics/cycle_analytics/constants';
 import CiCdAnalyticsCharts from '~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue';
 import glFeaturesFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
 import DoraChartHeader from './dora_chart_header.vue';
 import {
   allChartDefinitions,
@@ -34,7 +35,7 @@ const VISIBLE_METRICS = ['deploys', 'deployment-frequency', 'deployment_frequenc
 const filterFn = (data) =>
   data.filter((d) => VISIBLE_METRICS.includes(d.identifier)).map(({ links, ...rest }) => rest);
 
-const TESTING_TERMS_URL = 'https://about.gitlab.com/handbook/legal/testing-agreement/';
+const TESTING_TERMS_URL = `${PROMO_URL}/handbook/legal/testing-agreement/`;
 
 export default {
   name: 'DeploymentFrequencyCharts',
diff --git a/ee/app/assets/javascripts/subscriptions/new/constants.js b/ee/app/assets/javascripts/subscriptions/new/constants.js
index fecf95b7989c243a755c007662022703dd7877ee..3175b1bdf9fa90788be269b9c7164bc7effce73d 100644
--- a/ee/app/assets/javascripts/subscriptions/new/constants.js
+++ b/ee/app/assets/javascripts/subscriptions/new/constants.js
@@ -1,4 +1,5 @@
 import { s__ } from '~/locale';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
 
 export const TAX_RATE = 0;
 export const NEW_GROUP = 'new_group';
@@ -30,4 +31,4 @@ export const PROMO_CODE_OFFER_TEXT = s__(
   'Checkout|Pricing reflective of %{linkStart}limited-time offer%{linkEnd}.',
 );
 
-export const PROMO_CODE_TERMS_LINK = 'https://about.gitlab.com/pricing/terms/';
+export const PROMO_CODE_TERMS_LINK = `${PROMO_URL}/pricing/terms/`;
diff --git a/ee/app/assets/javascripts/vue_shared/discover/constants.js b/ee/app/assets/javascripts/vue_shared/discover/constants.js
index 0b7036a8c1cb1a5aa898dab35ce0449d5653a381..e975376ca661b8d5e5c63e79e911a8fa1df4ebaa 100644
--- a/ee/app/assets/javascripts/vue_shared/discover/constants.js
+++ b/ee/app/assets/javascripts/vue_shared/discover/constants.js
@@ -1,2 +1,3 @@
-export const DISCOVER_PLANS_MORE_INFO_LINK =
-  'https://about.gitlab.com/pricing/saas/feature-comparison/';
+import { PROMO_URL } from 'jh_else_ce/lib/utils/url_utility';
+
+export const DISCOVER_PLANS_MORE_INFO_LINK = `${PROMO_URL}/pricing/saas/feature-comparison/`;
diff --git a/ee/app/assets/javascripts/vue_shared/purchase_flow/constants.js b/ee/app/assets/javascripts/vue_shared/purchase_flow/constants.js
index 1626a897637c1d77333fc0a0ce3b4ff775a9d9a7..4c57623634150401a708e93ae72ca530b2100f22 100644
--- a/ee/app/assets/javascripts/vue_shared/purchase_flow/constants.js
+++ b/ee/app/assets/javascripts/vue_shared/purchase_flow/constants.js
@@ -1,5 +1,6 @@
 import { s__ } from '~/locale';
 import { helpPagePath } from '~/helpers/help_page_helper';
+import { PROMO_URL, DOMAIN } from 'jh_else_ce/lib/utils/url_utility';
 
 export const GENERAL_ERROR_MESSAGE = s__(
   'PurchaseStep|An error occurred in the purchase step. If the problem persists please contact support at https://support.gitlab.com.',
@@ -7,8 +8,8 @@ export const GENERAL_ERROR_MESSAGE = s__(
 
 export const licensingAndRenewalsProblemsLink =
   'https://support.gitlab.com/hc/en-us/requests/new?ticket_form_id=360000071293';
-export const salesLink = 'https://about.gitlab.com/sales/';
-export const userProfileLink = 'https://gitlab.com/-/profile';
+export const salesLink = `${PROMO_URL}/sales/`;
+export const userProfileLink = `https://${DOMAIN}/-/profile`;
 export const linkCustomersPortalHelpLink = helpPagePath('subscriptions/customers_portal', {
   anchor: '#change-the-linked-account',
 });