Skip to content

Commit

Permalink
Add conversion tailored metrics logic and tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
benbowler committed Oct 11, 2024
1 parent 2a774c3 commit ed5ebdd
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 11 deletions.
2 changes: 2 additions & 0 deletions assets/js/googlesitekit/datastore/user/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ export const KM_ANALYTICS_TOP_CITIES_DRIVING_PURCHASES =
export const KM_ANALYTICS_TOP_CONVERTING_TRAFFIC_SOURCE =
'kmAnalyticsTopConvertingTrafficSource';
export const KM_ANALYTICS_TOP_COUNTRIES = 'kmAnalyticsTopCountries';
export const KM_ANALYTICS_TOP_DEVICE_DRIVING_PURCHASES =
'kmAnalyticsTopDeviceDrivingPurchases';
export const KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS =
'kmAnalyticsTopPagesDrivingLeads';
export const KM_ANALYTICS_TOP_RECENT_TRENDING_PAGES =
Expand Down
42 changes: 42 additions & 0 deletions assets/js/googlesitekit/datastore/user/key-metrics.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ import {
KM_ANALYTICS_VISIT_LENGTH,
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
keyMetricsGA4WidgetsNonACR,
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
KM_ANALYTICS_TOP_CITIES_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_CITIES_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_DEVICE_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_CITIES_DRIVING_LEADS,
} from './constants';
import { CORE_SITE } from '../../datastore/site/constants';
import { CORE_MODULES } from '../../modules/datastore/constants';
Expand Down Expand Up @@ -270,13 +278,25 @@ const baseSelectors = {
return postTypes.some( ( { slug } ) => slug === 'product' );
};

const keyMetricSettings = select( CORE_USER ).getKeyMetricsSettings();
const isUserInputCompleted = select( CORE_USER ).isUserInputCompleted();
const showConversionTailoredMetrics =
keyMetricSettings?.includeConversionTailoredMetrics ||
isUserInputCompleted;

