Skip to content

Commit 99aa580

Browse files
committed
Removed trafficAnalytics flag from apps/
ref https://linear.app/ghost/issue/PROD-2321/ - removed the trafficAnalytics flag and behavior from Settings - updated readme in stats app
1 parent b5b1e5f commit 99aa580

File tree

4 files changed

+34
-111
lines changed

4 files changed

+34
-111
lines changed

apps/admin-x-settings/src/components/settings/advanced/labs/PrivateFeatures.tsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,6 @@ const features: Feature[] = [{
1515
title: 'Stripe Automatic Tax (private beta)',
1616
description: 'Use Stripe Automatic Tax at Stripe Checkout. Needs to be enabled in Stripe',
1717
flag: 'stripeAutomaticTax'
18-
}, {
19-
title: 'Traffic Analytics (private beta)',
20-
description: 'Enables traffic analytics',
21-
flag: 'trafficAnalytics'
2218
}, {
2319
title: 'Email customization (internal beta)',
2420
description: 'Newsletter customization settings that have been released to Ghost\'s own production sites',

apps/admin-x-settings/src/components/settings/membership/Analytics.tsx

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, {useEffect, useState} from 'react';
22
import TopLevelGroup from '../../TopLevelGroup';
3-
import useFeatureFlag from '../../../hooks/useFeatureFlag';
43
import useSettingGroup from '../../../hooks/useSettingGroup';
54
import {HostLimitError, useLimiter} from '../../../hooks/useLimiter';
65
import {Separator, SettingGroupContent, Toggle, withErrorBoundary} from '@tryghost/admin-x-design-system';
@@ -21,7 +20,6 @@ const Analytics: React.FC<{ keywords: string[] }> = ({keywords}) => {
2120
const [trackEmailOpens, trackEmailClicks, trackMemberSources, outboundLinkTagging, isWebAnalyticsConfigured, isWebAnalyticsEnabled] = getSettingValues(localSettings, [
2221
'email_track_opens', 'email_track_clicks', 'members_track_sources', 'outbound_link_tagging', 'web_analytics_configured', 'web_analytics_enabled'
2322
]) as boolean[];
24-
const taBetaFlagEnabled = useFeatureFlag('trafficAnalytics');
2523
const isEmailTrackClicksReadOnly = isSettingReadOnly(localSettings, 'email_track_clicks');
2624

2725
const [isWebAnalyticsLimited, setIsWebAnalyticsLimited] = useState(false);
@@ -45,42 +43,38 @@ const Analytics: React.FC<{ keywords: string[] }> = ({keywords}) => {
4543

4644
const inputs = (
4745
<SettingGroupContent className="analytics-settings !gap-y-0" columns={1}>
48-
{taBetaFlagEnabled && (
49-
<>
50-
<Toggle
51-
checked={isWebAnalyticsEnabled}
52-
direction='rtl'
53-
disabled={!isWebAnalyticsConfigured || isWebAnalyticsLimited}
54-
gap='gap-0'
55-
hint='Cookie-free, first party traffic analytics for your site'
56-
label='Web analytics'
57-
labelClasses='py-4 w-full'
58-
onChange={(e) => {
59-
handleToggleChange('web_analytics', e);
60-
}}
61-
/>
62-
{(
63-
isWebAnalyticsLimited ? (
64-
<div className='mb-5 rounded-md border border-grey-200 bg-grey-50 px-4 py-2.5 text-sm dark:border-grey-900 dark:bg-grey-925'>
65-
<span className='flex items-start gap-2'>
66-
<span>
67-
Web analytics is available on the Publisher plan and above. <span className='text-green underline' onClick={() => updateRoute({route: '/pro', isExternal: true})}>Upgrade now &rarr;</span>
68-
</span>
69-
</span>
70-
</div>
71-
) : !isWebAnalyticsConfigured ? (
72-
<div className='mb-5 rounded-md border border-grey-200 bg-grey-50 px-4 py-2.5 text-sm dark:border-grey-900 dark:bg-grey-925'>
73-
<span className='flex items-start gap-2'>
74-
<span>
75-
Web analytics in Ghost is powered by <a className='text-green underline' href="https://tinybird.co" rel="noopener noreferrer" target='_blank'>Tinybird</a> and requires configuration to start collecting data. <a className='text-green underline' href="https://ghost.org/docs/" rel="noopener noreferrer" target='_blank'>Get started &rarr;</a>
76-
</span>
77-
</span>
78-
</div>
79-
) : (
80-
<Separator className="border-grey-200 dark:border-grey-900" />
81-
)
82-
)}
83-
</>
46+
<Toggle
47+
checked={isWebAnalyticsEnabled}
48+
direction='rtl'
49+
disabled={!isWebAnalyticsConfigured || isWebAnalyticsLimited}
50+
gap='gap-0'
51+
hint='Cookie-free, first party traffic analytics for your site'
52+
label='Web analytics'
53+
labelClasses='py-4 w-full'
54+
onChange={(e) => {
55+
handleToggleChange('web_analytics', e);
56+
}}
57+
/>
58+
{(
59+
isWebAnalyticsLimited ? (
60+
<div className='mb-5 rounded-md border border-grey-200 bg-grey-50 px-4 py-2.5 text-sm dark:border-grey-900 dark:bg-grey-925'>
61+
<span className='flex items-start gap-2'>
62+
<span>
63+
Web analytics is available on the Publisher plan and above. <span className='text-green underline' onClick={() => updateRoute({route: '/pro', isExternal: true})}>Upgrade now &rarr;</span>
64+
</span>
65+
</span>
66+
</div>
67+
) : !isWebAnalyticsConfigured ? (
68+
<div className='mb-5 rounded-md border border-grey-200 bg-grey-50 px-4 py-2.5 text-sm dark:border-grey-900 dark:bg-grey-925'>
69+
<span className='flex items-start gap-2'>
70+
<span>
71+
Web analytics in Ghost is powered by <a className='text-green underline' href="https://tinybird.co" rel="noopener noreferrer" target='_blank'>Tinybird</a> and requires configuration to start collecting data. <a className='text-green underline' href="https://ghost.org/docs/" rel="noopener noreferrer" target='_blank'>Get started &rarr;</a>
72+
</span>
73+
</span>
74+
</div>
75+
) : (
76+
<Separator className="border-grey-200 dark:border-grey-900" />
77+
)
8478
)}
8579
<Toggle
8680
checked={trackEmailOpens}

apps/admin-x-settings/test/acceptance/membership/analytics.test.ts

Lines changed: 2 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@ import {expect, test} from '@playwright/test';
22
import {globalDataRequests, mockApi, responseFixtures, updatedSettingsResponse} from '@tryghost/admin-x-framework/test/acceptance';
33

44
// Helper functions to reduce mockApi boilerplate
5-
const createConfigWithFeatureFlags = (trafficAnalytics: boolean, limits?: any) => ({
5+
const createConfigWithFeatureFlags = (limits?: any) => ({
66
...globalDataRequests.browseConfig,
77
response: {
88
config: {
99
...responseFixtures.config.config,
10-
labs: {
11-
...responseFixtures.config.config.labs,
12-
trafficAnalytics
13-
},
1410
hostSettings: limits ? {
1511
...responseFixtures.config.config.hostSettings,
1612
limits
@@ -31,14 +27,12 @@ const createSettingsWithAnalytics = (additionalSettings: Array<{key: string, val
3127
});
3228

3329
const createMockApiConfig = (options: {
34-
trafficAnalytics?: boolean;
3530
limits?: any;
3631
analyticsSettings?: Array<{key: string, value: any, is_read_only?: boolean}>;
3732
editSettingsResponse?: Array<{key: string, value: any}>;
3833
additionalRequests?: any;
3934
}) => {
4035
const {
41-
trafficAnalytics = false,
4236
limits,
4337
analyticsSettings = [],
4438
editSettingsResponse,
@@ -47,7 +41,7 @@ const createMockApiConfig = (options: {
4741

4842
const requests: any = {
4943
...globalDataRequests,
50-
browseConfig: createConfigWithFeatureFlags(trafficAnalytics, limits),
44+
browseConfig: createConfigWithFeatureFlags(limits),
5145
...additionalRequests
5246
};
5347

@@ -69,7 +63,6 @@ const createMockApiConfig = (options: {
6963
test.describe('Analytics settings', async () => {
7064
test('Supports toggling analytics settings', async ({page}) => {
7165
const {lastApiRequests} = await mockApi({page, requests: createMockApiConfig({
72-
trafficAnalytics: true,
7366
analyticsSettings: [
7467
{key: 'web_analytics', value: true},
7568
{key: 'web_analytics_enabled', value: true},
@@ -163,59 +156,8 @@ test.describe('Analytics settings', async () => {
163156

164157
await expect(newsletterClicksToggle).toBeDisabled();
165158
});
166-
167-
test('Shows web analytics toggle when feature flag is enabled', async ({page}) => {
168-
await mockApi({page, requests: createMockApiConfig({
169-
trafficAnalytics: true,
170-
analyticsSettings: [
171-
{key: 'web_analytics', value: true},
172-
{key: 'web_analytics_enabled', value: true},
173-
{key: 'web_analytics_configured', value: true}
174-
]
175-
})});
176-
177-
await page.goto('/');
178-
179-
const section = page.getByTestId('analytics');
180-
181-
await expect(section).toBeVisible();
182-
183-
// Web analytics toggle should be visible when feature flag is enabled
184-
await expect(section.getByLabel('Web analytics')).toBeVisible();
185-
await expect(section.getByLabel('Web analytics')).toBeEnabled();
186-
await expect(section.getByLabel('Web analytics')).toBeChecked();
187-
188-
// Other analytics toggles should still be visible
189-
await expect(section.getByLabel('Newsletter opens')).toBeVisible();
190-
await expect(section.getByLabel('Newsletter clicks')).toBeVisible();
191-
await expect(section.getByLabel('Member sources')).toBeVisible();
192-
await expect(section.getByLabel('Outbound link tagging')).toBeVisible();
193-
});
194-
195-
test('Hides web analytics toggle when feature flag is disabled', async ({page}) => {
196-
await mockApi({page, requests: createMockApiConfig({
197-
trafficAnalytics: false
198-
})});
199-
200-
await page.goto('/');
201-
202-
const section = page.getByTestId('analytics');
203-
204-
await expect(section).toBeVisible();
205-
206-
// Web analytics toggle should not be visible when feature flag is disabled
207-
await expect(section.getByLabel('Web analytics')).not.toBeVisible();
208-
209-
// Other analytics toggles should still be visible
210-
await expect(section.getByLabel('Newsletter opens')).toBeVisible();
211-
await expect(section.getByLabel('Newsletter clicks')).toBeVisible();
212-
await expect(section.getByLabel('Member sources')).toBeVisible();
213-
await expect(section.getByLabel('Outbound link tagging')).toBeVisible();
214-
});
215-
216159
test('Shows web analytics toggle as disabled when web_analytics_configured is false', async ({page}) => {
217160
await mockApi({page, requests: createMockApiConfig({
218-
trafficAnalytics: true,
219161
analyticsSettings: [
220162
{key: 'web_analytics', value: true},
221163
{key: 'web_analytics_enabled', value: false},
@@ -243,7 +185,6 @@ test.describe('Analytics settings', async () => {
243185

244186
test('Shows web analytics toggle as enabled and respects user setting', async ({page}) => {
245187
const {lastApiRequests} = await mockApi({page, requests: createMockApiConfig({
246-
trafficAnalytics: true,
247188
analyticsSettings: [
248189
{key: 'web_analytics', value: true},
249190
{key: 'web_analytics_enabled', value: true},
@@ -279,7 +220,6 @@ test.describe('Analytics settings', async () => {
279220

280221
test('Cannot toggle web analytics when disabled', async ({page}) => {
281222
await mockApi({page, requests: createMockApiConfig({
282-
trafficAnalytics: true,
283223
analyticsSettings: [
284224
{key: 'web_analytics', value: false},
285225
{key: 'web_analytics_enabled', value: false}
@@ -304,7 +244,6 @@ test.describe('Analytics settings', async () => {
304244

305245
test('Can enable web analytics when it starts deselected', async ({page}) => {
306246
const {lastApiRequests} = await mockApi({page, requests: createMockApiConfig({
307-
trafficAnalytics: true,
308247
analyticsSettings: [
309248
{key: 'web_analytics', value: false}, // Starts as false
310249
{key: 'web_analytics_enabled', value: false}, // Feature is OFF but configurable
@@ -340,7 +279,6 @@ test.describe('Analytics settings', async () => {
340279

341280
test('Shows upgrade CTA when analytics is limited (trial plan)', async ({page}) => {
342281
await mockApi({page, requests: createMockApiConfig({
343-
trafficAnalytics: true,
344282
limits: {
345283
...responseFixtures.config.config.hostSettings?.limits,
346284
limitAnalytics: {
@@ -377,7 +315,6 @@ test.describe('Analytics settings', async () => {
377315

378316
test('Shows configuration message when not limited but not configured', async ({page}) => {
379317
await mockApi({page, requests: createMockApiConfig({
380-
trafficAnalytics: true,
381318
limits: {}, // No limits
382319
analyticsSettings: [
383320
{key: 'web_analytics', value: false},
@@ -402,7 +339,6 @@ test.describe('Analytics settings', async () => {
402339

403340
test('Shows separator when configured and not limited', async ({page}) => {
404341
await mockApi({page, requests: createMockApiConfig({
405-
trafficAnalytics: true,
406342
limits: {}, // No limits
407343
analyticsSettings: [
408344
{key: 'web_analytics', value: true},
@@ -427,7 +363,6 @@ test.describe('Analytics settings', async () => {
427363

428364
test('Upgrade now button navigates to /pro', async ({page}) => {
429365
await mockApi({page, requests: createMockApiConfig({
430-
trafficAnalytics: true,
431366
limits: {
432367
...responseFixtures.config.config.hostSettings?.limits,
433368
limitAnalytics: {

apps/stats/README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ yarn
4343
yarn dev
4444
```
4545

46-
The Stats app is only displayed if the `trafficAnalytics` labs flag is enabled. With this enabled, the "Stats" tab should appear in your site's dashboard.
47-
4846
### Build
4947

5048
```bash

0 commit comments

Comments
 (0)