Bug: [FEATURE] Add routing metrics endpoint



### Feature Description

Need to add an endpoint for routing metrics. 
Also add routing approach as a filter in payment analytics

### Possible Implementation

Need to add an endpoint for routing metrics. 
Also add routing approach as a filter in payment analytics

### Have you spent some time checking if this feature request has been raised before?

- [x] I checked and didn't find a similar issue

### Have you read the Contributing Guidelines?

- [x] I have read the [Contributing Guidelines](https://github.com/juspay/hyperswitch/blob/main/docs/CONTRIBUTING.md)

### Are you willing to submit a PR?

Yes, I am willing to submit a PR!
diff --git a/crates/analytics/docs/clickhouse/scripts/payment_attempts.sql b/crates/analytics/docs/clickhouse/scripts/payment_attempts.sql
index f5d0ca51fd7..6673b73fedb 100644
--- a/crates/analytics/docs/clickhouse/scripts/payment_attempts.sql
+++ b/crates/analytics/docs/clickhouse/scripts/payment_attempts.sql
@@ -43,6 +43,7 @@ CREATE TABLE payment_attempt_queue (
     `organization_id` String,
     `profile_id` String,
     `card_network` Nullable(String),
+    `routing_approach` LowCardinality(Nullable(String)),
     `sign_flag` Int8
 ) ENGINE = Kafka SETTINGS kafka_broker_list = 'kafka0:29092',
 kafka_topic_list = 'hyperswitch-payment-attempt-events',
@@ -96,6 +97,7 @@ CREATE TABLE payment_attempts (
     `organization_id` String,
     `profile_id` String,
     `card_network` Nullable(String),
+    `routing_approach` LowCardinality(Nullable(String)),
     `sign_flag` Int8,
     INDEX connectorIndex connector TYPE bloom_filter GRANULARITY 1,
     INDEX paymentMethodIndex payment_method TYPE bloom_filter GRANULARITY 1,
@@ -152,6 +154,7 @@ CREATE MATERIALIZED VIEW payment_attempt_mv TO payment_attempts (
     `organization_id` String,
     `profile_id` String,
     `card_network` Nullable(String),
+    `routing_approach` LowCardinality(Nullable(String)),
     `sign_flag` Int8
 ) AS
 SELECT
@@ -200,6 +203,7 @@ SELECT
     organization_id,
     profile_id,
     card_network,
+    routing_approach,
     sign_flag
 FROM
     payment_attempt_queue
diff --git a/crates/analytics/src/core.rs b/crates/analytics/src/core.rs
index 980e17bc90a..f3dd8e8eb8c 100644
--- a/crates/analytics/src/core.rs
+++ b/crates/analytics/src/core.rs
@@ -46,6 +46,11 @@ pub async fn get_domain_info(
             download_dimensions: None,
             dimensions: utils::get_dispute_dimensions(),
         },
+        AnalyticsDomain::Routing => GetInfoResponse {
+            metrics: utils::get_payment_metrics_info(),
+            download_dimensions: None,
+            dimensions: utils::get_payment_dimensions(),
+        },
     };
     Ok(info)
 }
