Skip to content

Commit 0295e2a

Browse files
committed
Log skipped tracks event for CoD onboarding screen
1 parent f4acfaf commit 0295e2a

File tree

7 files changed

+97
-9
lines changed

7 files changed

+97
-9
lines changed

WooCommerce/Classes/Analytics/WooAnalyticsEvent.swift

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,8 @@ extension WooAnalyticsEvent {
745745
static let batteryLevel = "battery_level"
746746
static let cardReaderModel = "card_reader_model"
747747
static let countryCode = "country"
748+
static let reason = "reason"
749+
static let remindLater = "remind_later"
748750
static let gatewayID = "plugin_slug"
749751
static let errorDescription = "error_description"
750752
static let paymentMethodType = "payment_method_type"
@@ -1150,7 +1152,23 @@ extension WooAnalyticsEvent {
11501152
WooAnalyticsEvent(statName: .cardPresentOnboardingNotCompleted,
11511153
properties: [
11521154
Keys.countryCode: countryCode,
1153-
"reason": reason
1155+
Keys.reason: reason
1156+
])
1157+
}
1158+
1159+
/// Tracked when a In-Person Payments onboarding step is skipped by the user.
1160+
///
1161+
/// - Parameters:
1162+
/// - reason: the reason why the onboarding step was shown (effectively the name of the step.)
1163+
/// - remindLater: whether the user will see this onboarding step again
1164+
/// - countryCode: the country code of the store.
1165+
///
1166+
static func cardPresentOnboardingStepSkipped(reason: String, remindLater: Bool, countryCode: String) -> WooAnalyticsEvent {
1167+
WooAnalyticsEvent(statName: .cardPresentOnboardingStepSkipped,
1168+
properties: [
1169+
Keys.countryCode: countryCode,
1170+
Keys.reason: reason,
1171+
Keys.remindLater: remindLater
11541172
])
11551173
}
11561174

WooCommerce/Classes/Analytics/WooAnalyticsStat.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ public enum WooAnalyticsStat: String {
184184
// MARK: Card-Present Payments Onboarding
185185
case cardPresentOnboardingLearnMoreTapped = "card_present_onboarding_learn_more_tapped"
186186
case cardPresentOnboardingNotCompleted = "card_present_onboarding_not_completed"
187+
case cardPresentOnboardingStepSkipped = "card_present_onboarding_step_skipped"
187188

188189
// MARK: Payment Gateways selection
189190
case cardPresentPaymentGatewaySelected = "card_present_payment_gateway_selected"

WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/InPersonPaymentsViewModel.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ final class InPersonPaymentsViewModel: ObservableObject {
1111
let stores: StoresManager
1212

1313
lazy var codStepViewModel: InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel = {
14-
InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(completion: refresh)
14+
InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(configuration: useCase.configurationLoader.configuration,
15+
completion: refresh)
1516
}()
1617

1718
/// Initializes the view model for a specific site

WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import SwiftUI
2+
import Yosemite
23

34
struct InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpView: View {
45
@ObservedObject var viewModel: InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel
@@ -35,7 +36,8 @@ struct InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpView: View {
3536

3637
struct InPersonPaymentsCodPaymentGatewayNotSetUp_Previews: PreviewProvider {
3738
static var previews: some View {
38-
let viewModel = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(completion: {})
39+
let viewModel = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(configuration: CardPresentPaymentsConfiguration(country: "US"),
40+
completion: {})
3941
return InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpView(viewModel: viewModel)
4042
}
4143
}

WooCommerce/Classes/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel: Obser
55
let completion: () -> Void
66
private let stores: StoresManager
77
private let noticePresenter: NoticePresenter
8+
private let analytics: Analytics
9+
private let cardPresentPaymentsConfiguration: CardPresentPaymentsConfiguration
810

911
@Published var awaitingResponse = false
1012

@@ -14,13 +16,19 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel: Obser
1416

1517
init(stores: StoresManager = ServiceLocator.stores,
1618
noticePresenter: NoticePresenter = ServiceLocator.noticePresenter,
19+
analytics: Analytics = ServiceLocator.analytics,
20+
configuration: CardPresentPaymentsConfiguration,
1721
completion: @escaping () -> Void) {
1822
self.stores = stores
1923
self.noticePresenter = noticePresenter
24+
self.analytics = analytics
25+
self.cardPresentPaymentsConfiguration = configuration
2026
self.completion = completion
2127
}
2228

2329
func skipTapped() {
30+
trackSkipTapped()
31+
2432
guard let siteID = siteID else {
2533
return completion()
2634
}
@@ -72,6 +80,22 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel: Obser
7280
}
7381
}
7482

83+
// MARK: - Analytics
84+
private extension InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel {
85+
private typealias Event = WooAnalyticsEvent.InPersonPayments
86+
87+
private var reason: String {
88+
CardPresentPaymentOnboardingState.codPaymentGatewayNotSetUp.reasonForAnalytics ?? ""
89+
}
90+
91+
private func trackSkipTapped() {
92+
let event = Event.cardPresentOnboardingStepSkipped(reason: reason,
93+
remindLater: false,
94+
countryCode: cardPresentPaymentsConfiguration.countryCode)
95+
analytics.track(event: event)
96+
}
97+
}
98+
7599
private enum Localization {
76100
static let cashOnDeliveryCheckoutTitle = NSLocalizedString(
77101
"Pay in Person",

WooCommerce/WooCommerceTests/ViewRelated/Dashboard/Settings/In-Person Payments/Onboarding Errors/InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests.swift

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,34 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests:
1010

1111
private var noticePresenter: MockNoticePresenter!
1212

13+
private var analyticsProvider: MockAnalyticsProvider!
14+
private var analytics: Analytics!
15+
16+
private var configuration: CardPresentPaymentsConfiguration!
17+
1318
private var sut: InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel!
1419

1520
override func setUp() {
1621
stores = MockStoresManager(sessionManager: .makeForTesting())
1722
stores.sessionManager.setStoreId(12345)
1823
noticePresenter = MockNoticePresenter()
19-
sut = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(stores: stores, noticePresenter: noticePresenter, completion: {})
24+
analyticsProvider = MockAnalyticsProvider()
25+
analytics = WooAnalytics(analyticsProvider: analyticsProvider)
26+
configuration = CardPresentPaymentsConfiguration.init(country: "US")
27+
sut = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(stores: stores,
28+
noticePresenter: noticePresenter,
29+
analytics: analytics,
30+
configuration: configuration,
31+
completion: {})
2032
}
2133

2234
func test_skip_always_calls_completion() {
2335
// Given
2436
let completionCalled: Bool = waitFor { promise in
2537
let sut = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(stores: self.stores,
26-
noticePresenter: self.noticePresenter,
27-
completion: {
38+
noticePresenter: self.noticePresenter,
39+
configuration: self.configuration,
40+
completion: {
2841
promise(true)
2942
})
3043

@@ -69,8 +82,9 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests:
6982

7083
let completionCalled: Bool = waitFor { promise in
7184
let sut = InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModel(stores: self.stores,
72-
noticePresenter: self.noticePresenter,
73-
completion: {
85+
noticePresenter: self.noticePresenter,
86+
configuration: self.configuration,
87+
completion: {
7488
promise(true)
7589
})
7690
// When
@@ -100,4 +114,32 @@ final class InPersonPaymentsCashOnDeliveryPaymentGatewayNotSetUpViewModelTests:
100114
let expectedTitle = "Failed to enable Pay in Person. Please try again later."
101115
assertEqual(expectedTitle, notice.title)
102116
}
117+
118+
// MARK: - Analytics tests
119+
func test_skip_tapped_logs_onboarding_step_skipped_event() throws {
120+
// Given
121+
assertEmpty(analyticsProvider.receivedEvents)
122+
123+
// When
124+
sut.skipTapped()
125+
126+
// Then
127+
assertNotEmpty(analyticsProvider.receivedEvents)
128+
let indexOfEvent = try XCTUnwrap(analyticsProvider.receivedEvents.firstIndex(where: { $0 == AnalyticEvents.skippedEvent }))
129+
let eventProperties = try XCTUnwrap(analyticsProvider.receivedProperties[indexOfEvent])
130+
assertEqual(AnalyticProperties.cashOnDeliveryDisabledReason, eventProperties[AnalyticProperties.reasonKey] as? String)
131+
assertEqual(false, eventProperties[AnalyticProperties.remindLaterKey] as? Bool)
132+
assertEqual("US", eventProperties[AnalyticProperties.countryCodeKey] as? String)
133+
}
134+
}
135+
136+
private enum AnalyticEvents {
137+
static let skippedEvent = "card_present_onboarding_step_skipped"
138+
}
139+
140+
private enum AnalyticProperties {
141+
static let reasonKey = "reason"
142+
static let cashOnDeliveryDisabledReason = "cash_on_delivery_disabled"
143+
static let remindLaterKey = "remind_later"
144+
static let countryCodeKey = "country"
103145
}

Yosemite/Yosemite/Model/Enums/CardPresentPaymentsOnboardingState.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ extension CardPresentPaymentOnboardingState {
115115
case .stripeAccountRejected:
116116
return "account_rejected"
117117
case .codPaymentGatewayNotSetUp:
118-
return "cod_not_set_up"
118+
return "cash_on_delivery_disabled"
119119
case .genericError:
120120
return "generic_error"
121121
case .noConnectionError:

0 commit comments

Comments
 (0)