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,632 @@
1
+ /**
2
+ * Datadog Product Analytics Integration
3
+ *
4
+ * Queries Datadog Product Analytics for enhanced user behavior data:
5
+ * - Conversion funnels with drop-off analysis
6
+ * - Cohort retention analysis
7
+ * - User journey mapping
8
+ * - Frustration signals (rage clicks, error clicks, dead clicks)
9
+ *
10
+ * Product Analytics uses the same SDK as RUM, providing unified
11
+ * performance + behavior data without needing Google Analytics.
12
+ *
13
+ * @author Kanmi Obasa <i@kanmiobasa.com>
14
+ */
15
+ // =============================================================================
16
+ // ENHANCED SESSION QUERY
17
+ // =============================================================================
18
+ /**
19
+ * Query Datadog for enhanced session data including frustration signals.
20
+ */
21
+ export async function queryEnhancedSessions(config) {
22
+ const startTime = Date.now();
23
+ const site = config.site || 'datadoghq.com';
24
+ // Build RUM query with action/error data
25
+ const filters = [
26
+ '@type:session',
27
+ '@session.time_spent:>0',
28
+ ];
29
+ if (config.applicationId) {
30
+ filters.push(`@application.id:${config.applicationId}`);
31
+ }
32
+ // Query sessions
33
+ const sessionResponse = await fetch(`https://api.${site}/api/v2/rum/events/search`, {
34
+ method: 'POST',
35
+ headers: {
36
+ 'Content-Type': 'application/json',
37
+ 'DD-API-KEY': config.apiKey,
38
+ 'DD-APPLICATION-KEY': config.appKey,
39
+ },
40
+ body: JSON.stringify({
41
+ filter: {
42
+ query: filters.join(' '),
43
+ from: `${config.startDate}T00:00:00Z`,
44
+ to: `${config.endDate}T23:59:59Z`,
45
+ },
46
+ page: { limit: 10000 },
47
+ sort: '-timestamp',
48
+ }),
49
+ });
50
+ if (!sessionResponse.ok) {
51
+ const error = await sessionResponse.text();
52
+ throw new Error(`Datadog API error: ${sessionResponse.status} - ${error}`);
53
+ }
54
+ const sessionData = await sessionResponse.json();
55
+ // Query actions for frustration signals
56
+ let actionsData = { data: [] };
57
+ if (config.includeFrustrationSignals) {
58
+ const actionsResponse = await fetch(`https://api.${site}/api/v2/rum/events/search`, {
59
+ method: 'POST',
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ 'DD-API-KEY': config.apiKey,
63
+ 'DD-APPLICATION-KEY': config.appKey,
64
+ },
65
+ body: JSON.stringify({
66
+ filter: {
67
+ query: '@type:action @action.frustration.type:*',
68
+ from: `${config.startDate}T00:00:00Z`,
69
+ to: `${config.endDate}T23:59:59Z`,
70
+ },
71
+ page: { limit: 10000 },
72
+ }),
73
+ });
74
+ if (actionsResponse.ok) {
75
+ actionsData = await actionsResponse.json();
76
+ }
77
+ }
78
+ // Build enhanced sessions
79
+ const sessions = transformToEnhancedSessions(sessionData.data || [], actionsData.data || []);
80
+ return {
81
+ sessions,
82
+ metadata: {
83
+ totalSessions: sessions.length,
84
+ queryTimeMs: Date.now() - startTime,
85
+ period: { start: config.startDate, end: config.endDate },
86
+ includedFrustration: config.includeFrustrationSignals,
87
+ },
88
+ };
89
+ }
90
+ // =============================================================================
91
+ // FUNNEL ANALYSIS
92
+ // =============================================================================
93
+ /**
94
+ * Query and analyze a conversion funnel.
95
+ */
96
+ export async function queryFunnel(config, steps) {
97
+ const site = config.site || 'datadoghq.com';
98
+ // Query actions matching funnel steps
99
+ const stepResults = [];
100
+ let previousSessions = 0;
101
+ for (let i = 0; i < steps.length; i++) {
102
+ const step = steps[i];
103
+ // Query sessions that reached this step
104
+ const query = `@type:action @action.name:"${step.selector}"`;
105
+ const response = await fetch(`https://api.${site}/api/v2/rum/analytics/aggregate`, {
106
+ method: 'POST',
107
+ headers: {
108
+ 'Content-Type': 'application/json',
109
+ 'DD-API-KEY': config.apiKey,
110
+ 'DD-APPLICATION-KEY': config.appKey,
111
+ },
112
+ body: JSON.stringify({
113
+ filter: {
114
+ query,
115
+ from: `${config.startDate}T00:00:00Z`,
116
+ to: `${config.endDate}T23:59:59Z`,
117
+ },
118
+ compute: [
119
+ { aggregation: 'cardinality', metric: '@session.id' },
120
+ { aggregation: 'pc75', metric: '@view.largest_contentful_paint' },
121
+ { aggregation: 'pc75', metric: '@action.frustration.type' },
122
+ ],
123
+ group_by: [],
124
+ }),
125
+ });
126
+ if (!response.ok) {
127
+ throw new Error(`Funnel query failed for step: ${step.name}`);
128
+ }
129
+ const data = await response.json();
130
+ const buckets = data.data?.buckets || [];
131
+ const sessions = buckets[0]?.computes?.['c0'] || 0;
132
+ const p75Lcp = buckets[0]?.computes?.['c1'] || null;
133
+ const dropOffRate = i === 0 ? 0 : previousSessions > 0
134
+ ? (previousSessions - sessions) / previousSessions
135
+ : 0;
136
+ stepResults.push({
137
+ name: step.name,
138
+ sessions,
139
+ conversionRate: previousSessions > 0 ? sessions / previousSessions : 1,
140
+ dropOffRate,
141
+ avgTimeToNext: null, // Would need additional query
142
+ performance: {
143
+ p75Lcp,
144
+ p75Inp: null,
145
+ frustrationRate: 0,
146
+ },
147
+ });
148
+ previousSessions = sessions;
149
+ }
150
+ const firstStep = stepResults[0]?.sessions || 0;
151
+ const lastStep = stepResults[stepResults.length - 1]?.sessions || 0;
152
+ return {
153
+ steps: stepResults,
154
+ overallConversionRate: firstStep > 0 ? lastStep / firstStep : 0,
155
+ totalSessions: firstStep,
156
+ medianTimeToConvert: null,
157
+ };
158
+ }
159
+ /**
160
+ * Analyze funnel with performance correlation.
161
+ */
162
+ export function analyzeFunnelPerformanceImpact(funnel, _sessions) {
163
+ const stepAnalysis = funnel.steps.map(step => {
164
+ // This would correlate session performance with funnel progression
165
+ // Simplified for now
166
+ return {
167
+ step: step.name,
168
+ fastSessions: { count: 0, conversionRate: 0 },
169
+ slowSessions: { count: 0, conversionRate: 0 },
170
+ performanceImpact: 0,
171
+ };
172
+ });
173
+ const recommendations = [];
174
+ // Find steps with high drop-off
175
+ for (const step of funnel.steps) {
176
+ if (step.dropOffRate > 0.5) {
177
+ recommendations.push(`High drop-off at "${step.name}" (${(step.dropOffRate * 100).toFixed(0)}%). ` +
178
+ `Check page performance and UX.`);
179
+ }
180
+ if (step.performance.p75Lcp && step.performance.p75Lcp > 2500) {
181
+ recommendations.push(`Slow LCP at "${step.name}" (${step.performance.p75Lcp}ms). ` +
182
+ `Performance may be impacting conversions.`);
183
+ }
184
+ }
185
+ return { stepAnalysis, recommendations };
186
+ }
187
+ // =============================================================================
188
+ // COHORT RETENTION
189
+ // =============================================================================
190
+ /**
191
+ * Query cohort retention data.
192
+ */
193
+ export async function queryCohortRetention(config, cohort, periods = 12, periodType = 'week') {
194
+ const site = config.site || 'datadoghq.com';
195
+ // Query initial cohort size
196
+ const cohortQuery = cohort.query || '@type:session';
197
+ const initialResponse = await fetch(`https://api.${site}/api/v2/rum/analytics/aggregate`, {
198
+ method: 'POST',
199
+ headers: {
200
+ 'Content-Type': 'application/json',
201
+ 'DD-API-KEY': config.apiKey,
202
+ 'DD-APPLICATION-KEY': config.appKey,
203
+ },
204
+ body: JSON.stringify({
205
+ filter: {
206
+ query: cohortQuery,
207
+ from: cohort.period?.start || config.startDate,
208
+ to: cohort.period?.end || config.endDate,
209
+ },
210
+ compute: [
211
+ { aggregation: 'cardinality', metric: '@usr.id' },
212
+ ],
213
+ }),
214
+ });
215
+ if (!initialResponse.ok) {
216
+ throw new Error('Failed to query cohort');
217
+ }
218
+ const initialData = await initialResponse.json();
219
+ const initialUsers = initialData.data?.buckets?.[0]?.computes?.['c0'] || 0;
220
+ // Query retention for each period
221
+ const retention = [];
222
+ const startDate = new Date(cohort.period?.start || config.startDate);
223
+ for (let i = 0; i <= periods; i++) {
224
+ const periodStart = new Date(startDate);
225
+ const periodEnd = new Date(startDate);
226
+ if (periodType === 'day') {
227
+ periodStart.setDate(periodStart.getDate() + i);
228
+ periodEnd.setDate(periodEnd.getDate() + i + 1);
229
+ }
230
+ else if (periodType === 'week') {
231
+ periodStart.setDate(periodStart.getDate() + i * 7);
232
+ periodEnd.setDate(periodEnd.getDate() + (i + 1) * 7);
233
+ }
234
+ else {
235
+ periodStart.setMonth(periodStart.getMonth() + i);
236
+ periodEnd.setMonth(periodEnd.getMonth() + i + 1);
237
+ }
238
+ // Query returning users in this period
239
+ const retentionResponse = await fetch(`https://api.${site}/api/v2/rum/analytics/aggregate`, {
240
+ method: 'POST',
241
+ headers: {
242
+ 'Content-Type': 'application/json',
243
+ 'DD-API-KEY': config.apiKey,
244
+ 'DD-APPLICATION-KEY': config.appKey,
245
+ },
246
+ body: JSON.stringify({
247
+ filter: {
248
+ query: `${cohortQuery} @session.is_first_visit:false`,
249
+ from: periodStart.toISOString(),
250
+ to: periodEnd.toISOString(),
251
+ },
252
+ compute: [
253
+ { aggregation: 'cardinality', metric: '@usr.id' },
254
+ { aggregation: 'sum', metric: '@action.custom.value' },
255
+ ],
256
+ }),
257
+ });
258
+ if (retentionResponse.ok) {
259
+ const data = await retentionResponse.json();
260
+ const usersReturned = data.data?.buckets?.[0]?.computes?.['c0'] || 0;
261
+ const revenue = data.data?.buckets?.[0]?.computes?.['c1'] || 0;
262
+ retention.push({
263
+ period: i,
264
+ label: `${periodType} ${i}`,
265
+ usersReturned,
266
+ retentionRate: initialUsers > 0 ? usersReturned / initialUsers : 0,
267
+ revenue,
268
+ });
269
+ }
270
+ }
271
+ // Calculate average LTV
272
+ const totalRevenue = retention.reduce((sum, r) => sum + r.revenue, 0);
273
+ const avgLtv = initialUsers > 0 ? totalRevenue / initialUsers : 0;
274
+ return {
275
+ cohort: cohort.name,
276
+ initialUsers,
277
+ retention,
278
+ avgLtv,
279
+ };
280
+ }
281
+ // =============================================================================
282
+ // USER JOURNEY MAPPING
283
+ // =============================================================================
284
+ /**
285
+ * Build user journey map from session data.
286
+ */
287
+ export function buildUserJourneyMap(sessions) {
288
+ const pageTransitions = new Map();
289
+ const pageStats = new Map();
290
+ const paths = new Map();
291
+ for (const session of sessions) {
292
+ const pages = session.pages_visited || [];
293
+ if (pages.length === 0)
294
+ continue;
295
+ // Track path
296
+ const pathKey = pages.join(' -> ');
297
+ const existing = paths.get(pathKey) || { count: 0, conversions: 0 };
298
+ existing.count++;
299
+ if (session.has_purchase)
300
+ existing.conversions++;
301
+ paths.set(pathKey, existing);
302
+ // Track page transitions
303
+ for (let i = 0; i < pages.length; i++) {
304
+ const page = pages[i];
305
+ const stats = pageStats.get(page) || { sessions: 0, totalTime: 0, exits: 0 };
306
+ stats.sessions++;
307
+ if (i === pages.length - 1) {
308
+ stats.exits++;
309
+ }
310
+ else {
311
+ const nextPage = pages[i + 1];
312
+ if (!pageTransitions.has(page)) {
313
+ pageTransitions.set(page, new Map());
314
+ }
315
+ const transitions = pageTransitions.get(page);
316
+ transitions.set(nextPage, (transitions.get(nextPage) || 0) + 1);
317
+ }
318
+ pageStats.set(page, stats);
319
+ }
320
+ }
321
+ // Build entry points
322
+ const entryPages = new Map();
323
+ for (const session of sessions) {
324
+ const entry = session.entry_page || session.pages_visited?.[0];
325
+ if (entry) {
326
+ entryPages.set(entry, (entryPages.get(entry) || 0) + 1);
327
+ }
328
+ }
329
+ const entryPoints = [];
330
+ for (const [page, count] of entryPages) {
331
+ const stats = pageStats.get(page);
332
+ const transitions = pageTransitions.get(page);
333
+ const nextPages = [];
334
+ if (transitions) {
335
+ const total = Array.from(transitions.values()).reduce((a, b) => a + b, 0);
336
+ for (const [nextPage, transCount] of transitions) {
337
+ nextPages.push({ page: nextPage, probability: transCount / total });
338
+ }
339
+ nextPages.sort((a, b) => b.probability - a.probability);
340
+ }
341
+ entryPoints.push({
342
+ page,
343
+ sessions: count,
344
+ avgTimeSpent: 0, // Would need duration data
345
+ exitRate: stats ? stats.exits / stats.sessions : 0,
346
+ nextPages: nextPages.slice(0, 5),
347
+ });
348
+ }
349
+ entryPoints.sort((a, b) => b.sessions - a.sessions);
350
+ // Get common paths
351
+ const commonPaths = Array.from(paths.entries())
352
+ .map(([path, data]) => ({
353
+ path: path.split(' -> '),
354
+ count: data.count,
355
+ conversionRate: data.count > 0 ? data.conversions / data.count : 0,
356
+ }))
357
+ .sort((a, b) => b.count - a.count)
358
+ .slice(0, 10);
359
+ // Calculate average journey length
360
+ const totalPages = sessions.reduce((sum, s) => sum + (s.pages_visited?.length || 0), 0);
361
+ const avgJourneyLength = sessions.length > 0 ? totalPages / sessions.length : 0;
362
+ return {
363
+ entryPoints: entryPoints.slice(0, 10),
364
+ totalJourneys: sessions.length,
365
+ avgJourneyLength,
366
+ commonPaths,
367
+ };
368
+ }
369
+ // =============================================================================
370
+ // FRUSTRATION ANALYSIS
371
+ // =============================================================================
372
+ /**
373
+ * Analyze frustration signals and their impact on conversions.
374
+ */
375
+ export function analyzeFrustrationImpact(sessions) {
376
+ const frustratedSessions = sessions.filter(s => s.frustration && s.frustration.frustrationScore > 0);
377
+ const nonFrustratedSessions = sessions.filter(s => !s.frustration || s.frustration.frustrationScore === 0);
378
+ const frustratedConversions = frustratedSessions.filter(s => s.has_purchase).length;
379
+ const nonFrustratedConversions = nonFrustratedSessions.filter(s => s.has_purchase).length;
380
+ const cvrWithFrustration = frustratedSessions.length > 0
381
+ ? frustratedConversions / frustratedSessions.length
382
+ : 0;
383
+ const cvrWithoutFrustration = nonFrustratedSessions.length > 0
384
+ ? nonFrustratedConversions / nonFrustratedSessions.length
385
+ : 0;
386
+ // Analyze by signal type
387
+ const signalTypes = ['rageClicks', 'deadClicks', 'errorClicks'];
388
+ const bySignalType = signalTypes.map(type => {
389
+ const affected = sessions.filter(s => s.frustration && s.frustration[type] > 0);
390
+ const conversions = affected.filter(s => s.has_purchase).length;
391
+ return {
392
+ type: type.replace(/([A-Z])/g, ' $1').trim(),
393
+ count: affected.reduce((sum, s) => sum + (s.frustration?.[type] || 0), 0),
394
+ sessionsAffected: affected.length,
395
+ conversionRate: affected.length > 0 ? conversions / affected.length : 0,
396
+ };
397
+ });
398
+ // Generate recommendations
399
+ const recommendations = [];
400
+ if (cvrWithFrustration < cvrWithoutFrustration * 0.8) {
401
+ recommendations.push(`Frustrated users convert ${((1 - cvrWithFrustration / cvrWithoutFrustration) * 100).toFixed(0)}% less. ` +
402
+ `Prioritize UX improvements.`);
403
+ }
404
+ for (const signal of bySignalType) {
405
+ if (signal.sessionsAffected > sessions.length * 0.1) {
406
+ recommendations.push(`${signal.sessionsAffected} sessions (${((signal.sessionsAffected / sessions.length) * 100).toFixed(0)}%) ` +
407
+ `experienced ${signal.type}. Review affected interactions.`);
408
+ }
409
+ }
410
+ return {
411
+ summary: {
412
+ totalSessions: sessions.length,
413
+ frustratedSessions: frustratedSessions.length,
414
+ frustrationRate: sessions.length > 0 ? frustratedSessions.length / sessions.length : 0,
415
+ conversionWithFrustration: cvrWithFrustration,
416
+ conversionWithoutFrustration: cvrWithoutFrustration,
417
+ conversionImpact: cvrWithoutFrustration - cvrWithFrustration,
418
+ },
419
+ bySignalType,
420
+ recommendations,
421
+ };
422
+ }
423
+ // =============================================================================
424
+ // HELPERS
425
+ // =============================================================================
426
+ function transformToEnhancedSessions(sessionEvents, actionEvents) {
427
+ const sessionMap = new Map();
428
+ const frustrationMap = new Map();
429
+ // Build frustration signals from actions
430
+ for (const event of actionEvents) {
431
+ const attrs = event.attributes;
432
+ const sessionId = attrs?.session?.id;
433
+ if (!sessionId)
434
+ continue;
435
+ const signals = frustrationMap.get(sessionId) || {
436
+ rageClicks: 0,
437
+ deadClicks: 0,
438
+ errorClicks: 0,
439
+ frustrationScore: 0,
440
+ };
441
+ const action = attrs?.action;
442
+ const actionFrustration = action?.frustration;
443
+ const frustType = actionFrustration?.type;
444
+ if (frustType === 'rage_click')
445
+ signals.rageClicks++;
446
+ if (frustType === 'dead_click')
447
+ signals.deadClicks++;
448
+ if (frustType === 'error_click')
449
+ signals.errorClicks++;
450
+ signals.frustrationScore =
451
+ signals.rageClicks * 3 +
452
+ signals.deadClicks * 1 +
453
+ signals.errorClicks * 2;
454
+ frustrationMap.set(sessionId, signals);
455
+ }
456
+ // Build enhanced sessions
457
+ for (const event of sessionEvents) {
458
+ const attrs = event.attributes;
459
+ const sessionId = attrs?.session?.id;
460
+ if (!sessionId)
461
+ continue;
462
+ if (!sessionMap.has(sessionId)) {
463
+ const session = attrs.session;
464
+ const device = attrs.device;
465
+ const view = attrs.view;
466
+ const geo = attrs.geo;
467
+ const usr = attrs.usr;
468
+ const timestamp = (attrs['@timestamp'] || attrs.date);
469
+ const timestampDate = new Date(timestamp);
470
+ const enhanced = {
471
+ session_id: sessionId,
472
+ lcp_ms: view?.largest_contentful_paint || null,
473
+ fcp_ms: view?.first_contentful_paint || null,
474
+ inp_ms: view?.interaction_to_next_paint || null,
475
+ cls: view?.cumulative_layout_shift || null,
476
+ ttfb_ms: view?.time_to_first_byte || null,
477
+ tti_ms: view?.dom_interactive || null,
478
+ onload_ms: view?.load_event || null,
479
+ page_size_kb: null,
480
+ has_purchase: false,
481
+ purchase_value: 0,
482
+ conversions: [],
483
+ bounced: session?.view_count === 1,
484
+ page_views: session?.view_count || 1,
485
+ session_duration_ms: session?.time_spent || null,
486
+ device: normalizeDevice(device?.type),
487
+ page_type: extractPageType(view?.url_path),
488
+ country: geo?.country,
489
+ region: geo?.region,
490
+ user_id: usr?.id,
491
+ is_new_user: session?.is_first_visit,
492
+ timestamp,
493
+ hour_of_day: timestampDate.getHours(),
494
+ day_of_week: timestampDate.getDay(),
495
+ frustration: frustrationMap.get(sessionId),
496
+ hasReplay: session?.has_replay || false,
497
+ engagementScore: calculateEngagementScore(session),
498
+ actions: [],
499
+ errors: [],
500
+ };
501
+ sessionMap.set(sessionId, enhanced);
502
+ }
503
+ }
504
+ return Array.from(sessionMap.values());
505
+ }
506
+ function normalizeDevice(type) {
507
+ if (!type)
508
+ return 'desktop';
509
+ const normalized = type.toLowerCase();
510
+ if (normalized.includes('mobile') || normalized.includes('phone'))
511
+ return 'mobile';
512
+ if (normalized.includes('tablet') || normalized.includes('ipad'))
513
+ return 'tablet';
514
+ return 'desktop';
515
+ }
516
+ function extractPageType(urlPath) {
517
+ if (!urlPath)
518
+ return 'unknown';
519
+ const path = urlPath.toLowerCase();
520
+ if (path.includes('/product/') || path.includes('/p/'))
521
+ return 'pdp';
522
+ if (path.includes('/category/') || path.includes('/c/') || path.includes('/shop/'))
523
+ return 'plp';
524
+ if (path.includes('/checkout') || path.includes('/cart'))
525
+ return 'checkout';
526
+ if (path === '/' || path.includes('/home'))
527
+ return 'homepage';
528
+ return 'other';
529
+ }
530
+ function calculateEngagementScore(session) {
531
+ let score = 0;
532
+ // Base score from views
533
+ const views = session?.view_count || 0;
534
+ score += Math.min(views * 10, 30);
535
+ // Time spent (max 30 points for 5+ minutes)
536
+ const timeSpent = session?.time_spent || 0;
537
+ score += Math.min((timeSpent / 1000 / 60) * 6, 30);
538
+ // Actions taken
539
+ const actions = session?.action_count || 0;
540
+ score += Math.min(actions * 5, 20);
541
+ // Not bouncing
542
+ if (views > 1)
543
+ score += 10;
544
+ // Has conversion
545
+ if (session?.has_purchase)
546
+ score += 10;
547
+ return Math.min(score, 100);
548
+ }
549
+ // =============================================================================
550
+ // REPORT GENERATION
551
+ // =============================================================================
552
+ /**
553
+ * Generate markdown report for Product Analytics data.
554
+ */
555
+ export function generateProductAnalyticsMarkdown(sessions, funnel, retention) {
556
+ const lines = [];
557
+ lines.push('## Product Analytics Report');
558
+ lines.push('');
559
+ // Overview
560
+ const frustratedCount = sessions.filter(s => s.frustration && s.frustration.frustrationScore > 0).length;
561
+ const avgEngagement = sessions.reduce((sum, s) => sum + (s.engagementScore || 0), 0) / sessions.length;
562
+ lines.push('### Session Overview');
563
+ lines.push('');
564
+ lines.push(`| Metric | Value |`);
565
+ lines.push(`|--------|-------|`);
566
+ lines.push(`| Total Sessions | ${sessions.length.toLocaleString()} |`);
567
+ lines.push(`| Avg Engagement Score | ${avgEngagement.toFixed(1)}/100 |`);
568
+ lines.push(`| Frustrated Sessions | ${frustratedCount} (${((frustratedCount / sessions.length) * 100).toFixed(1)}%) |`);
569
+ lines.push(`| Sessions with Replay | ${sessions.filter(s => s.hasReplay).length} |`);
570
+ lines.push('');
571
+ // Frustration analysis
572
+ const frustrationData = analyzeFrustrationImpact(sessions);
573
+ lines.push('### Frustration Analysis');
574
+ lines.push('');
575
+ lines.push(`| Signal | Sessions | Impact on CVR |`);
576
+ lines.push(`|--------|----------|---------------|`);
577
+ for (const signal of frustrationData.bySignalType) {
578
+ lines.push(`| ${signal.type} | ${signal.sessionsAffected} | ${(signal.conversionRate * 100).toFixed(2)}% |`);
579
+ }
580
+ lines.push('');
581
+ if (frustrationData.recommendations.length > 0) {
582
+ lines.push('**Recommendations:**');
583
+ for (const rec of frustrationData.recommendations) {
584
+ lines.push(`- ${rec}`);
585
+ }
586
+ lines.push('');
587
+ }
588
+ // Funnel
589
+ if (funnel) {
590
+ lines.push('### Conversion Funnel');
591
+ lines.push('');
592
+ lines.push(`| Step | Sessions | Conversion | Drop-off |`);
593
+ lines.push(`|------|----------|------------|----------|`);
594
+ for (const step of funnel.steps) {
595
+ lines.push(`| ${step.name} | ${step.sessions.toLocaleString()} | ${(step.conversionRate * 100).toFixed(1)}% | ${(step.dropOffRate * 100).toFixed(1)}% |`);
596
+ }
597
+ lines.push('');
598
+ lines.push(`**Overall Conversion:** ${(funnel.overallConversionRate * 100).toFixed(2)}%`);
599
+ lines.push('');
600
+ }
601
+ // Retention
602
+ if (retention) {
603
+ lines.push('### Cohort Retention');
604
+ lines.push('');
605
+ lines.push(`**Cohort:** ${retention.cohort}`);
606
+ lines.push(`**Initial Users:** ${retention.initialUsers.toLocaleString()}`);
607
+ lines.push(`**Avg LTV:** $${retention.avgLtv.toFixed(2)}`);
608
+ lines.push('');
609
+ lines.push(`| Period | Retention | Revenue |`);
610
+ lines.push(`|--------|-----------|---------|`);
611
+ for (const period of retention.retention.slice(0, 8)) {
612
+ lines.push(`| ${period.label} | ${(period.retentionRate * 100).toFixed(1)}% | $${period.revenue.toLocaleString()} |`);
613
+ }
614
+ lines.push('');
615
+ }
616
+ // User journey
617
+ const journey = buildUserJourneyMap(sessions);
618
+ lines.push('### User Journeys');
619
+ lines.push('');
620
+ lines.push(`**Total Journeys:** ${journey.totalJourneys.toLocaleString()}`);
621
+ lines.push(`**Avg Journey Length:** ${journey.avgJourneyLength.toFixed(1)} pages`);
622
+ lines.push('');
623
+ if (journey.commonPaths.length > 0) {
624
+ lines.push('**Top Paths:**');
625
+ for (const path of journey.commonPaths.slice(0, 5)) {
626
+ lines.push(`- ${path.path.join(' → ')} (${path.count} sessions, ${(path.conversionRate * 100).toFixed(1)}% CVR)`);
627
+ }
628
+ lines.push('');
629
+ }
630
+ return lines.join('\n');
631
+ }
632
+ //# sourceMappingURL=datadog-product-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datadog-product-analytics.js","sourceRoot":"","sources":["../../src/empirical/datadog-product-analytics.ts"],"names":[],"mappings":"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"}