diff --git a/crates/analytics/src/payments/core.rs b/crates/analytics/src/payments/core.rs
index 7291d2f1fcc..e55ba2726af 100644
--- a/crates/analytics/src/payments/core.rs
+++ b/crates/analytics/src/payments/core.rs
@@ -410,6 +410,7 @@ pub async fn get_filters(
             PaymentDimensions::CardLast4 => fil.card_last_4,
             PaymentDimensions::CardIssuer => fil.card_issuer,
             PaymentDimensions::ErrorReason => fil.error_reason,
+            PaymentDimensions::RoutingApproach => fil.routing_approach.map(|i| i.as_ref().to_string()),
         })
         .collect::<Vec<String>>();
         res.query_data.push(FilterValue {
diff --git a/crates/analytics/src/payments/distribution.rs b/crates/analytics/src/payments/distribution.rs
index 86a2f06c5f5..ab82e48f407 100644
--- a/crates/analytics/src/payments/distribution.rs
+++ b/crates/analytics/src/payments/distribution.rs
@@ -37,6 +37,7 @@ pub struct PaymentDistributionRow {
     pub total: Option<bigdecimal::BigDecimal>,
     pub count: Option<i64>,
     pub error_message: Option<String>,
+    pub routing_approach: Option<DBEnumWrapper<storage_enums::RoutingApproach>>,
     #[serde(with = "common_utils::custom_serde::iso8601::option")]
     pub start_bucket: Option<PrimitiveDateTime>,
     #[serde(with = "common_utils::custom_serde::iso8601::option")]
diff --git a/crates/analytics/src/payments/distribution/payment_error_message.rs b/crates/analytics/src/payments/distribution/payment_error_message.rs
index 0a92cfbe470..d5fa0569452 100644
--- a/crates/analytics/src/payments/distribution/payment_error_message.rs
+++ b/crates/analytics/src/payments/distribution/payment_error_message.rs
@@ -160,6 +160,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/filters.rs b/crates/analytics/src/payments/filters.rs
index 668bdaa6c8b..b6ebf094e81 100644
--- a/crates/analytics/src/payments/filters.rs
+++ b/crates/analytics/src/payments/filters.rs
@@ -1,6 +1,6 @@
 use api_models::analytics::{payments::PaymentDimensions, Granularity, TimeRange};
 use common_utils::errors::ReportSwitchExt;
-use diesel_models::enums::{AttemptStatus, AuthenticationType, Currency};
+use diesel_models::enums::{AttemptStatus, AuthenticationType, Currency, RoutingApproach};
 use error_stack::ResultExt;
 use time::PrimitiveDateTime;
 
@@ -65,4 +65,5 @@ pub struct PaymentFilterRow {
     pub card_issuer: Option<String>,
     pub error_reason: Option<String>,
     pub first_attempt: Option<bool>,
+    pub routing_approach: Option<DBEnumWrapper<RoutingApproach>>,
 }
diff --git a/crates/analytics/src/payments/metrics.rs b/crates/analytics/src/payments/metrics.rs
index 71d2e57d7fa..67dc50c5152 100644
--- a/crates/analytics/src/payments/metrics.rs
+++ b/crates/analytics/src/payments/metrics.rs
@@ -50,6 +50,7 @@ pub struct PaymentMetricRow {
     pub first_attempt: Option<bool>,
     pub total: Option<bigdecimal::BigDecimal>,
     pub count: Option<i64>,
+    pub routing_approach: Option<DBEnumWrapper<storage_enums::RoutingApproach>>,
     #[serde(with = "common_utils::custom_serde::iso8601::option")]
     pub start_bucket: Option<PrimitiveDateTime>,
     #[serde(with = "common_utils::custom_serde::iso8601::option")]
diff --git a/crates/analytics/src/payments/metrics/avg_ticket_size.rs b/crates/analytics/src/payments/metrics/avg_ticket_size.rs
index 10f350e30ce..8ec175cf8da 100644
--- a/crates/analytics/src/payments/metrics/avg_ticket_size.rs
+++ b/crates/analytics/src/payments/metrics/avg_ticket_size.rs
@@ -122,6 +122,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/connector_success_rate.rs b/crates/analytics/src/payments/metrics/connector_success_rate.rs
index 9e6bf31fbfb..eb4518f6d23 100644
--- a/crates/analytics/src/payments/metrics/connector_success_rate.rs
+++ b/crates/analytics/src/payments/metrics/connector_success_rate.rs
@@ -117,6 +117,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/payment_count.rs b/crates/analytics/src/payments/metrics/payment_count.rs
index 297aef4fec5..ed23a400fb7 100644
--- a/crates/analytics/src/payments/metrics/payment_count.rs
+++ b/crates/analytics/src/payments/metrics/payment_count.rs
@@ -108,6 +108,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/payment_processed_amount.rs b/crates/analytics/src/payments/metrics/payment_processed_amount.rs
index 95846924665..302acf097ed 100644
--- a/crates/analytics/src/payments/metrics/payment_processed_amount.rs
+++ b/crates/analytics/src/payments/metrics/payment_processed_amount.rs
@@ -122,6 +122,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/payment_success_count.rs b/crates/analytics/src/payments/metrics/payment_success_count.rs
index 843e2858977..d1f437d812d 100644
--- a/crates/analytics/src/payments/metrics/payment_success_count.rs
+++ b/crates/analytics/src/payments/metrics/payment_success_count.rs
@@ -115,6 +115,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/retries_count.rs b/crates/analytics/src/payments/metrics/retries_count.rs
index ced845651cf..63ebfaefca6 100644
--- a/crates/analytics/src/payments/metrics/retries_count.rs
+++ b/crates/analytics/src/payments/metrics/retries_count.rs
@@ -112,6 +112,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/avg_ticket_size.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/avg_ticket_size.rs
index e29c19bda88..a5138777361 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/avg_ticket_size.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/avg_ticket_size.rs
@@ -123,6 +123,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/connector_success_rate.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/connector_success_rate.rs
index d8ee7fcb473..626f11aa229 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/connector_success_rate.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/connector_success_rate.rs
@@ -118,6 +118,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/failure_reasons.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/failure_reasons.rs
index d6944d8d0bd..f19185b345e 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/failure_reasons.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/failure_reasons.rs
@@ -183,6 +183,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_count.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_count.rs
index 98735b9383a..79d57477e13 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_count.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_count.rs
@@ -109,6 +109,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_processed_amount.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_processed_amount.rs
index 453f988d229..0a2ab1f8a23 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_processed_amount.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_processed_amount.rs
@@ -140,6 +140,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_success_count.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_success_count.rs
index 14391588b48..e59402933aa 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/payment_success_count.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/payment_success_count.rs
@@ -116,6 +116,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/payments_distribution.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/payments_distribution.rs
index 5c6a8c6adec..d7305cd0792 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/payments_distribution.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/payments_distribution.rs
@@ -119,6 +119,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/retries_count.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/retries_count.rs
index 7d81c48274b..83307d75f7a 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/retries_count.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/retries_count.rs
@@ -112,6 +112,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/sessionized_metrics/success_rate.rs b/crates/analytics/src/payments/metrics/sessionized_metrics/success_rate.rs
index f20308ed3b1..8159a615ba8 100644
--- a/crates/analytics/src/payments/metrics/sessionized_metrics/success_rate.rs
+++ b/crates/analytics/src/payments/metrics/sessionized_metrics/success_rate.rs
@@ -112,6 +112,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/metrics/success_rate.rs b/crates/analytics/src/payments/metrics/success_rate.rs
index 6698fe8ce65..032f3219a68 100644
--- a/crates/analytics/src/payments/metrics/success_rate.rs
+++ b/crates/analytics/src/payments/metrics/success_rate.rs
@@ -111,6 +111,7 @@ where
                         i.card_last_4.clone(),
                         i.card_issuer.clone(),
                         i.error_reason.clone(),
+                        i.routing_approach.as_ref().map(|i| i.0),
                         TimeRange {
                             start_time: match (granularity, i.start_bucket) {
                                 (Some(g), Some(st)) => g.clip_to_start(st)?,
diff --git a/crates/analytics/src/payments/types.rs b/crates/analytics/src/payments/types.rs
index b9af3cd0610..7bb23d7af78 100644
--- a/crates/analytics/src/payments/types.rs
+++ b/crates/analytics/src/payments/types.rs
@@ -109,6 +109,16 @@ where
                 .add_filter_in_range_clause("first_attempt", &self.first_attempt)
                 .attach_printable("Error adding first attempt filter")?;
         }
+
+        if !self.routing_approach.is_empty() {
+            builder
+                .add_filter_in_range_clause(
+                    PaymentDimensions::RoutingApproach,
+                    &self.routing_approach,
+                )
+                .attach_printable("Error adding routing approach filter")?;
+        }
+
         Ok(())
     }
 }
diff --git a/crates/analytics/src/query.rs b/crates/analytics/src/query.rs
index 5effd9e70a7..50d16c68e6f 100644
--- a/crates/analytics/src/query.rs
+++ b/crates/analytics/src/query.rs
@@ -15,7 +15,7 @@ use api_models::{
     },
     enums::{
         AttemptStatus, AuthenticationType, Connector, Currency, DisputeStage, IntentStatus,
-        PaymentMethod, PaymentMethodType,
+        PaymentMethod, PaymentMethodType, RoutingApproach,
     },
     refunds::RefundStatus,
 };
@@ -514,7 +514,8 @@ impl_to_sql_for_to_string!(
     &bool,
     &u64,
     u64,
-    Order
+    Order,
+    RoutingApproach
 );
 
 impl_to_sql_for_to_string!(
diff --git a/crates/analytics/src/sqlx.rs b/crates/analytics/src/sqlx.rs
index 028a1ddc143..53b9cc10e10 100644
--- a/crates/analytics/src/sqlx.rs
+++ b/crates/analytics/src/sqlx.rs
@@ -13,7 +13,7 @@ use common_utils::{
 };
 use diesel_models::enums::{
     AttemptStatus, AuthenticationType, Currency, FraudCheckStatus, IntentStatus, PaymentMethod,
-    RefundStatus,
+    RefundStatus, RoutingApproach,
 };
 use error_stack::ResultExt;
 use sqlx::{
@@ -103,6 +103,7 @@ db_type!(AuthenticationStatus);
 db_type!(TransactionStatus);
 db_type!(AuthenticationConnectors);
 db_type!(DecoupledAuthenticationType);
+db_type!(RoutingApproach);
 
 impl<'q, Type> Encode<'q, Postgres> for DBEnumWrapper<Type>
 where
@@ -730,6 +731,11 @@ impl<'a> FromRow<'a, PgRow> for super::payments::metrics::PaymentMetricRow {
             ColumnNotFound(_) => Ok(Default::default()),
             e => Err(e),
         })?;
+        let routing_approach: Option<DBEnumWrapper<RoutingApproach>> =
+            row.try_get("routing_approach").or_else(|e| match e {
+                ColumnNotFound(_) => Ok(Default::default()),
+                e => Err(e),
+            })?;
         let total: Option<bigdecimal::BigDecimal> = row.try_get("total").or_else(|e| match e {
             ColumnNotFound(_) => Ok(Default::default()),
             e => Err(e),
@@ -761,6 +767,7 @@ impl<'a> FromRow<'a, PgRow> for super::payments::metrics::PaymentMetricRow {
             card_issuer,
             error_reason,
             first_attempt,
+            routing_approach,
             total,
             count,
             start_bucket,
@@ -833,6 +840,11 @@ impl<'a> FromRow<'a, PgRow> for super::payments::distribution::PaymentDistributi
             ColumnNotFound(_) => Ok(Default::default()),
             e => Err(e),
         })?;
+        let routing_approach: Option<DBEnumWrapper<RoutingApproach>> =
+            row.try_get("routing_approach").or_else(|e| match e {
+                ColumnNotFound(_) => Ok(Default::default()),
+                e => Err(e),
+            })?;
         let total: Option<bigdecimal::BigDecimal> = row.try_get("total").or_else(|e| match e {
             ColumnNotFound(_) => Ok(Default::default()),
             e => Err(e),
@@ -875,6 +887,7 @@ impl<'a> FromRow<'a, PgRow> for super::payments::distribution::PaymentDistributi
             total,
             count,
             error_message,
+            routing_approach,
             start_bucket,
             end_bucket,
         })
@@ -949,6 +962,11 @@ impl<'a> FromRow<'a, PgRow> for super::payments::filters::PaymentFilterRow {
             ColumnNotFound(_) => Ok(Default::default()),
             e => Err(e),
         })?;
+        let routing_approach: Option<DBEnumWrapper<RoutingApproach>> =
+            row.try_get("routing_approach").or_else(|e| match e {
+                ColumnNotFound(_) => Ok(Default::default()),
+                e => Err(e),
+            })?;
         Ok(Self {
             currency,
             status,
@@ -965,6 +983,7 @@ impl<'a> FromRow<'a, PgRow> for super::payments::filters::PaymentFilterRow {
             card_issuer,
             error_reason,
             first_attempt,
+            routing_approach,
         })
     }
 }
diff --git a/crates/analytics/src/types.rs b/crates/analytics/src/types.rs
index 28ff2cec8bd..4f9a7655ede 100644
--- a/crates/analytics/src/types.rs
+++ b/crates/analytics/src/types.rs
@@ -21,6 +21,7 @@ pub enum AnalyticsDomain {
     SdkEvents,
     ApiEvents,
     Dispute,
+    Routing,
 }
 
 #[derive(Debug, strum::AsRefStr, strum::Display, Clone, Copy)]
diff --git a/crates/analytics/src/utils.rs b/crates/analytics/src/utils.rs
index 06cc998f3da..36121e56ebb 100644
--- a/crates/analytics/src/utils.rs
+++ b/crates/analytics/src/utils.rs
@@ -24,6 +24,7 @@ pub fn get_payment_dimensions() -> Vec<NameDescription> {
         PaymentDimensions::ProfileId,
         PaymentDimensions::CardNetwork,
         PaymentDimensions::MerchantId,
+        PaymentDimensions::RoutingApproach,
     ]
     .into_iter()
     .map(Into::into)
diff --git a/crates/api_models/src/analytics/payments.rs b/crates/api_models/src/analytics/payments.rs
index 691e827043f..537d6df09d1 100644
--- a/crates/api_models/src/analytics/payments.rs
+++ b/crates/api_models/src/analytics/payments.rs
@@ -8,7 +8,7 @@ use common_utils::id_type;
 use super::{ForexMetric, NameDescription, TimeRange};
 use crate::enums::{
     AttemptStatus, AuthenticationType, CardNetwork, Connector, Currency, PaymentMethod,
-    PaymentMethodType,
+    PaymentMethodType, RoutingApproach,
 };
 
 #[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)]
@@ -43,6 +43,8 @@ pub struct PaymentFilters {
     pub error_reason: Vec<String>,
     #[serde(default)]
     pub first_attempt: Vec<bool>,
+    #[serde(default)]
+    pub routing_approach: Vec<RoutingApproach>,
 }
 
 #[derive(
@@ -84,6 +86,7 @@ pub enum PaymentDimensions {
     CardLast4,
     CardIssuer,
     ErrorReason,
+    RoutingApproach,
 }
 
 #[derive(
@@ -200,6 +203,7 @@ pub struct PaymentMetricsBucketIdentifier {
     pub card_last_4: Option<String>,
     pub card_issuer: Option<String>,
     pub error_reason: Option<String>,
+    pub routing_approach: Option<RoutingApproach>,
     #[serde(rename = "time_range")]
     pub time_bucket: TimeRange,
     // Coz FE sucks
@@ -225,6 +229,7 @@ impl PaymentMetricsBucketIdentifier {
         card_last_4: Option<String>,
         card_issuer: Option<String>,
         error_reason: Option<String>,
+        routing_approach: Option<RoutingApproach>,
         normalized_time_range: TimeRange,
     ) -> Self {
         Self {
@@ -242,6 +247,7 @@ impl PaymentMetricsBucketIdentifier {
             card_last_4,
             card_issuer,
             error_reason,
+            routing_approach,
             time_bucket: normalized_time_range,
             start_time: normalized_time_range.start_time,
         }
@@ -264,6 +270,7 @@ impl Hash for PaymentMetricsBucketIdentifier {
         self.card_last_4.hash(state);
         self.card_issuer.hash(state);
         self.error_reason.hash(state);
+        self.routing_approach.map(|i| i.to_string()).hash(state);
         self.time_bucket.hash(state);
     }
 }
diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs
index 641dc83291c..d7f4a1b2a20 100644
--- a/crates/common_enums/src/enums.rs
+++ b/crates/common_enums/src/enums.rs
@@ -29,7 +29,7 @@ pub mod diesel_exports {
         DbPaymentType as PaymentType, DbProcessTrackerStatus as ProcessTrackerStatus,
         DbRefundStatus as RefundStatus,
         DbRequestIncrementalAuthorization as RequestIncrementalAuthorization,
-        DbScaExemptionType as ScaExemptionType,
+        DbRoutingApproach as RoutingApproach, DbScaExemptionType as ScaExemptionType,
         DbSuccessBasedRoutingConclusiveState as SuccessBasedRoutingConclusiveState,
         DbTokenizationFlag as TokenizationFlag, DbWebhookDeliveryAttempt as WebhookDeliveryAttempt,
     };
@@ -8494,3 +8494,44 @@ pub enum TokenDataType {
     /// Fetch network token for the given payment method
     NetworkToken,
 }
+
+#[derive(
+    Clone,
+    Copy,
+    Debug,
+    Default,
+    Eq,
+    Hash,
+    PartialEq,
+    serde::Deserialize,
+    serde::Serialize,
+    strum::Display,
+    strum::VariantNames,
+    strum::EnumIter,
+    strum::EnumString,
+    ToSchema,
+)]
+#[router_derive::diesel_enum(storage_type = "db_enum")]
+#[serde(rename_all = "snake_case")]
+#[strum(serialize_all = "snake_case")]
+pub enum RoutingApproach {
+    SuccessRateExploitation,
+    SuccessRateExploration,
+    ContractBasedRouting,
+    DebitRouting,
+    RuleBasedRouting,
+    VolumeBasedRouting,
+    #[default]
+    DefaultFallback,
+}
+
+impl RoutingApproach {
+    pub fn from_decision_engine_approach(approach: &str) -> Self {
+        match approach {
+            "SR_SELECTION_V3_ROUTING" => Self::SuccessRateExploitation,
+            "SR_V3_HEDGING" => Self::SuccessRateExploration,
+            "NTW_BASED_ROUTING" => Self::DebitRouting,
+            _ => Self::DefaultFallback,
+        }
+    }
+}
diff --git a/crates/diesel_models/src/enums.rs b/crates/diesel_models/src/enums.rs
index fc9417342e1..f7c84368b42 100644
--- a/crates/diesel_models/src/enums.rs
+++ b/crates/diesel_models/src/enums.rs
@@ -21,7 +21,8 @@ pub mod diesel_exports {
         DbRelayType as RelayType,
         DbRequestIncrementalAuthorization as RequestIncrementalAuthorization,
         DbRevenueRecoveryAlgorithmType as RevenueRecoveryAlgorithmType, DbRoleScope as RoleScope,
-        DbRoutingAlgorithmKind as RoutingAlgorithmKind, DbScaExemptionType as ScaExemptionType,
+        DbRoutingAlgorithmKind as RoutingAlgorithmKind, DbRoutingApproach as RoutingApproach,
+        DbScaExemptionType as ScaExemptionType,
         DbSuccessBasedRoutingConclusiveState as SuccessBasedRoutingConclusiveState,
         DbTokenizationFlag as TokenizationFlag, DbTotpStatus as TotpStatus,
         DbTransactionType as TransactionType, DbUserRoleVersion as UserRoleVersion,
diff --git a/crates/diesel_models/src/payment_attempt.rs b/crates/diesel_models/src/payment_attempt.rs
index 473502ad746..d438b093513 100644
--- a/crates/diesel_models/src/payment_attempt.rs
+++ b/crates/diesel_models/src/payment_attempt.rs
@@ -203,6 +203,7 @@ pub struct PaymentAttempt {
     pub processor_merchant_id: Option<id_type::MerchantId>,
     pub created_by: Option<String>,
     pub setup_future_usage_applied: Option<storage_enums::FutureUsage>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -422,6 +423,7 @@ pub struct PaymentAttemptNew {
     pub processor_merchant_id: Option<id_type::MerchantId>,
     pub created_by: Option<String>,
     pub setup_future_usage_applied: Option<storage_enums::FutureUsage>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -495,6 +497,7 @@ pub enum PaymentAttemptUpdate {
         order_tax_amount: Option<MinorUnit>,
         connector_mandate_detail: Option<ConnectorMandateReferenceId>,
         card_discovery: Option<storage_enums::CardDiscovery>,
+        routing_approach: Option<storage_enums::RoutingApproach>,
     },
     VoidUpdate {
         status: storage_enums::AttemptStatus,
@@ -937,6 +940,7 @@ pub struct PaymentAttemptUpdateInternal {
     pub issuer_error_code: Option<String>,
     pub issuer_error_message: Option<String>,
     pub setup_future_usage_applied: Option<storage_enums::FutureUsage>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -1126,6 +1130,7 @@ impl PaymentAttemptUpdate {
             issuer_error_code,
             issuer_error_message,
             setup_future_usage_applied,
+            routing_approach,
         } = PaymentAttemptUpdateInternal::from(self).populate_derived_fields(&source);
         PaymentAttempt {
             amount: amount.unwrap_or(source.amount),
@@ -1192,6 +1197,7 @@ impl PaymentAttemptUpdate {
             issuer_error_message: issuer_error_message.or(source.issuer_error_message),
             setup_future_usage_applied: setup_future_usage_applied
                 .or(source.setup_future_usage_applied),
+            routing_approach: routing_approach.or(source.routing_approach),
             ..source
         }
     }
@@ -2250,6 +2256,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::AuthenticationTypeUpdate {
                 authentication_type,
@@ -2312,6 +2319,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::ConfirmUpdate {
                 amount,
@@ -2348,6 +2356,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 order_tax_amount,
                 connector_mandate_detail,
                 card_discovery,
+                routing_approach,
             } => Self {
                 amount: Some(amount),
                 currency: Some(currency),
@@ -2406,6 +2415,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach,
             },
             PaymentAttemptUpdate::VoidUpdate {
                 status,
@@ -2469,6 +2479,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::RejectUpdate {
                 status,
@@ -2533,6 +2544,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::BlocklistUpdate {
                 status,
@@ -2597,6 +2609,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::ConnectorMandateDetailUpdate {
                 connector_mandate_detail,
@@ -2659,6 +2672,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::PaymentMethodDetailsUpdate {
                 payment_method_id,
@@ -2721,6 +2735,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::ResponseUpdate {
                 status,
@@ -2811,6 +2826,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     issuer_error_code: None,
                     issuer_error_message: None,
                     setup_future_usage_applied,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::ErrorUpdate {
@@ -2892,6 +2908,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     card_discovery: None,
                     charges: None,
                     setup_future_usage_applied: None,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::StatusUpdate { status, updated_by } => Self {
@@ -2952,6 +2969,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::UpdateTrackers {
                 payment_token,
@@ -3020,6 +3038,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::UnresolvedResponseUpdate {
                 status,
@@ -3095,6 +3114,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     issuer_error_code: None,
                     issuer_error_message: None,
                     setup_future_usage_applied: None,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::PreprocessingUpdate {
@@ -3169,6 +3189,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     issuer_error_code: None,
                     issuer_error_message: None,
                     setup_future_usage_applied: None,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::CaptureUpdate {
@@ -3233,6 +3254,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::AmountToCaptureUpdate {
                 status,
@@ -3296,6 +3318,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::ConnectorResponse {
                 authentication_data,
@@ -3368,6 +3391,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     issuer_error_code: None,
                     issuer_error_message: None,
                     setup_future_usage_applied: None,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::IncrementalAuthorizationAmountUpdate {
@@ -3431,6 +3455,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::AuthenticationUpdate {
                 status,
@@ -3496,6 +3521,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
             PaymentAttemptUpdate::ManualUpdate {
                 status,
@@ -3570,6 +3596,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                     issuer_error_code: None,
                     issuer_error_message: None,
                     setup_future_usage_applied: None,
+                    routing_approach: None,
                 }
             }
             PaymentAttemptUpdate::PostSessionTokensUpdate {
@@ -3633,6 +3660,7 @@ impl From<PaymentAttemptUpdate> for PaymentAttemptUpdateInternal {
                 issuer_error_code: None,
                 issuer_error_message: None,
                 setup_future_usage_applied: None,
+                routing_approach: None,
             },
         }
     }
diff --git a/crates/diesel_models/src/schema.rs b/crates/diesel_models/src/schema.rs
index 522ad271be9..cb690e3f602 100644
--- a/crates/diesel_models/src/schema.rs
+++ b/crates/diesel_models/src/schema.rs
@@ -950,6 +950,7 @@ diesel::table! {
         #[max_length = 255]
         created_by -> Nullable<Varchar>,
         setup_future_usage_applied -> Nullable<FutureUsage>,
+        routing_approach -> Nullable<RoutingApproach>,
     }
 }
 
diff --git a/crates/diesel_models/src/user/sample_data.rs b/crates/diesel_models/src/user/sample_data.rs
index 3e445bb5020..2a21bb7c404 100644
--- a/crates/diesel_models/src/user/sample_data.rs
+++ b/crates/diesel_models/src/user/sample_data.rs
@@ -216,6 +216,7 @@ pub struct PaymentAttemptBatchNew {
     pub processor_merchant_id: Option<common_utils::id_type::MerchantId>,
     pub created_by: Option<String>,
     pub setup_future_usage_applied: Option<common_enums::FutureUsage>,
+    pub routing_approach: Option<common_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -301,6 +302,7 @@ impl PaymentAttemptBatchNew {
             processor_merchant_id: self.processor_merchant_id,
             created_by: self.created_by,
             setup_future_usage_applied: self.setup_future_usage_applied,
+            routing_approach: self.routing_approach,
         }
     }
 }
diff --git a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
index c35fbc3163e..6369c2168fe 100644
--- a/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
+++ b/crates/hyperswitch_domain_models/src/payments/payment_attempt.rs
@@ -902,6 +902,7 @@ pub struct PaymentAttempt {
     /// merchantwho invoked the resource based api (identifier) and through what source (Api, Jwt(Dashboard))
     pub created_by: Option<CreatedBy>,
     pub setup_future_usage_applied: Option<storage_enums::FutureUsage>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -1156,6 +1157,7 @@ pub struct PaymentAttemptNew {
     /// merchantwho invoked the resource based api (identifier) and through what source (Api, Jwt(Dashboard))
     pub created_by: Option<CreatedBy>,
     pub setup_future_usage_applied: Option<storage_enums::FutureUsage>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -1223,6 +1225,7 @@ pub enum PaymentAttemptUpdate {
         customer_acceptance: Option<pii::SecretSerdeValue>,
         connector_mandate_detail: Option<ConnectorMandateReferenceId>,
         card_discovery: Option<common_enums::CardDiscovery>,
+        routing_approach: Option<storage_enums::RoutingApproach>, // where all to add this one
     },
     RejectUpdate {
         status: storage_enums::AttemptStatus,
@@ -1481,6 +1484,7 @@ impl PaymentAttemptUpdate {
                 customer_acceptance,
                 connector_mandate_detail,
                 card_discovery,
+                routing_approach,
             } => DieselPaymentAttemptUpdate::ConfirmUpdate {
                 amount: net_amount.get_order_amount(),
                 currency,
@@ -1516,6 +1520,7 @@ impl PaymentAttemptUpdate {
                 order_tax_amount: net_amount.get_order_tax_amount(),
                 connector_mandate_detail,
                 card_discovery,
+                routing_approach,
             },
             Self::VoidUpdate {
                 status,
@@ -1917,6 +1922,7 @@ impl behaviour::Conversion for PaymentAttempt {
             connector_transaction_data: None,
             processor_merchant_id: Some(self.processor_merchant_id),
             created_by: self.created_by.map(|cb| cb.to_string()),
+            routing_approach: self.routing_approach,
         })
     }
 
@@ -2012,6 +2018,7 @@ impl behaviour::Conversion for PaymentAttempt {
                     .created_by
                     .and_then(|created_by| created_by.parse::<CreatedBy>().ok()),
                 setup_future_usage_applied: storage_model.setup_future_usage_applied,
+                routing_approach: storage_model.routing_approach,
             })
         }
         .await
@@ -2100,6 +2107,7 @@ impl behaviour::Conversion for PaymentAttempt {
             processor_merchant_id: Some(self.processor_merchant_id),
             created_by: self.created_by.map(|cb| cb.to_string()),
             setup_future_usage_applied: self.setup_future_usage_applied,
+            routing_approach: self.routing_approach,
         })
     }
 }
diff --git a/crates/router/src/analytics.rs b/crates/router/src/analytics.rs
index ffac49e7a8e..e40bce12339 100644
--- a/crates/router/src/analytics.rs
+++ b/crates/router/src/analytics.rs
@@ -62,6 +62,10 @@ pub mod routes {
                             web::resource("metrics/payments")
                                 .route(web::post().to(get_merchant_payment_metrics)),
                         )
+                        .service(
+                            web::resource("metrics/routing")
+                                .route(web::post().to(get_merchant_payment_metrics)),
+                        )
                         .service(
                             web::resource("metrics/refunds")
                                 .route(web::post().to(get_merchant_refund_metrics)),
@@ -70,6 +74,10 @@ pub mod routes {
                             web::resource("filters/payments")
                                 .route(web::post().to(get_merchant_payment_filters)),
                         )
+                        .service(
+                            web::resource("filters/routing")
+                                .route(web::post().to(get_merchant_payment_filters)),
+                        )
                         .service(
                             web::resource("filters/frm").route(web::post().to(get_frm_filters)),
                         )
@@ -175,6 +183,10 @@ pub mod routes {
                                     web::resource("metrics/payments")
                                         .route(web::post().to(get_merchant_payment_metrics)),
                                 )
+                                .service(
+                                    web::resource("metrics/routing")
+                                        .route(web::post().to(get_merchant_payment_metrics)),
+                                )
                                 .service(
                                     web::resource("metrics/refunds")
                                         .route(web::post().to(get_merchant_refund_metrics)),
@@ -183,6 +195,10 @@ pub mod routes {
                                     web::resource("filters/payments")
                                         .route(web::post().to(get_merchant_payment_filters)),
                                 )
+                                .service(
+                                    web::resource("filters/routing")
+                                        .route(web::post().to(get_merchant_payment_filters)),
+                                )
                                 .service(
                                     web::resource("filters/refunds")
                                         .route(web::post().to(get_merchant_refund_filters)),
@@ -241,6 +257,14 @@ pub mod routes {
                                     web::resource("filters/payments")
                                         .route(web::post().to(get_org_payment_filters)),
                                 )
+                                .service(
+                                    web::resource("metrics/routing")
+                                        .route(web::post().to(get_org_payment_metrics)),
+                                )
+                                .service(
+                                    web::resource("filters/routing")
+                                        .route(web::post().to(get_org_payment_filters)),
+                                )
                                 .service(
                                     web::resource("metrics/refunds")
                                         .route(web::post().to(get_org_refund_metrics)),
@@ -291,6 +315,14 @@ pub mod routes {
                                     web::resource("filters/payments")
                                         .route(web::post().to(get_profile_payment_filters)),
                                 )
+                                .service(
+                                    web::resource("metrics/routing")
+                                        .route(web::post().to(get_profile_payment_metrics)),
+                                )
+                                .service(
+                                    web::resource("filters/routing")
+                                        .route(web::post().to(get_profile_payment_filters)),
+                                )
                                 .service(
                                     web::resource("metrics/refunds")
                                         .route(web::post().to(get_profile_refund_metrics)),
diff --git a/crates/router/src/core/debit_routing.rs b/crates/router/src/core/debit_routing.rs
index ca03f5d2532..4975ffc4bd1 100644
--- a/crates/router/src/core/debit_routing.rs
+++ b/crates/router/src/core/debit_routing.rs
@@ -306,15 +306,14 @@ where
 }
 
 pub async fn get_debit_routing_output<
-    F: Clone,
-    D: OperationSessionGetters<F> + OperationSessionSetters<F>,
+    F: Clone + Send,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
 >(
     state: &SessionState,
     payment_data: &mut D,
     acquirer_country: enums::CountryAlpha2,
 ) -> Option<open_router::DebitRoutingOutput> {
     logger::debug!("Fetching sorted card networks");
-    let payment_attempt = payment_data.get_payment_attempt();
 
     let (saved_co_badged_card_data, saved_card_type, card_isin) =
         extract_saved_card_info(payment_data);
@@ -355,9 +354,9 @@ pub async fn get_debit_routing_output<
 
             routing::perform_open_routing_for_debit_routing(
                 state,
-                payment_attempt,
                 co_badged_card_request,
                 card_isin,
+                payment_data,
             )
             .await
             .map_err(|error| {
diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs
index 59de54f41fa..f361be5a76c 100644
--- a/crates/router/src/core/payments.rs
+++ b/crates/router/src/core/payments.rs
@@ -7996,7 +7996,7 @@ pub async fn route_connector_v2_for_payments(
         .as_ref()
         .or(business_profile.routing_algorithm_id.as_ref());
 
-    let connectors = routing::perform_static_routing_v1(
+    let (connectors, _) = routing::perform_static_routing_v1(
         state,
         merchant_context.get_merchant_account().get_id(),
         routing_algorithm_id,
@@ -8063,7 +8063,7 @@ where
         algorithm_ref.algorithm_id
     };
 
-    let connectors = routing::perform_static_routing_v1(
+    let (connectors, routing_approach) = routing::perform_static_routing_v1(
         state,
         merchant_context.get_merchant_account().get_id(),
         routing_algorithm_id.as_ref(),
@@ -8073,6 +8073,8 @@ where
     .await
     .change_context(errors::ApiErrorResponse::InternalServerError)?;
 
+    payment_data.set_routing_approach_in_attempt(routing_approach);
+
     #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
     let payment_attempt = transaction_data.payment_attempt.clone();
 
@@ -8121,6 +8123,7 @@ where
                     connectors.clone(),
                     business_profile,
                     payment_attempt,
+                    payment_data,
                 )
                 .await
                 .map_err(|e| logger::error!(open_routing_error=?e))
@@ -8163,7 +8166,7 @@ where
                     connectors.clone(),
                     business_profile,
                     dynamic_routing_config_params_interpolator,
-                    payment_data.get_payment_attempt(),
+                    payment_data,
                 )
                 .await
                 .map_err(|e| logger::error!(dynamic_routing_error=?e))
@@ -8240,7 +8243,7 @@ pub async fn route_connector_v1_for_payouts(
         algorithm_ref.algorithm_id
     };
 
-    let connectors = routing::perform_static_routing_v1(
+    let (connectors, _) = routing::perform_static_routing_v1(
         state,
         merchant_context.get_merchant_account().get_id(),
         routing_algorithm_id.as_ref(),
@@ -8965,6 +8968,7 @@ pub trait OperationSessionSetters<F> {
         &mut self,
         external_vault_session_details: Option<api::VaultSessionDetails>,
     );
+    fn set_routing_approach_in_attempt(&mut self, routing_approach: Option<enums::RoutingApproach>);
 }
 
 #[cfg(feature = "v1")]
@@ -9264,6 +9268,13 @@ impl<F: Clone> OperationSessionSetters<F> for PaymentData<F> {
     fn set_vault_operation(&mut self, vault_operation: domain_payments::VaultOperation) {
         self.vault_operation = Some(vault_operation);
     }
+
+    fn set_routing_approach_in_attempt(
+        &mut self,
+        routing_approach: Option<enums::RoutingApproach>,
+    ) {
+        self.payment_attempt.routing_approach = routing_approach;
+    }
 }
 
 #[cfg(feature = "v2")]
@@ -9550,6 +9561,13 @@ impl<F: Clone> OperationSessionSetters<F> for PaymentIntentData<F> {
     ) {
         self.vault_session_details = vault_session_details;
     }
+
+    fn set_routing_approach_in_attempt(
+        &mut self,
+        routing_approach: Option<enums::RoutingApproach>,
+    ) {
+        todo!()
+    }
 }
 
 #[cfg(feature = "v2")]
@@ -9839,6 +9857,13 @@ impl<F: Clone> OperationSessionSetters<F> for PaymentConfirmData<F> {
     ) {
         todo!()
     }
+
+    fn set_routing_approach_in_attempt(
+        &mut self,
+        routing_approach: Option<enums::RoutingApproach>,
+    ) {
+        todo!()
+    }
 }
 
 #[cfg(feature = "v2")]
@@ -10124,6 +10149,12 @@ impl<F: Clone> OperationSessionSetters<F> for PaymentStatusData<F> {
     ) {
         todo!()
     }
+    fn set_routing_approach_in_attempt(
+        &mut self,
+        routing_approach: Option<enums::RoutingApproach>,
+    ) {
+        todo!()
+    }
 }
 
 #[cfg(feature = "v2")]
@@ -10410,6 +10441,13 @@ impl<F: Clone> OperationSessionSetters<F> for PaymentCaptureData<F> {
     ) {
         todo!()
     }
+
+    fn set_routing_approach_in_attempt(
+        &mut self,
+        routing_approach: Option<enums::RoutingApproach>,
+    ) {
+        todo!()
+    }
 }
 
 #[cfg(feature = "v2")]
diff --git a/crates/router/src/core/payments/helpers.rs b/crates/router/src/core/payments/helpers.rs
index 9f6e317531a..a34a169d38a 100644
--- a/crates/router/src/core/payments/helpers.rs
+++ b/crates/router/src/core/payments/helpers.rs
@@ -4399,6 +4399,7 @@ impl AttemptType {
             processor_merchant_id: old_payment_attempt.processor_merchant_id,
             created_by: old_payment_attempt.created_by,
             setup_future_usage_applied: None,
+            routing_approach: old_payment_attempt.routing_approach,
         }
     }
 
diff --git a/crates/router/src/core/payments/operations/payment_confirm.rs b/crates/router/src/core/payments/operations/payment_confirm.rs
index 944f2852b18..866449c74dd 100644
--- a/crates/router/src/core/payments/operations/payment_confirm.rs
+++ b/crates/router/src/core/payments/operations/payment_confirm.rs
@@ -1794,6 +1794,7 @@ impl<F: Clone + Sync> UpdateTracker<F, PaymentData<F>, api::PaymentsRequest> for
                             .payment_attempt
                             .connector_mandate_detail,
                         card_discovery,
+                        routing_approach: payment_data.payment_attempt.routing_approach,
                     },
                     storage_scheme,
                 )
diff --git a/crates/router/src/core/payments/operations/payment_create.rs b/crates/router/src/core/payments/operations/payment_create.rs
index 68f1b9d9c15..43e9c39c566 100644
--- a/crates/router/src/core/payments/operations/payment_create.rs
+++ b/crates/router/src/core/payments/operations/payment_create.rs
@@ -1362,6 +1362,7 @@ impl PaymentCreate {
                 processor_merchant_id: merchant_id.to_owned(),
                 created_by: None,
                 setup_future_usage_applied: request.setup_future_usage,
+                routing_approach: Some(common_enums::RoutingApproach::default())
             },
             additional_pm_data,
 
diff --git a/crates/router/src/core/payments/retry.rs b/crates/router/src/core/payments/retry.rs
index a4d1cc51518..1cc886be828 100644
--- a/crates/router/src/core/payments/retry.rs
+++ b/crates/router/src/core/payments/retry.rs
@@ -702,6 +702,7 @@ pub fn make_new_payment_attempt(
         processor_merchant_id: old_payment_attempt.processor_merchant_id,
         created_by: old_payment_attempt.created_by,
         setup_future_usage_applied: setup_future_usage_intent, // setup future usage is picked from intent for new payment attempt
+        routing_approach: old_payment_attempt.routing_approach,
     }
 }
 
diff --git a/crates/router/src/core/payments/routing.rs b/crates/router/src/core/payments/routing.rs
index 2ab004cccd1..ef7d1d46f53 100644
--- a/crates/router/src/core/payments/routing.rs
+++ b/crates/router/src/core/payments/routing.rs
@@ -59,7 +59,12 @@ use crate::core::routing::transformers::OpenRouterDecideGatewayRequestExt;
 use crate::routes::app::SessionStateInfo;
 use crate::{
     core::{
-        errors, errors as oss_errors, payments::routing::utils::DecisionEngineApiHandler, routing,
+        errors, errors as oss_errors,
+        payments::{
+            routing::utils::DecisionEngineApiHandler, OperationSessionGetters,
+            OperationSessionSetters,
+        },
+        routing,
     },
     logger, services,
     types::{
@@ -432,7 +437,10 @@ pub async fn perform_static_routing_v1(
     algorithm_id: Option<&common_utils::id_type::RoutingId>,
     business_profile: &domain::Profile,
     transaction_data: &routing::TransactionData<'_>,
-) -> RoutingResult<Vec<routing_types::RoutableConnectorChoice>> {
+) -> RoutingResult<(
+    Vec<routing_types::RoutableConnectorChoice>,
+    Option<common_enums::RoutingApproach>,
+)> {
     let algorithm_id = if let Some(id) = algorithm_id {
         id
     } else {
@@ -449,7 +457,7 @@ pub async fn perform_static_routing_v1(
             .get_default_fallback_list_of_connector_under_profile()
             .change_context(errors::RoutingError::FallbackConfigFetchFailed)?;
 
-        return Ok(fallback_config);
+        return Ok((fallback_config, None));
     };
     let cached_algorithm = ensure_algorithm_cached_v1(
         state,
@@ -503,14 +511,18 @@ pub async fn perform_static_routing_v1(
         logger::error!(decision_engine_euclid_evaluate_error=?e, "decision_engine_euclid: error in evaluation of rule")
     ).unwrap_or_default();
 
-    let routable_connectors = match cached_algorithm.as_ref() {
-        CachedAlgorithm::Single(conn) => vec![(**conn).clone()],
-        CachedAlgorithm::Priority(plist) => plist.clone(),
-        CachedAlgorithm::VolumeSplit(splits) => perform_volume_split(splits.to_vec())
-            .change_context(errors::RoutingError::ConnectorSelectionFailed)?,
-        CachedAlgorithm::Advanced(interpreter) => {
-            execute_dsl_and_get_connector_v1(backend_input, interpreter)?
-        }
+    let (routable_connectors, routing_approach) = match cached_algorithm.as_ref() {
+        CachedAlgorithm::Single(conn) => (vec![(**conn).clone()], None),
+        CachedAlgorithm::Priority(plist) => (plist.clone(), None),
+        CachedAlgorithm::VolumeSplit(splits) => (
+            perform_volume_split(splits.to_vec())
+                .change_context(errors::RoutingError::ConnectorSelectionFailed)?,
+            Some(common_enums::RoutingApproach::VolumeBasedRouting),
+        ),
+        CachedAlgorithm::Advanced(interpreter) => (
+            execute_dsl_and_get_connector_v1(backend_input, interpreter)?,
+            Some(common_enums::RoutingApproach::RuleBasedRouting),
+        ),
     };
 
     utils::compare_and_log_result(
@@ -519,13 +531,16 @@ pub async fn perform_static_routing_v1(
         "evaluate_routing".to_string(),
     );
 
-    Ok(utils::select_routing_result(
-        state,
-        business_profile,
-        routable_connectors,
-        de_euclid_connectors,
-    )
-    .await)
+    Ok((
+        utils::select_routing_result(
+            state,
+            business_profile,
+            routable_connectors,
+            de_euclid_connectors,
+        )
+        .await,
+        routing_approach,
+    ))
 }
 
 async fn ensure_algorithm_cached_v1(
@@ -1573,12 +1588,17 @@ pub fn make_dsl_input_for_surcharge(
 }
 
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
-pub async fn perform_dynamic_routing_with_open_router(
+pub async fn perform_dynamic_routing_with_open_router<F, D>(
     state: &SessionState,
     routable_connectors: Vec<api_routing::RoutableConnectorChoice>,
     profile: &domain::Profile,
     payment_data: oss_storage::PaymentAttempt,
-) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>> {
+    old_payment_data: &mut D,
+) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
     let dynamic_routing_algo_ref: api_routing::DynamicRoutingAlgorithmRef = profile
         .dynamic_routing_algorithm
         .clone()
@@ -1610,6 +1630,7 @@ pub async fn perform_dynamic_routing_with_open_router(
             profile.get_id(),
             &payment_data,
             is_elimination_enabled,
+            old_payment_data,
         )
         .await?;
 
@@ -1642,12 +1663,18 @@ pub async fn perform_dynamic_routing_with_open_router(
 }
 
 #[cfg(feature = "v1")]
-pub async fn perform_open_routing_for_debit_routing(
+pub async fn perform_open_routing_for_debit_routing<F, D>(
     state: &SessionState,
-    payment_attempt: &oss_storage::PaymentAttempt,
     co_badged_card_request: or_types::CoBadgedCardRequest,
     card_isin: Option<Secret<String>>,
-) -> RoutingResult<or_types::DebitRoutingOutput> {
+    old_payment_data: &mut D,
+) -> RoutingResult<or_types::DebitRoutingOutput>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
+    let payment_attempt = old_payment_data.get_payment_attempt().clone();
+
     logger::debug!(
         "performing debit routing with open_router for profile {}",
         payment_attempt.profile_id.get_string_repr()
@@ -1661,7 +1688,7 @@ pub async fn perform_open_routing_for_debit_routing(
     );
 
     let open_router_req_body = OpenRouterDecideGatewayRequest::construct_debit_request(
-        payment_attempt,
+        &payment_attempt,
         metadata,
         card_isin,
         Some(or_types::RankingAlgorithm::NtwBasedRouting),
@@ -1692,11 +1719,14 @@ pub async fn perform_open_routing_for_debit_routing(
 
     let output = match response {
         Ok(events_response) => {
-            let debit_routing_output = events_response
-                .response
-                .ok_or(errors::RoutingError::OpenRouterError(
-                    "Response from decision engine API is empty".to_string(),
-                ))?
+            let response =
+                events_response
+                    .response
+                    .ok_or(errors::RoutingError::OpenRouterError(
+                        "Response from decision engine API is empty".to_string(),
+                    ))?;
+
+            let debit_routing_output = response
                 .debit_routing_output
                 .get_required_value("debit_routing_output")
                 .change_context(errors::RoutingError::OpenRouterError(
@@ -1704,6 +1734,12 @@ pub async fn perform_open_routing_for_debit_routing(
                 ))
                 .attach_printable("debit_routing_output is missing in the open routing response")?;
 
+            old_payment_data.set_routing_approach_in_attempt(Some(
+                common_enums::RoutingApproach::from_decision_engine_approach(
+                    &response.routing_approach,
+                ),
+            ));
+
             Ok(debit_routing_output)
         }
         Err(error_response) => {
@@ -1718,13 +1754,17 @@ pub async fn perform_open_routing_for_debit_routing(
 }
 
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
-pub async fn perform_dynamic_routing_with_intelligent_router(
+pub async fn perform_dynamic_routing_with_intelligent_router<F, D>(
     state: &SessionState,
     routable_connectors: Vec<api_routing::RoutableConnectorChoice>,
     profile: &domain::Profile,
     dynamic_routing_config_params_interpolator: routing::helpers::DynamicRoutingConfigParamsInterpolator,
-    payment_attempt: &oss_storage::PaymentAttempt,
-) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>> {
+    payment_data: &mut D,
+) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
     let dynamic_routing_algo_ref: api_routing::DynamicRoutingAlgorithmRef = profile
         .dynamic_routing_algorithm
         .clone()
@@ -1744,6 +1784,8 @@ pub async fn perform_dynamic_routing_with_intelligent_router(
         profile.get_id().get_string_repr()
     );
 
+    let payment_attempt = payment_data.get_payment_attempt().clone();
+
     let mut connector_list = match dynamic_routing_algo_ref
         .success_based_algorithm
         .as_ref()
@@ -1756,6 +1798,7 @@ pub async fn perform_dynamic_routing_with_intelligent_router(
                 &payment_attempt.payment_id,
                 dynamic_routing_config_params_interpolator.clone(),
                 algorithm.clone(),
+                payment_data,
             )
         })
         .await
@@ -1779,6 +1822,7 @@ pub async fn perform_dynamic_routing_with_intelligent_router(
                         &payment_attempt.payment_id,
                         dynamic_routing_config_params_interpolator.clone(),
                         algorithm.clone(),
+                        payment_data,
                     )
                 })
                 .await
@@ -1816,13 +1860,18 @@ pub async fn perform_dynamic_routing_with_intelligent_router(
 
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
 #[instrument(skip_all)]
-pub async fn perform_decide_gateway_call_with_open_router(
+pub async fn perform_decide_gateway_call_with_open_router<F, D>(
     state: &SessionState,
     mut routable_connectors: Vec<api_routing::RoutableConnectorChoice>,
     profile_id: &common_utils::id_type::ProfileId,
     payment_attempt: &oss_storage::PaymentAttempt,
     is_elimination_enabled: bool,
-) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>> {
+    old_payment_data: &mut D,
+) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
     logger::debug!(
         "performing decide_gateway call with open_router for profile {}",
         profile_id.get_string_repr()
@@ -1879,6 +1928,12 @@ pub async fn perform_decide_gateway_call_with_open_router(
                 .to_string(),
             );
 
+            old_payment_data.set_routing_approach_in_attempt(Some(
+                common_enums::RoutingApproach::from_decision_engine_approach(
+                    &decided_gateway.routing_approach,
+                ),
+            ));
+
             if let Some(gateway_priority_map) = decided_gateway.gateway_priority_map {
                 logger::debug!(gateway_priority_map=?gateway_priority_map, routing_approach=decided_gateway.routing_approach, "open_router decide_gateway call response");
                 routable_connectors.sort_by(|connector_choice_a, connector_choice_b| {
@@ -1992,7 +2047,8 @@ pub async fn update_gateway_score_with_open_router(
 /// success based dynamic routing
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
 #[instrument(skip_all)]
-pub async fn perform_success_based_routing(
+#[allow(clippy::too_many_arguments)]
+pub async fn perform_success_based_routing<F, D>(
     state: &SessionState,
     routable_connectors: Vec<api_routing::RoutableConnectorChoice>,
     profile_id: &common_utils::id_type::ProfileId,
@@ -2000,7 +2056,12 @@ pub async fn perform_success_based_routing(
     payment_id: &common_utils::id_type::PaymentId,
     success_based_routing_config_params_interpolator: routing::helpers::DynamicRoutingConfigParamsInterpolator,
     success_based_algo_ref: api_routing::SuccessBasedAlgorithm,
-) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>> {
+    payment_data: &mut D,
+) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
     if success_based_algo_ref.enabled_feature
         == api_routing::DynamicRoutingFeatures::DynamicConnectorSelection
     {
@@ -2131,6 +2192,9 @@ pub async fn perform_success_based_routing(
                 })?;
 
         routing_event.set_routing_approach(success_based_connectors.routing_approach.to_string());
+        payment_data.set_routing_approach_in_attempt(Some(common_enums::RoutingApproach::from(
+            success_based_connectors.routing_approach,
+        )));
 
         let mut connectors = Vec::with_capacity(success_based_connectors.labels_with_score.len());
         for label_with_score in success_based_connectors.labels_with_score {
@@ -2367,7 +2431,8 @@ pub async fn perform_elimination_routing(
 }
 
 #[cfg(all(feature = "v1", feature = "dynamic_routing"))]
-pub async fn perform_contract_based_routing(
+#[allow(clippy::too_many_arguments)]
+pub async fn perform_contract_based_routing<F, D>(
     state: &SessionState,
     routable_connectors: Vec<api_routing::RoutableConnectorChoice>,
     profile_id: &common_utils::id_type::ProfileId,
@@ -2375,7 +2440,12 @@ pub async fn perform_contract_based_routing(
     payment_id: &common_utils::id_type::PaymentId,
     _dynamic_routing_config_params_interpolator: routing::helpers::DynamicRoutingConfigParamsInterpolator,
     contract_based_algo_ref: api_routing::ContractRoutingAlgorithm,
-) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>> {
+    payment_data: &mut D,
+) -> RoutingResult<Vec<api_routing::RoutableConnectorChoice>>
+where
+    F: Send + Clone,
+    D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
+{
     if contract_based_algo_ref.enabled_feature
         == api_routing::DynamicRoutingFeatures::DynamicConnectorSelection
     {
@@ -2528,6 +2598,10 @@ pub async fn perform_contract_based_routing(
             status_code: 500,
         })?;
 
+        payment_data.set_routing_approach_in_attempt(Some(
+            common_enums::RoutingApproach::ContractBasedRouting,
+        ));
+
         let mut connectors = Vec::with_capacity(contract_based_connectors.labels_with_score.len());
 
         for label_with_score in contract_based_connectors.labels_with_score {
@@ -2565,6 +2639,7 @@ pub async fn perform_contract_based_routing(
 
         routing_event.set_status_code(200);
         routing_event.set_routable_connectors(connectors.clone());
+        routing_event.set_routing_approach(api_routing::RoutingApproach::ContractBased.to_string());
         state.event_handler().log_event(&routing_event);
         Ok(connectors)
     } else {
diff --git a/crates/router/src/core/payments/routing/utils.rs b/crates/router/src/core/payments/routing/utils.rs
index 4296fea819f..0b74273419b 100644
--- a/crates/router/src/core/payments/routing/utils.rs
+++ b/crates/router/src/core/payments/routing/utils.rs
@@ -1522,6 +1522,18 @@ impl RoutingApproach {
     }
 }
 
+impl From<RoutingApproach> for common_enums::RoutingApproach {
+    fn from(approach: RoutingApproach) -> Self {
+        match approach {
+            RoutingApproach::Exploitation => Self::SuccessRateExploitation,
+            RoutingApproach::Exploration => Self::SuccessRateExploration,
+            RoutingApproach::ContractBased => Self::ContractBasedRouting,
+            RoutingApproach::StaticRouting => Self::RuleBasedRouting,
+            _ => Self::DefaultFallback,
+        }
+    }
+}
+
 impl std::fmt::Display for RoutingApproach {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
         match self {
diff --git a/crates/router/src/core/routing/helpers.rs b/crates/router/src/core/routing/helpers.rs
index e73c9c5bc75..6d263eece26 100644
--- a/crates/router/src/core/routing/helpers.rs
+++ b/crates/router/src/core/routing/helpers.rs
@@ -54,7 +54,10 @@ use crate::{
 };
 #[cfg(feature = "v1")]
 use crate::{
-    core::payments::routing::utils::{self as routing_utils, DecisionEngineApiHandler},
+    core::payments::{
+        routing::utils::{self as routing_utils, DecisionEngineApiHandler},
+        OperationSessionGetters, OperationSessionSetters,
+    },
     services,
 };
 #[cfg(all(feature = "dynamic_routing", feature = "v1"))]
@@ -338,11 +341,7 @@ impl RoutingDecisionData {
     pub fn apply_routing_decision<F, D>(&self, payment_data: &mut D)
     where
         F: Send + Clone,
-        D: crate::core::payments::OperationSessionGetters<F>
-            + crate::core::payments::OperationSessionSetters<F>
-            + Send
-            + Sync
-            + Clone,
+        D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
     {
         match self {
             Self::DebitRouting(data) => data.apply_debit_routing_decision(payment_data),
@@ -364,11 +363,7 @@ impl DebitRoutingDecisionData {
     pub fn apply_debit_routing_decision<F, D>(&self, payment_data: &mut D)
     where
         F: Send + Clone,
-        D: crate::core::payments::OperationSessionGetters<F>
-            + crate::core::payments::OperationSessionSetters<F>
-            + Send
-            + Sync
-            + Clone,
+        D: OperationSessionGetters<F> + OperationSessionSetters<F> + Send + Sync + Clone,
     {
         payment_data.set_card_network(self.card_network.clone());
         self.debit_routing_result
diff --git a/crates/router/src/services/kafka/payment_attempt.rs b/crates/router/src/services/kafka/payment_attempt.rs
index f2c18ae9302..68f1d013517 100644
--- a/crates/router/src/services/kafka/payment_attempt.rs
+++ b/crates/router/src/services/kafka/payment_attempt.rs
@@ -69,6 +69,7 @@ pub struct KafkaPaymentAttempt<'a> {
     pub organization_id: &'a id_type::OrganizationId,
     pub card_network: Option<String>,
     pub card_discovery: Option<String>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -130,6 +131,7 @@ impl<'a> KafkaPaymentAttempt<'a> {
             card_discovery: attempt
                 .card_discovery
                 .map(|discovery| discovery.to_string()),
+            routing_approach: attempt.routing_approach,
         }
     }
 }
diff --git a/crates/router/src/services/kafka/payment_attempt_event.rs b/crates/router/src/services/kafka/payment_attempt_event.rs
index e06f4e014dd..9bfc6f8c31d 100644
--- a/crates/router/src/services/kafka/payment_attempt_event.rs
+++ b/crates/router/src/services/kafka/payment_attempt_event.rs
@@ -70,6 +70,7 @@ pub struct KafkaPaymentAttemptEvent<'a> {
     pub organization_id: &'a id_type::OrganizationId,
     pub card_network: Option<String>,
     pub card_discovery: Option<String>,
+    pub routing_approach: Option<storage_enums::RoutingApproach>,
 }
 
 #[cfg(feature = "v1")]
@@ -131,6 +132,7 @@ impl<'a> KafkaPaymentAttemptEvent<'a> {
             card_discovery: attempt
                 .card_discovery
                 .map(|discovery| discovery.to_string()),
+            routing_approach: attempt.routing_approach,
         }
     }
 }
diff --git a/crates/router/src/types/storage/payment_attempt.rs b/crates/router/src/types/storage/payment_attempt.rs
index 3a942f70e32..5289ed02af9 100644
--- a/crates/router/src/types/storage/payment_attempt.rs
+++ b/crates/router/src/types/storage/payment_attempt.rs
@@ -225,6 +225,7 @@ mod tests {
             processor_merchant_id: Default::default(),
             created_by: None,
             setup_future_usage_applied: Default::default(),
+            routing_approach: Default::default(),
         };
 
         let store = state
@@ -315,6 +316,7 @@ mod tests {
             processor_merchant_id: Default::default(),
             created_by: None,
             setup_future_usage_applied: Default::default(),
+            routing_approach: Default::default(),
         };
         let store = state
             .stores
@@ -418,6 +420,7 @@ mod tests {
             processor_merchant_id: Default::default(),
             created_by: None,
             setup_future_usage_applied: Default::default(),
+            routing_approach: Default::default(),
         };
         let store = state
             .stores
diff --git a/crates/router/src/utils/user/sample_data.rs b/crates/router/src/utils/user/sample_data.rs
index 989e7db3c0c..52c3d29482e 100644
--- a/crates/router/src/utils/user/sample_data.rs
+++ b/crates/router/src/utils/user/sample_data.rs
@@ -381,6 +381,7 @@ pub async fn generate_sample_data(
             processor_merchant_id: Some(merchant_id.clone()),
             created_by: None,
             setup_future_usage_applied: None,
+            routing_approach: None,
         };
 
         let refund = if refunds_count < number_of_refunds && !is_failed_payment {
diff --git a/crates/storage_impl/src/mock_db/payment_attempt.rs b/crates/storage_impl/src/mock_db/payment_attempt.rs
index feec3a1f3a9..0de343b94ea 100644
--- a/crates/storage_impl/src/mock_db/payment_attempt.rs
+++ b/crates/storage_impl/src/mock_db/payment_attempt.rs
@@ -235,6 +235,7 @@ impl PaymentAttemptInterface for MockDb {
             processor_merchant_id: payment_attempt.processor_merchant_id,
             created_by: payment_attempt.created_by,
             setup_future_usage_applied: payment_attempt.setup_future_usage_applied,
+            routing_approach: payment_attempt.routing_approach,
         };
         payment_attempts.push(payment_attempt.clone());
         Ok(payment_attempt)
diff --git a/crates/storage_impl/src/payments/payment_attempt.rs b/crates/storage_impl/src/payments/payment_attempt.rs
index db3400c5fa4..ea1552248b9 100644
--- a/crates/storage_impl/src/payments/payment_attempt.rs
+++ b/crates/storage_impl/src/payments/payment_attempt.rs
@@ -680,6 +680,7 @@ impl<T: DatabaseStore> PaymentAttemptInterface for KVRouterStore<T> {
                     processor_merchant_id: payment_attempt.processor_merchant_id.clone(),
                     created_by: payment_attempt.created_by.clone(),
                     setup_future_usage_applied: payment_attempt.setup_future_usage_applied,
+                    routing_approach: payment_attempt.routing_approach,
                 };
 
                 let field = format!("pa_{}", created_attempt.attempt_id);
@@ -1704,6 +1705,7 @@ impl DataModelExt for PaymentAttempt {
             issuer_error_code: self.issuer_error_code,
             issuer_error_message: self.issuer_error_message,
             setup_future_usage_applied: self.setup_future_usage_applied,
+            routing_approach: self.routing_approach,
             // Below fields are deprecated. Please add any new fields above this line.
             connector_transaction_data: None,
             processor_merchant_id: Some(self.processor_merchant_id),
@@ -1798,6 +1800,7 @@ impl DataModelExt for PaymentAttempt {
                 .created_by
                 .and_then(|created_by| created_by.parse::<CreatedBy>().ok()),
             setup_future_usage_applied: storage_model.setup_future_usage_applied,
+            routing_approach: storage_model.routing_approach,
         }
     }
 }
@@ -1887,6 +1890,7 @@ impl DataModelExt for PaymentAttemptNew {
             processor_merchant_id: Some(self.processor_merchant_id),
             created_by: self.created_by.map(|created_by| created_by.to_string()),
             setup_future_usage_applied: self.setup_future_usage_applied,
+            routing_approach: self.routing_approach,
         }
     }
 
@@ -1969,6 +1973,7 @@ impl DataModelExt for PaymentAttemptNew {
                 .created_by
                 .and_then(|created_by| created_by.parse::<CreatedBy>().ok()),
             setup_future_usage_applied: storage_model.setup_future_usage_applied,
+            routing_approach: storage_model.routing_approach,
         }
     }
 }
diff --git a/migrations/2025-06-19-124558_add_routing_approach_to_attempt/down.sql b/migrations/2025-06-19-124558_add_routing_approach_to_attempt/down.sql
new file mode 100644
index 00000000000..0c6fce15b58
--- /dev/null
+++ b/migrations/2025-06-19-124558_add_routing_approach_to_attempt/down.sql
@@ -0,0 +1,6 @@
+-- This file should undo anything in `up.sql`
+
+ALTER TABLE payment_attempt
+DROP COLUMN IF EXISTS routing_approach;
+
+DROP TYPE "RoutingApproach";
diff --git a/migrations/2025-06-19-124558_add_routing_approach_to_attempt/up.sql b/migrations/2025-06-19-124558_add_routing_approach_to_attempt/up.sql
new file mode 100644
index 00000000000..f5ec97a93f3
--- /dev/null
+++ b/migrations/2025-06-19-124558_add_routing_approach_to_attempt/up.sql
@@ -0,0 +1,15 @@
+-- Your SQL goes here
+CREATE TYPE "RoutingApproach" AS ENUM (
+  'success_rate_exploitation',
+  'success_rate_exploration',
+  'contract_based_routing',
+  'debit_routing',
+  'rule_based_routing',
+  'volume_based_routing',
+  'default_fallback'
+);
+
+
+ALTER TABLE payment_attempt
+ADD COLUMN IF NOT EXISTS routing_approach "RoutingApproach";
+
diff --git a/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql b/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql
index 7913af26d66..8eac6ae97ac 100644
--- a/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql
+++ b/v2_migrations/2025-01-13-081847_drop_v1_columns/up.sql
@@ -93,7 +93,8 @@ ALTER TABLE payment_attempt DROP COLUMN attempt_id,
     DROP COLUMN charge_id,
     DROP COLUMN issuer_error_code,
     DROP COLUMN issuer_error_message,
-    DROP COLUMN setup_future_usage_applied;
+    DROP COLUMN setup_future_usage_applied,
+    DROP COLUMN routing_approach;
 
 
 ALTER TABLE payment_methods

## Type of Change
<!-- Put an `x` in the boxes that apply -->

- [ ] Bugfix
- [x] New feature
- [ ] Enhancement
- [ ] Refactoring
- [ ] Dependency updates
- [ ] Documentation
- [ ] CI/CD

## Description
<!-- Describe your changes in detail -->
- Added RoutingApproach column in Payment attempt
- Added RoutingApproach as a filter and dimension in payment analytics
- Added routing metric endpoints

DB queries - 
```sql
CREATE TYPE "RoutingApproach" AS ENUM (
  'success_rate_exploitation',
  'success_rate_exploration',
  'contract_based_routing',
  'debit_routing',
  'rule_based_routing',
  'volume_based_routing',
  'default_fallback'
);


ALTER TABLE payment_attempt
ADD COLUMN IF NOT EXISTS routing_approach "RoutingApproach";

```

### Additional Changes

- [x] This PR modifies the API contract
- [x] This PR modifies the database schema
- [ ] This PR modifies application configuration/environment variables

<!--
Provide links to the files with corresponding changes.

Following are the paths where you can find config files:
1. `config`
2. `crates/router/src/configs`
3. `loadtest/config`
-->


## Motivation and Context
<!--
Why is this change required? What problem does it solve?
If it fixes an open issue, please link to the issue here.

If you don't have an issue, we'd recommend starting with one first so the PR
can focus on the implementation (unless it is an obvious bug or documentation fix
that will have little conversation).
-->


## How did you test it?
<!--
Did you write an integration/unit/API test to verify the code changes?
Or did you test this change manually (provide relevant screenshots)?
-->

```bash
curl -X GET 'http://localhost:8080/analytics/v1/org/routing/info' \
  -H 'Accept: */*' \
  -H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/json' \
  -H 'Origin: http://localhost:9000' \
  -H 'Referer: http://localhost:9000/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36' \
  -H 'X-Merchant-Id: merchant_1750414514' \
  -H 'X-Profile-Id: pro_8QBK8uJG8ZHGwiZfWcAr' \
  -H 'api-key: hyperswitch' \
  -H 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOGMzNzEwZmMtNDU3NS00NDlmLWFhNzItNWFjOWUyYmJlODViIiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzUwNDE0NTE0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTc1MDg1MDY3MCwib3JnX2lkIjoib3JnX2EycGVlblVCaVNqY2dmVzNMQ2xXIiwicHJvZmlsZV9pZCI6InByb184UUJLOHVKRzhaSEd3aVpmV2NBciIsInRlbmFudF9pZCI6InB1YmxpYyJ9.wutHNAmKapYOM4kcOF0t-Lrrx-ZVFKelyFCXk_Xk8JA' \
  -H 'sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"'
```
response - 
```json
{
  "metrics": [
    {
      "name": "payment_success_rate",
      "desc": ""
    },
    {
      "name": "payment_count",
      "desc": ""
    },
    {
      "name": "payment_success_count",
      "desc": ""
    },
    {
      "name": "payment_processed_amount",
      "desc": ""
    },
    {
      "name": "avg_ticket_size",
      "desc": ""
    },
    {
      "name": "retries_count",
      "desc": ""
    },
    {
      "name": "connector_success_rate",
      "desc": ""
    },
    {
      "name": "sessionized_payment_success_rate",
      "desc": ""
    },
    {
      "name": "sessionized_payment_count",
      "desc": ""
    },
    {
      "name": "sessionized_payment_success_count",
      "desc": ""
    },
    {
      "name": "sessionized_payment_processed_amount",
      "desc": ""
    },
    {
      "name": "sessionized_avg_ticket_size",
      "desc": ""
    },
    {
      "name": "sessionized_retries_count",
      "desc": ""
    },
    {
      "name": "sessionized_connector_success_rate",
      "desc": ""
    },
    {
      "name": "payments_distribution",
      "desc": ""
    },
    {
      "name": "failure_reasons",
      "desc": ""
    }
  ],
  "downloadDimensions": null,
  "dimensions": [
    {
      "name": "connector",
      "desc": ""
    },
    {
      "name": "payment_method",
      "desc": ""
    },
    {
      "name": "payment_method_type",
      "desc": ""
    },
    {
      "name": "currency",
      "desc": ""
    },
    {
      "name": "authentication_type",
      "desc": ""
    },
    {
      "name": "status",
      "desc": ""
    },
    {
      "name": "client_source",
      "desc": ""
    },
    {
      "name": "client_version",
      "desc": ""
    },
    {
      "name": "profile_id",
      "desc": ""
    },
    {
      "name": "card_network",
      "desc": ""
    },
    {
      "name": "merchant_id",
      "desc": ""
    },
    {
      "name": "routing_approach",
      "desc": ""
    }
  ]
}
```

```bash
curl -X POST http://localhost:8080/analytics/v1/org/filters/routing \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOGMzNzEwZmMtNDU3NS00NDlmLWFhNzItNWFjOWUyYmJlODViIiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzUwNDE0NTE0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTc1MDU4NzUzMCwib3JnX2lkIjoib3JnX2EycGVlblVCaVNqY2dmVzNMQ2xXIiwicHJvZmlsZV9pZCI6InByb184UUJLOHVKRzhaSEd3aVpmV2NBciIsInRlbmFudF9pZCI6InB1YmxpYyJ9.4PuaaBWunN6wnLnm6Pxj08r9rXuuMrZ6GfYewQX9IFE" \
  -d '{
    "timeRange": {
      "startTime": "2025-06-11T18:30:00.000Z",
      "endTime": "2025-06-20T11:10:32.000Z"
    },
    "groupByNames": [
      "connector",
      "payment_method",
      "payment_method_type",
      "currency",
      "authentication_type",
      "status",
      "client_source",
      "client_version",
      "profile_id",
      "card_network",
      "merchant_id",
      "routing_approach"
    ],
    "source": "BATCH",
    "delta": true
  }'

```



```bash
curl 'http://localhost:8080/analytics/v1/org/metrics/routing' \
  -H 'Accept: */*' \
  -H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/json' \
  -H 'Origin: http://localhost:9000' \
  -H 'Referer: http://localhost:9000/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: same-site' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36' \
  -H 'X-Merchant-Id: merchant_1750414514' \
  -H 'X-Profile-Id: pro_8QBK8uJG8ZHGwiZfWcAr' \
  -H 'api-key: hyperswitch' \
  -H 'authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiOGMzNzEwZmMtNDU3NS00NDlmLWFhNzItNWFjOWUyYmJlODViIiwibWVyY2hhbnRfaWQiOiJtZXJjaGFudF8xNzUwNDE0NTE0Iiwicm9sZV9pZCI6Im9yZ19hZG1pbiIsImV4cCI6MTc1MDg1MDY3MCwib3JnX2lkIjoib3JnX2EycGVlblVCaVNqY2dmVzNMQ2xXIiwicHJvZmlsZV9pZCI6InByb184UUJLOHVKRzhaSEd3aVpmV2NBciIsInRlbmFudF9pZCI6InB1YmxpYyJ9.wutHNAmKapYOM4kcOF0t-Lrrx-ZVFKelyFCXk_Xk8JA' \
  -H 'sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  --data-raw '[{"timeRange":{"startTime":"2025-06-12T18:30:00Z","endTime":"2025-06-23T18:23:53Z"},"groupByNames":["routing_approach","connector"],"source":"BATCH","metrics":[ "payment_count","payment_success_rate", "payment_processed_amount"],"delta":true}]'

```
Response
```json
{
  "queryData": [
    {
      "payment_success_rate": null,
      "payment_count": null,
      "payment_success_count": null,
      "payment_processed_amount": 20400,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": "USD",
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "rule_based_routing",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": null,
      "payment_count": null,
      "payment_success_count": null,
      "payment_processed_amount": 20300,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": "USD",
      "status": null,
      "connector": "pretendpay",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": null,
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 100.0,
      "payment_count": 2,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "volume_based_routing",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 100.0,
      "payment_count": 2,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "rule_based_routing",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": null,
      "payment_count": null,
      "payment_success_count": null,
      "payment_processed_amount": 10200,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": "USD",
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "default_fallback",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 100.0,
      "payment_count": 4,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": null,
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 0.0,
      "payment_count": 12,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": null,
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": null,
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 0.0,
      "payment_count": 6,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": null,
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "rule_based_routing",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": null,
      "payment_count": null,
      "payment_success_count": null,
      "payment_processed_amount": 20000,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": "USD",
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "volume_based_routing",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": null,
      "payment_count": null,
      "payment_success_count": null,
      "payment_processed_amount": 40000,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": "USD",
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": null,
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 100.0,
      "payment_count": 2,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": "pretendpay",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": null,
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    },
    {
      "payment_success_rate": 100.0,
      "payment_count": 1,
      "payment_success_count": null,
      "payment_processed_amount": 0,
      "payment_processed_amount_in_usd": null,
      "payment_processed_count": null,
      "payment_processed_amount_without_smart_retries": 0,
      "payment_processed_amount_without_smart_retries_usd": null,
      "payment_processed_count_without_smart_retries": null,
      "avg_ticket_size": null,
      "payment_error_message": null,
      "retries_count": null,
      "retries_amount_processed": 0,
      "connector_success_rate": null,
      "payments_success_rate_distribution": null,
      "payments_success_rate_distribution_without_smart_retries": null,
      "payments_success_rate_distribution_with_only_retries": null,
      "payments_failure_rate_distribution": null,
      "payments_failure_rate_distribution_without_smart_retries": null,
      "payments_failure_rate_distribution_with_only_retries": null,
      "failure_reason_count": 0,
      "failure_reason_count_without_smart_retries": 0,
      "currency": null,
      "status": null,
      "connector": "stripe",
      "authentication_type": null,
      "payment_method": null,
      "payment_method_type": null,
      "client_source": null,
      "client_version": null,
      "profile_id": null,
      "card_network": null,
      "merchant_id": null,
      "card_last_4": null,
      "card_issuer": null,
      "error_reason": null,
      "routing_approach": "default_fallback",
      "time_range": {
        "start_time": "2025-06-12T18:30:00.000Z",
        "end_time": "2025-06-23T18:23:53.000Z"
      },
      "time_bucket": "2025-06-12 18:30:00"
    }
  ],
  "metaData": [
    {
      "total_payment_processed_amount": 110900,
      "total_payment_processed_amount_in_usd": null,
      "total_payment_processed_amount_without_smart_retries": 0,
      "total_payment_processed_amount_without_smart_retries_usd": null,
      "total_payment_processed_count": 0,
      "total_payment_processed_count_without_smart_retries": 0,
      "total_failure_reasons_count": 0,
      "total_failure_reasons_count_without_smart_retries": 0
    }
  ]
}

```

## Checklist
<!-- Put an `x` in the boxes that apply -->

- [ ] I formatted the code `cargo +nightly fmt --all`
- [ ] I addressed lints thrown by `cargo clippy`
- [ ] I reviewed the submitted code
- [ ] I added unit tests for my changes where possible
