Skip to content

Commit 5c3be5a

Browse files
committed
feat(payments-next): Implement Glean frontend metrics for Churn intervention
This pull request - Implements the following: - Page_view for Subscription Management - Retention_flow for Cancel and Stay (and Error) - Interstitial_offer for Offer (and Error) Closes PAY-3471
1 parent 873df01 commit 5c3be5a

40 files changed

Lines changed: 1470 additions & 778 deletions

File tree

.circleci/config.yml

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ executors:
8080
# step, and the saving the initial a workspace state.
8181
build-executor:
8282
docker:
83-
- image: mozilla/fxa-circleci:ci-builder-v6
83+
- image: mozilla/fxa-circleci:ci-builder-v7
8484
environment:
8585
NODE_ENV: development
8686
FIRESTORE_EMULATOR_HOST: localhost:9090
@@ -96,7 +96,7 @@ executors:
9696
default: medium
9797
resource_class: << parameters.resource_class >>
9898
docker:
99-
- image: mozilla/fxa-circleci:ci-test-runner-v6
99+
- image: mozilla/fxa-circleci:ci-test-runner-v7
100100
environment:
101101
NODE_ENV: development
102102
FIRESTORE_EMULATOR_HOST: localhost:9090
@@ -112,7 +112,7 @@ executors:
112112
default: large
113113
resource_class: << parameters.resource_class >>
114114
docker:
115-
- image: mozilla/fxa-circleci:ci-test-runner-v6
115+
- image: mozilla/fxa-circleci:ci-test-runner-v7
116116
- image: cimg/mysql:8.0
117117
command: --default-authentication-plugin=mysql_native_password
118118
- image: jdlk7/firestore-emulator
@@ -135,7 +135,7 @@ executors:
135135
default: xlarge
136136
resource_class: << parameters.resource_class >>
137137
docker:
138-
- image: mozilla/fxa-circleci:ci-functional-test-runner-v6
138+
- image: mozilla/fxa-circleci:ci-functional-test-runner-v7
139139
- image: redis
140140
- image: pafortin/goaws
141141
- image: cimg/mysql:8.0
@@ -189,7 +189,7 @@ executors:
189189
default: xlarge
190190
resource_class: << parameters.resource_class >>
191191
docker:
192-
- image: mozilla/fxa-circleci:ci-functional-test-runner-v6
192+
- image: mozilla/fxa-circleci:ci-functional-test-runner-v7
193193
environment:
194194
NODE_ENV: development
195195
CUSTOMS_SERVER_URL: none
@@ -306,19 +306,11 @@ commands:
306306
command: |
307307
set -euxo pipefail
308308
309-
unset PYTHONDONTWRITEBYTECODE
310-
export PIP_NO_COMPILE=1
311-
312-
python3 --version
313309
rm -rf .venv
314-
python3 -m venv .venv --without-pip
310+
python3 -m venv .venv
315311
. .venv/bin/activate
316312
317-
curl -sSL https://bootstrap.pypa.io/get-pip.py -o /tmp/get-pip.py
318-
python /tmp/get-pip.py --no-compile
319-
320-
python -m pip install --no-compile --upgrade 'glean_parser~=14.5'
321-
python -m pip --version
313+
pip install --upgrade 'glean_parser~=14.5'
322314
323315
lint:
324316
parameters:
@@ -541,7 +533,7 @@ commands:
541533
docker build . \
542534
-f ./project/_dev/docker/ci/Dockerfile \
543535
--target << parameters.target >> \
544-
-t mozilla/fxa-circleci:ci-<< parameters.target >>-v6
536+
-t mozilla/fxa-circleci:ci-<< parameters.target >>-v7
545537
546538
create-fxa-ci-images:
547539
# Build CI images. Images are built on top of each other. Each is optimized for a specific task.
@@ -570,10 +562,10 @@ commands:
570562
name: Push CI Images and Extract Yarn Cache
571563
command: |
572564
docker login -u $DOCKER_USER_fxa_circleci -p $DOCKER_PASS_fxa_circleci
573-
.circleci/docker-copy-cache.sh mozilla/fxa-circleci:ci-builder-v6
574-
docker push mozilla/fxa-circleci:ci-test-runner-v6
575-
docker push mozilla/fxa-circleci:ci-functional-test-runner-v6
576-
docker push mozilla/fxa-circleci:ci-builder-v6
565+
.circleci/docker-copy-cache.sh mozilla/fxa-circleci:ci-builder-v7
566+
docker push mozilla/fxa-circleci:ci-test-runner-v7
567+
docker push mozilla/fxa-circleci:ci-functional-test-runner-v7
568+
docker push mozilla/fxa-circleci:ci-builder-v7
577569
wait
578570
579571
upload_to_gcs:

