kanmi-perf-revenue 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +347 -173
  2. package/dist/empirical/ab-testing.d.ts +83 -0
  3. package/dist/empirical/ab-testing.d.ts.map +1 -0
  4. package/dist/empirical/ab-testing.js +281 -0
  5. package/dist/empirical/ab-testing.js.map +1 -0
  6. package/dist/empirical/alerting.d.ts +85 -0
  7. package/dist/empirical/alerting.d.ts.map +1 -0
  8. package/dist/empirical/alerting.js +358 -0
  9. package/dist/empirical/alerting.js.map +1 -0
  10. package/dist/empirical/attribution.d.ts +80 -0
  11. package/dist/empirical/attribution.d.ts.map +1 -0
  12. package/dist/empirical/attribution.js +305 -0
  13. package/dist/empirical/attribution.js.map +1 -0
  14. package/dist/empirical/cohort.d.ts +75 -0
  15. package/dist/empirical/cohort.d.ts.map +1 -0
  16. package/dist/empirical/cohort.js +305 -0
  17. package/dist/empirical/cohort.js.map +1 -0
  18. package/dist/empirical/conversion-curve.d.ts +7 -10
  19. package/dist/empirical/conversion-curve.d.ts.map +1 -1
  20. package/dist/empirical/conversion-curve.js +37 -4
  21. package/dist/empirical/conversion-curve.js.map +1 -1
  22. package/dist/empirical/correlation.d.ts +91 -0
  23. package/dist/empirical/correlation.d.ts.map +1 -0
  24. package/dist/empirical/correlation.js +461 -0
  25. package/dist/empirical/correlation.js.map +1 -0
  26. package/dist/empirical/data-import.d.ts +22 -0
  27. package/dist/empirical/data-import.d.ts.map +1 -1
  28. package/dist/empirical/data-import.js +44 -0
  29. package/dist/empirical/data-import.js.map +1 -1
  30. package/dist/empirical/datadog-product-analytics.d.ts +192 -0
  31. package/dist/empirical/datadog-product-analytics.d.ts.map +1 -0
  32. package/dist/empirical/datadog-product-analytics.js +632 -0
  33. package/dist/empirical/datadog-product-analytics.js.map +1 -0
  34. package/dist/empirical/datadog-session-query.d.ts +32 -0
  35. package/dist/empirical/datadog-session-query.d.ts.map +1 -1
  36. package/dist/empirical/datadog-session-query.js +238 -17
  37. package/dist/empirical/datadog-session-query.js.map +1 -1
  38. package/dist/empirical/engagement-analysis.d.ts +112 -0
  39. package/dist/empirical/engagement-analysis.d.ts.map +1 -0
  40. package/dist/empirical/engagement-analysis.js +354 -0
  41. package/dist/empirical/engagement-analysis.js.map +1 -0
  42. package/dist/empirical/export.d.ts +75 -0
  43. package/dist/empirical/export.d.ts.map +1 -0
  44. package/dist/empirical/export.js +392 -0
  45. package/dist/empirical/export.js.map +1 -0
  46. package/dist/empirical/forecasting.d.ts +80 -0
  47. package/dist/empirical/forecasting.d.ts.map +1 -0
  48. package/dist/empirical/forecasting.js +287 -0
  49. package/dist/empirical/forecasting.js.map +1 -0
  50. package/dist/empirical/funnel.d.ts +66 -0
  51. package/dist/empirical/funnel.d.ts.map +1 -0
  52. package/dist/empirical/funnel.js +293 -0
  53. package/dist/empirical/funnel.js.map +1 -0
  54. package/dist/empirical/history.d.ts +198 -0
  55. package/dist/empirical/history.d.ts.map +1 -0
  56. package/dist/empirical/history.js +396 -0
  57. package/dist/empirical/history.js.map +1 -0
  58. package/dist/empirical/index.d.ts +41 -16
  59. package/dist/empirical/index.d.ts.map +1 -1
  60. package/dist/empirical/index.js +96 -13
  61. package/dist/empirical/index.js.map +1 -1
  62. package/dist/empirical/interactions.d.ts +89 -0
  63. package/dist/empirical/interactions.d.ts.map +1 -0
  64. package/dist/empirical/interactions.js +346 -0
  65. package/dist/empirical/interactions.js.map +1 -0
  66. package/dist/empirical/opportunity-calculator.d.ts +6 -18
  67. package/dist/empirical/opportunity-calculator.d.ts.map +1 -1
  68. package/dist/empirical/opportunity-calculator.js +19 -1
  69. package/dist/empirical/opportunity-calculator.js.map +1 -1
  70. package/dist/empirical/report.d.ts +3 -11
  71. package/dist/empirical/report.d.ts.map +1 -1
  72. package/dist/empirical/report.js +11 -7
  73. package/dist/empirical/report.js.map +1 -1
  74. package/dist/empirical/roi-calculator.d.ts +104 -0
  75. package/dist/empirical/roi-calculator.d.ts.map +1 -0
  76. package/dist/empirical/roi-calculator.js +403 -0
  77. package/dist/empirical/roi-calculator.js.map +1 -0
  78. package/dist/empirical/seasonality.d.ts +80 -0
  79. package/dist/empirical/seasonality.d.ts.map +1 -0
  80. package/dist/empirical/seasonality.js +340 -0
  81. package/dist/empirical/seasonality.js.map +1 -0
  82. package/dist/empirical/segmentation.d.ts +135 -0
  83. package/dist/empirical/segmentation.d.ts.map +1 -0
  84. package/dist/empirical/segmentation.js +379 -0
  85. package/dist/empirical/segmentation.js.map +1 -0
  86. package/dist/empirical/statistics.d.ts +118 -0
  87. package/dist/empirical/statistics.d.ts.map +1 -0
  88. package/dist/empirical/statistics.js +344 -0
  89. package/dist/empirical/statistics.js.map +1 -0
  90. package/dist/empirical/sweet-spot.d.ts +81 -0
  91. package/dist/empirical/sweet-spot.d.ts.map +1 -0
  92. package/dist/empirical/sweet-spot.js +198 -0
  93. package/dist/empirical/sweet-spot.js.map +1 -0
  94. package/package.json +2 -2
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Seasonality Analysis
3
+ *
4
+ * Analyzes time-based patterns in performance and conversion data.
5
+ * Accounts for day-of-week, hour-of-day, and weekly trends.
6
+ *
7
+ * Key insights:
8
+ * - When does performance degrade (peak hours)?
9
+ * - When are conversion rates highest/lowest?
10
+ * - How does performance-CVR relationship change by time?
11
+ *
12
+ * @author Kanmi Obasa <i@kanmiobasa.com>
13
+ */
14
+ import type { SessionData } from './datadog-session-query.js';
15
+ export interface HourlyPattern {
16
+ hour: number;
17
+ sessions: number;
18
+ conversions: number;
19
+ cvr: number;
20
+ avgLcp: number | null;
21
+ avgInp: number | null;
22
+ /** Index: 0=lowest CVR hour, 100=highest CVR hour */
23
+ cvrIndex: number;
24
+ }
25
+ export interface DayOfWeekPattern {
26
+ day: number;
27
+ dayName: string;
28
+ sessions: number;
29
+ conversions: number;
30
+ cvr: number;
31
+ avgLcp: number | null;
32
+ avgInp: number | null;
33
+ cvrIndex: number;
34
+ }
35
+ export interface WeeklyTrend {
36
+ weekNumber: number;
37
+ weekStart: string;
38
+ sessions: number;
39
+ conversions: number;
40
+ cvr: number;
41
+ avgLcp: number | null;
42
+ trend: 'improving' | 'declining' | 'stable';
43
+ }
44
+ export interface SeasonalityReport {
45
+ hourly: HourlyPattern[];
46
+ dayOfWeek: DayOfWeekPattern[];
47
+ weekly: WeeklyTrend[];
48
+ insights: SeasonalInsight[];
49
+ peakHours: number[];
50
+ lowHours: number[];
51
+ bestDays: string[];
52
+ worstDays: string[];
53
+ performanceDegradationHours: number[];
54
+ }
55
+ export interface SeasonalInsight {
56
+ type: 'hourly' | 'daily' | 'weekly' | 'performance';
57
+ severity: 'info' | 'warning' | 'opportunity';
58
+ message: string;
59
+ }
60
+ /**
61
+ * Analyze hourly patterns.
62
+ */
63
+ export declare function analyzeHourlyPatterns(sessions: SessionData[]): HourlyPattern[];
64
+ /**
65
+ * Analyze day-of-week patterns.
66
+ */
67
+ export declare function analyzeDayOfWeekPatterns(sessions: SessionData[]): DayOfWeekPattern[];
68
+ /**
69
+ * Analyze weekly trends.
70
+ */
71
+ export declare function analyzeWeeklyTrends(sessions: SessionData[]): WeeklyTrend[];
72
+ /**
73
+ * Generate full seasonality report.
74
+ */
75
+ export declare function analyzeSeasonality(sessions: SessionData[]): SeasonalityReport;
76
+ /**
77
+ * Generate markdown report for seasonality analysis.
78
+ */
79
+ export declare function generateSeasonalityMarkdown(report: SeasonalityReport): string;
80
+ //# sourceMappingURL=seasonality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seasonality.d.ts","sourceRoot":"","sources":["../../src/empirical/seasonality.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAO9D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2BAA2B,EAAE,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAC;IACpD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAQD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAwD9E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAyDpF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA0D1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,iBAAiB,CA8F7E;AAMD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAoE7E"}
@@ -0,0 +1,340 @@
1
+ /**
2
+ * Seasonality Analysis
3
+ *
4
+ * Analyzes time-based patterns in performance and conversion data.
5
+ * Accounts for day-of-week, hour-of-day, and weekly trends.
6
+ *
7
+ * Key insights:
8
+ * - When does performance degrade (peak hours)?
9
+ * - When are conversion rates highest/lowest?
10
+ * - How does performance-CVR relationship change by time?
11
+ *
12
+ * @author Kanmi Obasa <i@kanmiobasa.com>
13
+ */
14
+ import { calculateConfidenceInterval } from './statistics.js';
15
+ // =============================================================================
16
+ // ANALYSIS FUNCTIONS
17
+ // =============================================================================
18
+ const DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
19
+ /**
20
+ * Analyze hourly patterns.
21
+ */
22
+ export function analyzeHourlyPatterns(sessions) {
23
+ const hourlyData = new Map();
24
+ // Initialize all hours
25
+ for (let h = 0; h < 24; h++) {
26
+ hourlyData.set(h, { sessions: [], conversions: 0 });
27
+ }
28
+ // Bucket sessions by hour
29
+ for (const session of sessions) {
30
+ const hour = session.hour_of_day ?? new Date(session.timestamp || Date.now()).getHours();
31
+ const data = hourlyData.get(hour);
32
+ data.sessions.push(session);
33
+ if (session.has_purchase) {
34
+ data.conversions++;
35
+ }
36
+ }
37
+ // Calculate patterns
38
+ const patterns = [];
39
+ let minCvr = Infinity;
40
+ let maxCvr = 0;
41
+ for (let hour = 0; hour < 24; hour++) {
42
+ const data = hourlyData.get(hour);
43
+ const sessionCount = data.sessions.length;
44
+ const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
45
+ const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
46
+ const inpValues = data.sessions.map((s) => s.inp_ms).filter((v) => v !== null);
47
+ patterns.push({
48
+ hour,
49
+ sessions: sessionCount,
50
+ conversions: data.conversions,
51
+ cvr,
52
+ avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
53
+ avgInp: inpValues.length > 0 ? inpValues.reduce((a, b) => a + b, 0) / inpValues.length : null,
54
+ cvrIndex: 0, // Will be set below
55
+ });
56
+ if (sessionCount >= 10) {
57
+ minCvr = Math.min(minCvr, cvr);
58
+ maxCvr = Math.max(maxCvr, cvr);
59
+ }
60
+ }
61
+ // Calculate CVR index (normalize to 0-100)
62
+ const cvrRange = maxCvr - minCvr;
63
+ for (const pattern of patterns) {
64
+ if (pattern.sessions >= 10 && cvrRange > 0) {
65
+ pattern.cvrIndex = ((pattern.cvr - minCvr) / cvrRange) * 100;
66
+ }
67
+ }
68
+ return patterns;
69
+ }
70
+ /**
71
+ * Analyze day-of-week patterns.
72
+ */
73
+ export function analyzeDayOfWeekPatterns(sessions) {
74
+ const dailyData = new Map();
75
+ // Initialize all days
76
+ for (let d = 0; d < 7; d++) {
77
+ dailyData.set(d, { sessions: [], conversions: 0 });
78
+ }
79
+ // Bucket sessions by day
80
+ for (const session of sessions) {
81
+ const day = session.day_of_week ?? new Date(session.timestamp || Date.now()).getDay();
82
+ const data = dailyData.get(day);
83
+ data.sessions.push(session);
84
+ if (session.has_purchase) {
85
+ data.conversions++;
86
+ }
87
+ }
88
+ // Calculate patterns
89
+ const patterns = [];
90
+ let minCvr = Infinity;
91
+ let maxCvr = 0;
92
+ for (let day = 0; day < 7; day++) {
93
+ const data = dailyData.get(day);
94
+ const sessionCount = data.sessions.length;
95
+ const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
96
+ const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
97
+ const inpValues = data.sessions.map((s) => s.inp_ms).filter((v) => v !== null);
98
+ patterns.push({
99
+ day,
100
+ dayName: DAY_NAMES[day],
101
+ sessions: sessionCount,
102
+ conversions: data.conversions,
103
+ cvr,
104
+ avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
105
+ avgInp: inpValues.length > 0 ? inpValues.reduce((a, b) => a + b, 0) / inpValues.length : null,
106
+ cvrIndex: 0,
107
+ });
108
+ if (sessionCount >= 10) {
109
+ minCvr = Math.min(minCvr, cvr);
110
+ maxCvr = Math.max(maxCvr, cvr);
111
+ }
112
+ }
113
+ // Calculate CVR index
114
+ const cvrRange = maxCvr - minCvr;
115
+ for (const pattern of patterns) {
116
+ if (pattern.sessions >= 10 && cvrRange > 0) {
117
+ pattern.cvrIndex = ((pattern.cvr - minCvr) / cvrRange) * 100;
118
+ }
119
+ }
120
+ return patterns;
121
+ }
122
+ /**
123
+ * Analyze weekly trends.
124
+ */
125
+ export function analyzeWeeklyTrends(sessions) {
126
+ // Group by week
127
+ const weeklyData = new Map();
128
+ for (const session of sessions) {
129
+ const date = new Date(session.timestamp || Date.now());
130
+ const weekStart = getWeekStart(date);
131
+ const weekKey = weekStart.toISOString().split('T')[0];
132
+ if (!weeklyData.has(weekKey)) {
133
+ weeklyData.set(weekKey, { sessions: [], conversions: 0, weekStart });
134
+ }
135
+ const data = weeklyData.get(weekKey);
136
+ data.sessions.push(session);
137
+ if (session.has_purchase) {
138
+ data.conversions++;
139
+ }
140
+ }
141
+ // Sort by week
142
+ const sortedWeeks = Array.from(weeklyData.entries()).sort((a, b) => a[0].localeCompare(b[0]));
143
+ // Calculate trends
144
+ const trends = [];
145
+ let prevCvr = null;
146
+ for (let i = 0; i < sortedWeeks.length; i++) {
147
+ const [weekKey, data] = sortedWeeks[i];
148
+ const sessionCount = data.sessions.length;
149
+ const cvr = sessionCount > 0 ? data.conversions / sessionCount : 0;
150
+ const lcpValues = data.sessions.map((s) => s.lcp_ms).filter((v) => v !== null);
151
+ let trend = 'stable';
152
+ if (prevCvr !== null) {
153
+ const change = cvr - prevCvr;
154
+ if (change > 0.005)
155
+ trend = 'improving';
156
+ else if (change < -0.005)
157
+ trend = 'declining';
158
+ }
159
+ trends.push({
160
+ weekNumber: i + 1,
161
+ weekStart: weekKey,
162
+ sessions: sessionCount,
163
+ conversions: data.conversions,
164
+ cvr,
165
+ avgLcp: lcpValues.length > 0 ? lcpValues.reduce((a, b) => a + b, 0) / lcpValues.length : null,
166
+ trend,
167
+ });
168
+ prevCvr = cvr;
169
+ }
170
+ return trends;
171
+ }
172
+ /**
173
+ * Generate full seasonality report.
174
+ */
175
+ export function analyzeSeasonality(sessions) {
176
+ const hourly = analyzeHourlyPatterns(sessions);
177
+ const dayOfWeek = analyzeDayOfWeekPatterns(sessions);
178
+ const weekly = analyzeWeeklyTrends(sessions);
179
+ const insights = [];
180
+ // Find peak and low hours
181
+ const significantHours = hourly.filter((h) => h.sessions >= 10);
182
+ const sortedByCvr = [...significantHours].sort((a, b) => b.cvr - a.cvr);
183
+ const peakHours = sortedByCvr.slice(0, 3).map((h) => h.hour);
184
+ const lowHours = sortedByCvr.slice(-3).map((h) => h.hour);
185
+ // Find hours where performance degrades
186
+ const avgLcp = calculateAverage(hourly.map((h) => h.avgLcp).filter((v) => v !== null));
187
+ const performanceDegradationHours = hourly
188
+ .filter((h) => h.avgLcp !== null && h.avgLcp > avgLcp * 1.2)
189
+ .map((h) => h.hour);
190
+ // Best/worst days
191
+ const significantDays = dayOfWeek.filter((d) => d.sessions >= 10);
192
+ const sortedDays = [...significantDays].sort((a, b) => b.cvr - a.cvr);
193
+ const bestDays = sortedDays.slice(0, 2).map((d) => d.dayName);
194
+ const worstDays = sortedDays.slice(-2).map((d) => d.dayName);
195
+ // Generate insights
196
+ if (peakHours.length > 0 && lowHours.length > 0) {
197
+ const peakCvr = sortedByCvr[0].cvr;
198
+ const lowCvr = sortedByCvr[sortedByCvr.length - 1].cvr;
199
+ if (peakCvr > lowCvr * 1.3) {
200
+ insights.push({
201
+ type: 'hourly',
202
+ severity: 'opportunity',
203
+ message: `CVR varies ${((peakCvr / lowCvr - 1) * 100).toFixed(0)}% between peak (${formatHour(peakHours[0])}) and low hours (${formatHour(lowHours[0])})`,
204
+ });
205
+ }
206
+ }
207
+ if (performanceDegradationHours.length > 0) {
208
+ insights.push({
209
+ type: 'performance',
210
+ severity: 'warning',
211
+ message: `Performance degrades during: ${performanceDegradationHours.map(formatHour).join(', ')}`,
212
+ });
213
+ }
214
+ if (bestDays.length > 0 && worstDays.length > 0) {
215
+ const bestDayData = sortedDays[0];
216
+ const worstDayData = sortedDays[sortedDays.length - 1];
217
+ // Check if difference is statistically significant
218
+ const ci = calculateConfidenceInterval(bestDayData.conversions, bestDayData.sessions);
219
+ if (bestDayData.cvr > worstDayData.cvr * 1.2) {
220
+ insights.push({
221
+ type: 'daily',
222
+ severity: 'opportunity',
223
+ message: `${bestDays[0]} converts ${((bestDayData.cvr / worstDayData.cvr - 1) * 100).toFixed(0)}% better than ${worstDays[worstDays.length - 1]} (${(ci.lower * 100).toFixed(2)}%-${(ci.upper * 100).toFixed(2)}% CI)`,
224
+ });
225
+ }
226
+ }
227
+ // Weekly trend insight
228
+ if (weekly.length >= 2) {
229
+ const recentWeeks = weekly.slice(-3);
230
+ const improvingCount = recentWeeks.filter((w) => w.trend === 'improving').length;
231
+ const decliningCount = recentWeeks.filter((w) => w.trend === 'declining').length;
232
+ if (improvingCount >= 2) {
233
+ insights.push({
234
+ type: 'weekly',
235
+ severity: 'info',
236
+ message: 'CVR trending upward over recent weeks',
237
+ });
238
+ }
239
+ else if (decliningCount >= 2) {
240
+ insights.push({
241
+ type: 'weekly',
242
+ severity: 'warning',
243
+ message: 'CVR trending downward over recent weeks - investigate performance changes',
244
+ });
245
+ }
246
+ }
247
+ return {
248
+ hourly,
249
+ dayOfWeek,
250
+ weekly,
251
+ insights,
252
+ peakHours,
253
+ lowHours,
254
+ bestDays,
255
+ worstDays,
256
+ performanceDegradationHours,
257
+ };
258
+ }
259
+ // =============================================================================
260
+ // REPORT GENERATION
261
+ // =============================================================================
262
+ /**
263
+ * Generate markdown report for seasonality analysis.
264
+ */
265
+ export function generateSeasonalityMarkdown(report) {
266
+ const lines = [];
267
+ lines.push('## Seasonality Analysis');
268
+ lines.push('');
269
+ // Key Insights
270
+ if (report.insights.length > 0) {
271
+ lines.push('### Key Insights');
272
+ lines.push('');
273
+ for (const insight of report.insights) {
274
+ const icon = insight.severity === 'warning' ? '⚠️' : insight.severity === 'opportunity' ? '💡' : 'ℹ️';
275
+ lines.push(`- ${icon} ${insight.message}`);
276
+ }
277
+ lines.push('');
278
+ }
279
+ // Hourly Patterns
280
+ lines.push('### Hourly Patterns');
281
+ lines.push('');
282
+ lines.push('| Hour | Sessions | CVR | LCP | Index |');
283
+ lines.push('|------|----------|-----|-----|-------|');
284
+ for (const hour of report.hourly) {
285
+ const isPeak = report.peakHours.includes(hour.hour);
286
+ const isLow = report.lowHours.includes(hour.hour);
287
+ const marker = isPeak ? ' 🔥' : isLow ? ' ❄️' : '';
288
+ lines.push(`| ${formatHour(hour.hour)}${marker} | ${hour.sessions.toLocaleString()} | ${(hour.cvr * 100).toFixed(2)}% | ${hour.avgLcp ? `${hour.avgLcp.toFixed(0)}ms` : 'N/A'} | ${hour.cvrIndex.toFixed(0)} |`);
289
+ }
290
+ lines.push('');
291
+ // Day of Week
292
+ lines.push('### Day of Week');
293
+ lines.push('');
294
+ lines.push('| Day | Sessions | CVR | LCP | Index |');
295
+ lines.push('|-----|----------|-----|-----|-------|');
296
+ for (const day of report.dayOfWeek) {
297
+ const isBest = report.bestDays.includes(day.dayName);
298
+ const isWorst = report.worstDays.includes(day.dayName);
299
+ const marker = isBest ? ' 🔥' : isWorst ? ' ❄️' : '';
300
+ lines.push(`| ${day.dayName}${marker} | ${day.sessions.toLocaleString()} | ${(day.cvr * 100).toFixed(2)}% | ${day.avgLcp ? `${day.avgLcp.toFixed(0)}ms` : 'N/A'} | ${day.cvrIndex.toFixed(0)} |`);
301
+ }
302
+ lines.push('');
303
+ // Weekly Trends
304
+ if (report.weekly.length > 0) {
305
+ lines.push('### Weekly Trends');
306
+ lines.push('');
307
+ lines.push('| Week | Sessions | CVR | LCP | Trend |');
308
+ lines.push('|------|----------|-----|-----|-------|');
309
+ for (const week of report.weekly) {
310
+ const trendIcon = week.trend === 'improving' ? '📈' : week.trend === 'declining' ? '📉' : '➡️';
311
+ lines.push(`| ${week.weekStart} | ${week.sessions.toLocaleString()} | ${(week.cvr * 100).toFixed(2)}% | ${week.avgLcp ? `${week.avgLcp.toFixed(0)}ms` : 'N/A'} | ${trendIcon} ${week.trend} |`);
312
+ }
313
+ lines.push('');
314
+ }
315
+ return lines.join('\n');
316
+ }
317
+ // =============================================================================
318
+ // HELPERS
319
+ // =============================================================================
320
+ function getWeekStart(date) {
321
+ const d = new Date(date);
322
+ const day = d.getDay();
323
+ const diff = d.getDate() - day;
324
+ return new Date(d.setDate(diff));
325
+ }
326
+ function formatHour(hour) {
327
+ if (hour === 0)
328
+ return '12am';
329
+ if (hour === 12)
330
+ return '12pm';
331
+ if (hour < 12)
332
+ return `${hour}am`;
333
+ return `${hour - 12}pm`;
334
+ }
335
+ function calculateAverage(values) {
336
+ if (values.length === 0)
337
+ return 0;
338
+ return values.reduce((a, b) => a + b, 0) / values.length;
339
+ }
340
+ //# sourceMappingURL=seasonality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seasonality.js","sourceRoot":"","sources":["../../src/empirical/seasonality.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Segmentation Analysis
3
+ *
4
+ * Analyze conversion rates and performance impact by segment:
5
+ * - Device (mobile, desktop, tablet)
6
+ * - Page type (PDP, PLP, checkout, homepage)
7
+ * - Geography (country, region)
8
+ * - Traffic source (organic, paid, direct, social, etc.)
9
+ * - Custom events (purchase, add_to_cart, signup, lead)
10
+ *
11
+ * @author Kanmi Obasa <i@kanmiobasa.com>
12
+ */
13
+ import type { SessionData } from './datadog-session-query.js';
14
+ export interface SegmentStats {
15
+ /** Segment name */
16
+ name: string;
17
+ /** Number of sessions */
18
+ sessions: number;
19
+ /** Percentage of total sessions */
20
+ session_pct: number;
21
+ /** Number of conversions */
22
+ conversions: number;
23
+ /** Conversion rate */
24
+ cvr: number;
25
+ /** Total revenue */
26
+ revenue: number;
27
+ /** Average order value */
28
+ aov: number;
29
+ /** Performance metrics (median values) */
30
+ performance: {
31
+ lcp_p50: number | null;
32
+ fcp_p50: number | null;
33
+ inp_p50: number | null;
34
+ cls_p50: number | null;
35
+ ttfb_p50: number | null;
36
+ };
37
+ /** Bounce rate */
38
+ bounce_rate: number;
39
+ /** Average page views */
40
+ avg_page_views: number;
41
+ }
42
+ export interface SegmentComparison {
43
+ /** Segment being compared */
44
+ segment: string;
45
+ /** Base segment (e.g., 'desktop' when comparing mobile) */
46
+ baseline: string;
47
+ /** CVR difference (segment - baseline) */
48
+ cvr_diff: number;
49
+ /** Relative CVR difference ((segment - baseline) / baseline) */
50
+ cvr_relative_diff: number;
51
+ /** Is the difference significant? */
52
+ is_significant: boolean;
53
+ /** Insight text */
54
+ insight: string;
55
+ }
56
+ export interface SegmentationReport {
57
+ /** Analysis by device */
58
+ by_device: {
59
+ segments: SegmentStats[];
60
+ comparisons: SegmentComparison[];
61
+ insight: string;
62
+ };
63
+ /** Analysis by page type */
64
+ by_page_type: {
65
+ segments: SegmentStats[];
66
+ comparisons: SegmentComparison[];
67
+ insight: string;
68
+ };
69
+ /** Analysis by country */
70
+ by_country: {
71
+ segments: SegmentStats[];
72
+ comparisons: SegmentComparison[];
73
+ insight: string;
74
+ };
75
+ /** Analysis by traffic source */
76
+ by_traffic_source: {
77
+ segments: SegmentStats[];
78
+ comparisons: SegmentComparison[];
79
+ insight: string;
80
+ };
81
+ /** Analysis by conversion event type */
82
+ by_event_type: {
83
+ events: EventStats[];
84
+ insight: string;
85
+ };
86
+ /** Summary */
87
+ summary: {
88
+ total_sessions: number;
89
+ highest_cvr_segment: {
90
+ type: string;
91
+ name: string;
92
+ cvr: number;
93
+ };
94
+ lowest_cvr_segment: {
95
+ type: string;
96
+ name: string;
97
+ cvr: number;
98
+ };
99
+ biggest_opportunity: string;
100
+ };
101
+ }
102
+ export interface EventStats {
103
+ /** Event name */
104
+ name: string;
105
+ /** Number of sessions with this event */
106
+ sessions: number;
107
+ /** Event rate (sessions with event / total sessions) */
108
+ rate: number;
109
+ /** Total value of events */
110
+ total_value: number;
111
+ /** Average value per event */
112
+ avg_value: number;
113
+ }
114
+ export type SegmentType = 'device' | 'page_type' | 'country' | 'traffic_source';
115
+ /**
116
+ * Analyze sessions by a specific segment.
117
+ */
118
+ export declare function analyzeBySegment(sessions: SessionData[], segmentType: SegmentType, eventName?: string): SegmentStats[];
119
+ /**
120
+ * Compare segments to find significant differences.
121
+ */
122
+ export declare function compareSegments(stats: SegmentStats[], baselineName?: string): SegmentComparison[];
123
+ /**
124
+ * Analyze conversion events across all sessions.
125
+ */
126
+ export declare function analyzeEvents(sessions: SessionData[]): EventStats[];
127
+ /**
128
+ * Generate a complete segmentation report.
129
+ */
130
+ export declare function generateSegmentationReport(sessions: SessionData[], eventName?: string): SegmentationReport;
131
+ /**
132
+ * Generate markdown report for segmentation analysis.
133
+ */
134
+ export declare function generateSegmentationMarkdown(report: SegmentationReport): string;
135
+ //# sourceMappingURL=segmentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segmentation.d.ts","sourceRoot":"","sources":["../../src/empirical/segmentation.ts"],"names":[],"mappings":"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"}