diff --git a/app/assets/javascripts/webhooks/components/webhook_form_app.vue b/app/assets/javascripts/webhooks/components/webhook_form_app.vue
index 8b6527ee2dd159d8b011ddcc0931239d5f3a085a..dce4771e467785fb1407c27111cdf9f99e22f4e6 100644
--- a/app/assets/javascripts/webhooks/components/webhook_form_app.vue
+++ b/app/assets/javascripts/webhooks/components/webhook_form_app.vue
@@ -1,5 +1,4 @@
 <script>
-import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
 import FormUrlApp from './form_url_app.vue';
 import FormCustomHeaders from './form_custom_headers.vue';
 
@@ -8,7 +7,6 @@ export default {
     FormUrlApp,
     FormCustomHeaders,
   },
-  mixins: [glFeatureFlagsMixin()],
   props: {
     initialUrl: {
       type: String,
@@ -32,9 +30,6 @@ export default {
 <template>
   <div>
     <form-url-app :initial-url="initialUrl" :initial-url-variables="initialUrlVariables" />
-    <form-custom-headers
-      v-if="glFeatures.customWebhookHeaders"
-      :initial-custom-headers="initialCustomHeaders"
-    />
+    <form-custom-headers :initial-custom-headers="initialCustomHeaders" />
   </div>
 </template>
diff --git a/app/controllers/concerns/web_hooks/hook_actions.rb b/app/controllers/concerns/web_hooks/hook_actions.rb
index e3a88487e4af20936abc0c4dd74f0c9ad9692de6..15725c629f6f3220fb6aa726ac8cfd2d1993545d 100644
--- a/app/controllers/concerns/web_hooks/hook_actions.rb
+++ b/app/controllers/concerns/web_hooks/hook_actions.rb
@@ -10,14 +10,6 @@ module HookActions
 
       before_action :hook_logs, only: :edit
       feature_category :webhooks
-
-      before_action only: %i[edit update] do
-        push_frontend_feature_flag(:custom_webhook_headers, hook.parent, type: :beta)
-      end
-
-      before_action only: :index do
-        push_frontend_feature_flag(:custom_webhook_headers, @project || @group, type: :beta)
-      end
     end
 
     def index
diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb
index 9e1d80ad056979227b1b314f5c33579a6afdb1ee..dd14f71b793c9ba7a62df987b976f61010ecf571 100644
--- a/app/services/web_hook_service.rb
+++ b/app/services/web_hook_service.rb
@@ -218,7 +218,6 @@ def build_headers
 
   def build_custom_headers(values_redacted: false)
     return {} unless hook.custom_headers.present?
-    return {} unless Feature.enabled?(:custom_webhook_headers, hook.parent, type: :beta)
 
     return hook.custom_headers.transform_values { '[REDACTED]' } if values_redacted
 
diff --git a/config/feature_flags/beta/custom_webhook_headers.yml b/config/feature_flags/beta/custom_webhook_headers.yml
deleted file mode 100644
index 0d0eaacf0c229320c3e58f3f1bedafc4a57488ec..0000000000000000000000000000000000000000
--- a/config/feature_flags/beta/custom_webhook_headers.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-name: custom_webhook_headers
-feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/17290
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146702
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/448604
-milestone: '16.11'
-group: group::import and integrate
-type: beta
-default_enabled: true
diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md
index fe50f8b581120f28fa7f8330a223f271596168c2..7fc712318dcc28b203870cfb9dc3ad424d82c536 100644
--- a/doc/user/project/integrations/webhooks.md
+++ b/doc/user/project/integrations/webhooks.md
@@ -110,11 +110,7 @@ Otherwise, a `URI is invalid` error occurs.
 ## Custom headers
 
 > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146702) in GitLab 16.11 [with a flag](../../../administration/feature_flags.md) named `custom_webhook_headers`. Enabled by default.
-
-FLAG:
-On self-managed GitLab, by default this feature is available. To hide the feature, an administrator can
-[disable the feature flag](../../../administration/feature_flags.md) named `custom_webhook_headers`.
-On GitLab.com and GitLab Dedicated, this feature is available.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/448604) in GitLab 17.0. Feature flag `custom_webhook_headers` removed.
 
 You can add up to 20 custom headers in the webhook configuration as part of the request.
 You can use these custom headers for authentication to external services.
diff --git a/spec/services/web_hook_service_spec.rb b/spec/services/web_hook_service_spec.rb
index 7bb01f37ce648e647a2c08b6e059b636bff43c82..8e6bf22282347053a5b483aad7de0e9bc17edf77 100644
--- a/spec/services/web_hook_service_spec.rb
+++ b/spec/services/web_hook_service_spec.rb
@@ -464,19 +464,6 @@
             .with(headers: Gitlab::WebHooks::RecursionDetection.header(project_hook))
         end
       end
-
-      context 'when custom_webhook_headers feature flag is disabled' do
-        before do
-          stub_feature_flags(custom_webhook_headers: false)
-        end
-
-        it 'sends request without custom headers' do
-          service_instance.execute
-
-          expect(WebMock).to have_requested(:post, stubbed_hostname(project_hook.url))
-            .with(headers: headers)
-        end
-      end
     end
 
     it 'handles 200 status code' do