_dev/docker/ci/Dockerfile

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
# workspace will be restored into the project folder.
77
FROM cimg/node:22.15.1 AS test-runner
88
RUN sudo apt-get update && sudo apt-get install -y \
9-
python3-venv
9+
python3-venv \
10+
python3-pip
1011
WORKDIR /home/circleci
1112
COPY --chown=circleci:circleci project project
1213
WORKDIR /home/circleci/project
@@ -24,7 +25,10 @@ WORKDIR /home/circleci/project
2425
ENV YARN_CHECKSUM_BEHAVIOR=throw
2526
ENV FXA_AUTO_INSTALL=0
2627
RUN _scripts/l10n/clone.sh
27-
RUN yarn install --immutable;
28+
RUN yarn install --immutable \
29+
&& rm -rf .venv \
30+
&& python3 -m venv .venv \
31+
&& .venv/bin/pip install 'glean_parser~=14.5'
2832

2933
# Acts as an intermediate stage for adding the firefox install. Note,
3034
# that a yarn install must happen first to ensure the correct version
@@ -39,7 +43,8 @@ RUN npx playwright install --with-deps firefox chromium webkit;
3943
# workspace will be restored into the project folder.
4044
FROM cimg/node:22.15.1-browsers AS functional-test-runner
4145
RUN sudo apt-get update && sudo apt-get install -y \
42-
python3-venv
46+
python3-venv \
47+
python3-pip
4348
WORKDIR /home/circleci
4449
COPY --chown=circleci:circleci --from=playwright-install /home/circleci/.cache/ms-playwright .cache/ms-playwright/
4550
COPY --chown=circleci:circleci project project

apps/payments/api/.env

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,3 @@ GLEAN_CONFIG__APPLICATION_ID=
5757
GLEAN_CONFIG__VERSION=0.0.0
5858
GLEAN_CONFIG__CHANNEL='development'
5959
GLEAN_CONFIG__LOGGER_APP_NAME='fxa-payments-next'
60-
61-
# Glean Client Config
62-
GLEAN_CLIENT_CONFIG__ENABLED=true
63-
GLEAN_CLIENT_CONFIG__APPLICATION_ID=
64-
GLEAN_CLIENT_CONFIG__VERSION=0.0.0
65-
GLEAN_CLIENT_CONFIG__CHANNEL='development'

apps/payments/next/.env

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,12 @@ GLEAN_CONFIG__LOGGER_APP_NAME='fxa-payments-next'
116116
# Glean Client Config
117117
GLEAN_CLIENT_CONFIG__ENABLED=true
118118
GLEAN_CLIENT_CONFIG__APPLICATION_ID=
119+
GLEAN_CLIENT_CONFIG__UPLOAD_ENABLED=true
119120
# GLEAN_CLIENT_CONFIG__VERSION= # Set in next.config.js
120121
GLEAN_CLIENT_CONFIG__CHANNEL='development'
122+
# GLEAN_CLIENT_CONFIG__SERVER_ENDPOINT=
123+
# GLEAN_CLIENT_CONFIG__LOG_PINGS=false
124+
# GLEAN_CLIENT_CONFIG__DEBUG_VIEW_TAG=
121125

122126
# CSP Config
123127
CSP__ACCOUNTS_STATIC_CDN=https://cdn.accounts.firefox.com

apps/payments/next/app/[locale]/[offeringId]/[interval]/upgrade/[cartId]/(mainLayout)/error/page.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
import { getCartOrRedirectAction } from '@fxa/payments/ui/actions';
1818
import { config } from 'apps/payments/next/config';
1919
import { Metadata } from 'next';
20-
import { buildRedirectUrl } from '@fxa/payments/ui';
20+
import { buildRedirectUrl, GleanRetentionResult } from '@fxa/payments/ui';
2121
import { redirect } from 'next/navigation';
2222

