diff --git a/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml b/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a52dacbe229ae3db9738cdeeab6d98a587e735db
--- /dev/null
+++ b/config/feature_flags/development/use_500_page_size_for_contribution_analytics.yml
@@ -0,0 +1,8 @@
+---
+name: use_500_page_size_for_contribution_analytics
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136724
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/431595
+milestone: '16.7'
+type: development
+group: group::optimize
+default_enabled: false
diff --git a/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue b/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue
index 43a89dcb7afcdff76388b10483f43796adf39a29..2b4734b2d8cc1a32afc5d0da3d7b8b740385e1a2 100644
--- a/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue
+++ b/ee/app/assets/javascripts/analytics/contribution_analytics/components/app.vue
@@ -84,10 +84,12 @@ export default {
 
       try {
         const { endDate, nextStartDate } = this.limitPostgresqlRequests(startDate, this.endDate);
+        const pageSize = gon.features?.use500PageSizeForContributionAnalytics ? 500 : null;
 
         const { data } = await this.$apollo.query({
           query: contributionsQuery,
           variables: {
+            first: pageSize,
             fullPath: this.fullPath,
             startDate,
             endDate,
diff --git a/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql b/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql
index f09d08fc2105ae735f2efa64bc4e8686032e244c..adbe03d3c93f14029825775dec7c63cf72103fe9 100644
--- a/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql
+++ b/ee/app/assets/javascripts/analytics/contribution_analytics/graphql/contributions.query.graphql
@@ -3,10 +3,11 @@ query getContributionsData(
   $startDate: ISO8601Date!
   $endDate: ISO8601Date!
   $nextPageCursor: String = ""
+  $first: Int
 ) {
   group(fullPath: $fullPath) {
     id
-    contributions(from: $startDate, to: $endDate, after: $nextPageCursor) {
+    contributions(from: $startDate, to: $endDate, first: $first, after: $nextPageCursor) {
       nodes {
         repoPushed
         mergeRequestsCreated
diff --git a/ee/app/controllers/groups/contribution_analytics_controller.rb b/ee/app/controllers/groups/contribution_analytics_controller.rb
index 17cb4247a0a6cab23dc1215efa9356707d8a150d..db24ad0647d783fc3805ceb4d651d1d30610b723 100644
--- a/ee/app/controllers/groups/contribution_analytics_controller.rb
+++ b/ee/app/controllers/groups/contribution_analytics_controller.rb
@@ -23,6 +23,8 @@ def show
     # https://gitlab.com/gitlab-org/gitlab/-/issues/428585
     @data_source_clickhouse = Feature.enabled?(:clickhouse_data_collection, group)
 
+    push_frontend_feature_flag(:use_500_page_size_for_contribution_analytics, group)
+
     respond_to do |format|
       format.html
       format.json do
diff --git a/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb b/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb
index 18ccff0157d5824da617b1c5ec0c8a69ac5ca3e2..1d49088a9cf963e97e57ef27802ca84b66f5277a 100644
--- a/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb
+++ b/ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb
@@ -17,6 +17,9 @@ class ContributionsResolver < BaseResolver
                                                    "The end date must be within #{NUMBER_OF_DAYS} days after the start date."
         # rubocop:enable Layout/LineLength
 
+        max_page_size 500
+        default_page_size GitlabSchema.default_max_page_size # ensure backwards compability
+
         def resolve(from:, to:)
           validate_date_range!(from, to)
 
diff --git a/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js b/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js
index 8264db4e334ea85cc9597b63ffbdeb880daa4d9d..544c27ab86deaf697d203e5f8af412f9a5fb56fa 100644
--- a/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js
+++ b/ee/spec/frontend/analytics/contribution_analytics/components/app_spec.js
@@ -39,6 +39,7 @@ describe('Contribution Analytics App', () => {
     wrapper = shallowMount(App, {
       apolloProvider,
       propsData: {
+        first: null,
         fullPath: 'test',
         startDate: '2000-12-10',
         endDate: '2000-12-31',
@@ -71,6 +72,7 @@ describe('Contribution Analytics App', () => {
     results.forEach((result) =>
       expect(resolver).toHaveBeenCalledWith({
         fullPath: wrapper.props('fullPath'),
+        first: null,
         ...result,
       }),
     );
@@ -95,6 +97,35 @@ describe('Contribution Analytics App', () => {
     expect(findErrorAlert().text()).toEqual(wrapper.vm.$options.i18n.error);
   });
 
+  it('fetches a page size of 500 when use_500_page_size_for_contribution_analytics is enabled', async () => {
+    gon.features = { use500PageSizeForContributionAnalytics: true };
+
+    const contributionsQueryResolver = jest
+      .fn()
+      .mockResolvedValueOnce(mockApiResponse({ endCursor: nextPageCursor }))
+      .mockResolvedValueOnce(mockApiResponse());
+
+    createWrapper({ contributionsQueryResolver, props: { dataSourceClickhouse: true } });
+    await waitForPromises();
+
+    expectGroupMembersTableToHaveData();
+
+    expectContributionsQueryResolverCalls(contributionsQueryResolver, [
+      {
+        first: 500,
+        startDate: '2000-12-10',
+        endDate: '2000-12-31',
+        nextPageCursor: '',
+      },
+      {
+        first: 500,
+        startDate: '2000-12-10',
+        endDate: '2000-12-31',
+        nextPageCursor,
+      },
+    ]);
+  });
+
   it('fetches Clickhouse data, using paginated requests when necessary', async () => {
     const contributionsQueryResolver = jest
       .fn()