switch ( purpose ) {
case 'publish_blog':
return [
KM_ANALYTICS_RETURNING_VISITORS,
KM_ANALYTICS_NEW_VISITORS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
...( showConversionTailoredMetrics
? [
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
]
: [] ),
];

case 'publish_news':
Expand All @@ -285,6 +305,12 @@ const baseSelectors = {
KM_ANALYTICS_VISIT_LENGTH,
KM_ANALYTICS_VISITS_PER_VISITOR,
KM_ANALYTICS_MOST_ENGAGING_PAGES,
...( showConversionTailoredMetrics
? [
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
]
: [] ),
];
case 'monetize_content':
return [
Expand All @@ -302,6 +328,15 @@ const baseSelectors = {
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
...( showConversionTailoredMetrics
? [
KM_ANALYTICS_TOP_CITIES_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_CITIES_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_DEVICE_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_PURCHASES,
]
: [] ),
];

case 'share_portfolio':
Expand All @@ -310,6 +345,13 @@ const baseSelectors = {
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
...( showConversionTailoredMetrics
? [
KM_ANALYTICS_TOP_CITIES_DRIVING_LEADS,
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
]
: [] ),
];
default:
return [];
Expand Down
117 changes: 116 additions & 1 deletion assets/js/googlesitekit/datastore/user/key-metrics.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ import {
KM_ANALYTICS_VISIT_LENGTH,
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
KM_ANALYTICS_TOP_CITIES_DRIVING_LEADS,
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
KM_ANALYTICS_TOP_CITIES_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_CITIES_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_DEVICE_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_PURCHASES,
} from './constants';
import { CORE_SITE } from '../site/constants';
import { MODULES_ANALYTICS_4 } from '../../../modules/analytics-4/datastore/constants';
Expand Down Expand Up @@ -233,6 +240,20 @@ describe( 'core/user key metrics', () => {
} );

describe( 'getAnswerBasedMetrics', () => {
// Default to a configuration that will *not* return Conversion Tailored Metrics.
beforeEach( async () => {
provideUserAuthentication( registry );
await registry
.dispatch( CORE_USER )
.receiveIsUserInputCompleted( false );
await registry
.dispatch( CORE_USER )
.receiveGetKeyMetricsSettings( {
widgetSlugs: [],
includeConversionTailoredMetrics: false,
} );
} );

it( 'should return undefined if user input settings are not resolved', async () => {
freezeFetch(
new RegExp(
Expand Down Expand Up @@ -284,6 +305,10 @@ describe( 'core/user key metrics', () => {
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
],
[
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
],
],
[
'publish_news',
Expand All @@ -293,6 +318,10 @@ describe( 'core/user key metrics', () => {
KM_ANALYTICS_VISITS_PER_VISITOR,
KM_ANALYTICS_MOST_ENGAGING_PAGES,
],
[
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
],
],
[
'monetize_content',
Expand All @@ -302,6 +331,7 @@ describe( 'core/user key metrics', () => {
KM_ANALYTICS_NEW_VISITORS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
],
[],
],
[
'sell_products_or_service',
Expand All @@ -311,6 +341,13 @@ describe( 'core/user key metrics', () => {
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE,
],
[
KM_ANALYTICS_TOP_CITIES_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_CITIES_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_DEVICE_DRIVING_PURCHASES,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_ADD_TO_CART,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_PURCHASES,
],
],
[
'share_portfolio',
Expand All @@ -320,10 +357,30 @@ describe( 'core/user key metrics', () => {
KM_ANALYTICS_ENGAGED_TRAFFIC_SOURCE,
KM_SEARCH_CONSOLE_POPULAR_KEYWORDS,
],
[
KM_ANALYTICS_TOP_CITIES_DRIVING_LEADS,
KM_ANALYTICS_TOP_PAGES_DRIVING_LEADS,
KM_ANALYTICS_TOP_TRAFFIC_SOURCE_DRIVING_LEADS,
],
],
] )(
'should return the correct metrics for the %s purpose',
( purpose, expectedMetrics ) => {
async (
purpose,
expectedMetrics,
conversionTailoredMetrics
) => {
provideUserAuthentication( registry );
await registry
.dispatch( CORE_USER )
.receiveIsUserInputCompleted( false );
await registry
.dispatch( CORE_USER )
.receiveGetKeyMetricsSettings( {
widgetSlugs: [],
includeConversionTailoredMetrics: false,
} );

registry
.dispatch( CORE_USER )
.receiveGetUserInputSettings( {
Expand All @@ -333,6 +390,64 @@ describe( 'core/user key metrics', () => {
expect(
registry.select( CORE_USER ).getAnswerBasedMetrics()
).toEqual( expectedMetrics );

// Conversion Tailored Metrics should be added to the list if the
// isUserInputCompleted value is true.
await registry
.dispatch( CORE_USER )
.receiveIsUserInputCompleted( true );
await registry
.dispatch( CORE_USER )
.receiveGetKeyMetricsSettings( {
widgetSlugs: [],
includeConversionTailoredMetrics: false,
} );

expect(
registry.select( CORE_USER ).getKeyMetricsSettings()
).toEqual( {
widgetSlugs: [],
includeConversionTailoredMetrics: false,
} );
expect(
registry.select( CORE_USER ).isUserInputCompleted()
).toEqual( true );

expect(
registry.select( CORE_USER ).getAnswerBasedMetrics()
).toEqual( [
...expectedMetrics,
...conversionTailoredMetrics,
] );

// Conversion Tailored Metrics should be added to the list if the
// includeConversionTailoredMetrics setting is true.
await registry
.dispatch( CORE_USER )
.receiveIsUserInputCompleted( false );
await registry
.dispatch( CORE_USER )
.receiveGetKeyMetricsSettings( {
widgetSlugs: [],
includeConversionTailoredMetrics: true,
} );

expect(
registry.select( CORE_USER ).isUserInputCompleted()
).toEqual( false );
expect(
registry.select( CORE_USER ).getKeyMetricsSettings()
).toEqual( {
widgetSlugs: [],
includeConversionTailoredMetrics: true,
} );

expect(
registry.select( CORE_USER ).getAnswerBasedMetrics()
).toEqual( [
...expectedMetrics,
...conversionTailoredMetrics,
] );
}
);

Expand Down
14 changes: 10 additions & 4 deletions includes/Core/Key_Metrics/Key_Metrics_Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ protected function get_type() {
*/
protected function get_default() {
return array(
'widgetSlugs' => array(),
'isWidgetHidden' => false,
'widgetSlugs' => array(),
'isWidgetHidden' => false,
'includeConversionTailoredMetrics' => false,
);
}

Expand All @@ -70,8 +71,9 @@ function ( $value ) {
);

$allowed_settings = array(
'widgetSlugs' => true,
'isWidgetHidden' => true,
'widgetSlugs' => true,
'isWidgetHidden' => true,
'includeConversionTailoredMetrics' => true,
);

$updated = array_intersect_key( $partial, $allowed_settings );
Expand Down Expand Up @@ -102,6 +104,10 @@ protected function get_sanitize_callback() {
$sanitized_settings['isWidgetHidden'] = false !== $settings['isWidgetHidden'];
}

if ( isset( $settings['includeConversionTailoredMetrics'] ) ) {
$sanitized_settings['includeConversionTailoredMetrics'] = false !== $settings['includeConversionTailoredMetrics'];
}

return $sanitized_settings;
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,15 @@ public function test_get_sanitize_callback( $input, $expected ) {

public function test_merge() {
$original_settings = array(
'widgetSlugs' => array( 'widgetA' ),
'isWidgetHidden' => false,
'widgetSlugs' => array( 'widgetA' ),
'isWidgetHidden' => false,
'includeConversionTailoredMetrics' => false,
);

$changed_settings = array(
'widgetSlugs' => array( 'widgetB' ),
'isWidgetHidden' => true,
'widgetSlugs' => array( 'widgetB' ),
'isWidgetHidden' => true,
'includeConversionTailoredMetrics' => true,
);

// Make sure settings can be updated even without having them set initially
Expand All @@ -176,8 +178,9 @@ public function test_merge() {
$this->key_metrics_settings->merge( array( 'isWidgetHidden' => true ) );
$this->assertEqualSetsWithIndex(
array(
'widgetSlugs' => $original_settings['widgetSlugs'],
'isWidgetHidden' => true,
'widgetSlugs' => $original_settings['widgetSlugs'],
'isWidgetHidden' => true,
'includeConversionTailoredMetrics' => false,
),
$this->key_metrics_settings->get()
);
Expand All @@ -196,6 +199,11 @@ public function test_merge() {
$this->key_metrics_settings->set( $original_settings );
$this->key_metrics_settings->merge( array( 'widgetSlugs' => null ) );
$this->assertEqualSetsWithIndex( $original_settings, $this->key_metrics_settings->get() );

// Make sure that we can't set wrong format for the includeConversionTailoredMetrics property
$this->key_metrics_settings->set( $original_settings );
$this->key_metrics_settings->merge( array( 'includeConversionTailoredMetrics' => null ) );
$this->assertEqualSetsWithIndex( $original_settings, $this->key_metrics_settings->get() );
}

public function test_key_metrics_setup_completed_by_user_id() {
Expand Down

0 comments on commit ed5ebdd

Please sign in to comment.