2323
// forces dynamic rendering
@@ -86,8 +86,24 @@ export default async function UpgradeError({
8686
redirect(redirectTo);
8787
}
8888

89+
const isCancelInterstitialOffer =
90+
searchParams?.['entrypoint'] === 'subscription-management';
91+
8992
return (
9093
<>
94+
{isCancelInterstitialOffer && (
95+
<GleanRetentionResult
96+
metricsEnabled={session?.user?.metricsEnabled ?? true}
97+
eventType="interstitial_offer"
98+
flowType="cancel"
99+
eligibilityStatus="offer"
100+
outcome="error"
101+
action="upgrade"
102+
errorReason={cart.errorReasonId ?? 'general_error'}
103+
offeringId={params.offeringId}
104+
interval={params.interval}
105+
/>
106+
)}
91107
<section
92108
className="flex flex-col items-center text-center pb-8 mt-5 desktop:mt-2 h-[640px]"
93109
aria-labelledby="page-information-heading"

apps/payments/next/app/[locale]/[offeringId]/[interval]/upgrade/[cartId]/(mainLayout)/success/page.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import { Metadata } from 'next';
88
import { auth } from 'apps/payments/next/auth';
99

1010
import { SubPlatPaymentMethodType } from '@fxa/payments/customer';
11-
import { buildRedirectUrl, getCardIcon } from '@fxa/payments/ui';
11+
import {
12+
buildRedirectUrl,
13+
getCardIcon,
14+
GleanRetentionResult,
15+
} from '@fxa/payments/ui';
1216
import {
1317
fetchCMSData,
1418
getCartOrRedirectAction,
@@ -91,8 +95,23 @@ export default async function UpgradeSuccess({
9195
const { successActionButtonUrl, successActionButtonLabel } =
9296
cms.commonContent.localizations.at(0) || cms.commonContent;
9397

98+
const isCancelInterstitialOffer =
99+
searchParams?.['entrypoint'] === 'subscription-management';
100+
94101
return (
95102
<>
103+
{isCancelInterstitialOffer && (
104+
<GleanRetentionResult
105+
metricsEnabled={session?.user?.metricsEnabled ?? true}
106+
eventType="interstitial_offer"
107+
flowType="cancel"
108+
eligibilityStatus="offer"
109+
outcome="upgrade_success"
110+
action="upgrade"
111+
offeringId={params.offeringId}
112+
interval={params.interval}
113+
/>
114+
)}
96115
<section
97116
className="h-[640px]"
98117
aria-labelledby="subscription-confirmation-heading"

apps/payments/next/app/[locale]/[offeringId]/[interval]/upgrade/[cartId]/(startLayout)/start/page.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ export default async function Upgrade({
6666
);
6767
const [cart, cms] = await Promise.all([cartDataPromise, cmsDataPromise]);
6868

69+
const isCancelInterstitialOffer =
70+
searchParams?.['entrypoint'] === 'subscription-management';
71+
6972
return (
7073
<>
7174
{session?.user?.email && (
@@ -185,6 +188,8 @@ export default async function Upgrade({
185188
paypalClientId={config.paypal.clientId}
186189
sessionUid={session?.user?.id}
187190
sessionEmail={session?.user?.email ?? undefined}
191+
metricsEnabled={session?.user?.metricsEnabled ?? true}
192+
isCancelInterstitialOffer={isCancelInterstitialOffer}
188193
/>
189194
)}
190195
</section>

apps/payments/next/app/[locale]/layout.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,12 @@ export default async function RootProviderLayout({
2929
glean: {
3030
enabled: config.gleanClientConfig.enabled,
3131
applicationId: config.gleanClientConfig.applicationId,
32+
uploadEnabled: config.gleanClientConfig.uploadEnabled,
3233
version: config.gleanClientConfig.version,
3334
channel: config.gleanClientConfig.channel,
35+
serverEndpoint: config.gleanClientConfig.serverEndpoint,
36+
logPings: config.gleanClientConfig.logPings,
37+
debugViewTag: config.gleanClientConfig.debugViewTag,
3438
},
3539
sentry: {
3640
...config.sentry, //spread to make sure its a POJO

0 commit comments

Comments
 (0)