diff --git a/x-pack/plugins/apm/public/services/rest/observability.dashboard.test.ts b/x-pack/plugins/apm/public/services/rest/observability.dashboard.test.ts
index dbb5d6029d0f1..a14d827eeaec5 100644
--- a/x-pack/plugins/apm/public/services/rest/observability.dashboard.test.ts
+++ b/x-pack/plugins/apm/public/services/rest/observability.dashboard.test.ts
@@ -58,7 +58,7 @@ describe('Observability dashboard data', () => {
           transactions: {
             type: 'number',
             label: 'Transactions',
-            value: 6,
+            value: 2,
             color: '#6092c0',
           },
         },
@@ -115,5 +115,45 @@ describe('Observability dashboard data', () => {
         },
       });
     });
+    it('returns transaction stat as 0 when y is undefined', async () => {
+      callApmApiMock.mockImplementation(() =>
+        Promise.resolve({
+          serviceCount: 0,
+          transactionCoordinates: [{ x: 1 }, { x: 2 }, { x: 3 }],
+        })
+      );
+      const response = await fetchLandingPageData(
+        {
+          startTime: '1',
+          endTime: '2',
+          bucketSize: '3',
+        },
+        { theme }
+      );
+      expect(response).toEqual({
+        title: 'APM',
+        appLink: '/app/apm',
+        stats: {
+          services: {
+            type: 'number',
+            label: 'Services',
+            value: 0,
+          },
+          transactions: {
+            type: 'number',
+            label: 'Transactions',
+            value: 0,
+            color: '#6092c0',
+          },
+        },
+        series: {
+          transactions: {
+            label: 'Transactions',
+            coordinates: [{ x: 1 }, { x: 2 }, { x: 3 }],
+            color: '#6092c0',
+          },
+        },
+      });
+    });
   });
 });
diff --git a/x-pack/plugins/apm/public/services/rest/observability_dashboard.ts b/x-pack/plugins/apm/public/services/rest/observability_dashboard.ts
index 2107565c5facf..589199221d7a9 100644
--- a/x-pack/plugins/apm/public/services/rest/observability_dashboard.ts
+++ b/x-pack/plugins/apm/public/services/rest/observability_dashboard.ts
@@ -5,7 +5,7 @@
  */
 
 import { i18n } from '@kbn/i18n';
-import { sum } from 'lodash';
+import mean from 'lodash.mean';
 import { Theme } from '@kbn/ui-shared-deps/theme';
 import {
   ApmFetchDataResponse,
@@ -48,7 +48,12 @@ export const fetchLandingPageData = async (
           'xpack.apm.observabilityDashboard.stats.transactions',
           { defaultMessage: 'Transactions' }
         ),
-        value: sum(transactionCoordinates.map((coordinates) => coordinates.y)),
+        value:
+          mean(
+            transactionCoordinates
+              .map(({ y }) => y)
+              .filter((y) => y && isFinite(y))
+          ) || 0,
         color: theme.euiColorVis1,
       },
     },
diff --git a/x-pack/plugins/apm/server/lib/observability_dashboard/get_transaction_coordinates.ts b/x-pack/plugins/apm/server/lib/observability_dashboard/get_transaction_coordinates.ts
index e78a3c1cec24a..0d1a4274c16dc 100644
--- a/x-pack/plugins/apm/server/lib/observability_dashboard/get_transaction_coordinates.ts
+++ b/x-pack/plugins/apm/server/lib/observability_dashboard/get_transaction_coordinates.ts
@@ -41,17 +41,18 @@ export async function getTransactionCoordinates({
             field: '@timestamp',
             fixed_interval: bucketSize,
             min_doc_count: 0,
-            extended_bounds: { min: start, max: end },
           },
         },
       },
     },
   });
 
+  const deltaAsMinutes = (end - start) / 1000 / 60;
+
   return (
     aggregations?.distribution.buckets.map((bucket) => ({
       x: bucket.key,
-      y: bucket.doc_count,
+      y: bucket.doc_count / deltaAsMinutes,
     })) || []
   );
 }