make-mp-data 3.0.3 → 3.0.5

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 (70) hide show
  1. package/README.md +46 -0
  2. package/dungeons/array-of-object-lookup-schema.json +327 -0
  3. package/dungeons/array-of-object-lookup.js +29 -9
  4. package/dungeons/capstone/capstone-ic3.js +291 -0
  5. package/dungeons/capstone/capstone-ic4.js +598 -0
  6. package/dungeons/capstone/capstone-ic5.js +668 -0
  7. package/dungeons/capstone/generate-product-lookup.js +309 -0
  8. package/dungeons/ecommerce-schema.json +462 -0
  9. package/dungeons/{copilot.js → ecommerce.js} +79 -17
  10. package/dungeons/education-schema.json +2409 -0
  11. package/dungeons/education.js +226 -462
  12. package/dungeons/fintech-schema.json +14034 -0
  13. package/dungeons/fintech.js +134 -413
  14. package/dungeons/foobar-schema.json +403 -0
  15. package/dungeons/foobar.js +27 -4
  16. package/dungeons/food-delivery-schema.json +192 -0
  17. package/dungeons/food-delivery.js +602 -0
  18. package/dungeons/food-schema.json +1152 -0
  19. package/dungeons/food.js +173 -406
  20. package/dungeons/gaming-schema.json +1270 -0
  21. package/dungeons/gaming.js +182 -42
  22. package/dungeons/insurance-application-schema.json +204 -0
  23. package/dungeons/insurance-application.js +605 -0
  24. package/dungeons/media-schema.json +906 -0
  25. package/dungeons/media.js +250 -420
  26. package/dungeons/retention-cadence-schema.json +78 -0
  27. package/dungeons/retention-cadence.js +35 -1
  28. package/dungeons/rpg-schema.json +4526 -0
  29. package/dungeons/rpg.js +171 -429
  30. package/dungeons/sanity-schema.json +255 -0
  31. package/dungeons/sanity.js +21 -10
  32. package/dungeons/sass-schema.json +1291 -0
  33. package/dungeons/sass.js +241 -368
  34. package/dungeons/scd-schema.json +919 -0
  35. package/dungeons/scd.js +41 -13
  36. package/dungeons/simple-schema.json +608 -0
  37. package/dungeons/simple.js +52 -15
  38. package/dungeons/simplest-schema.json +1418 -0
  39. package/dungeons/simplest.js +392 -0
  40. package/dungeons/social-schema.json +1118 -0
  41. package/dungeons/social.js +150 -391
  42. package/dungeons/text-generation-schema.json +3096 -0
  43. package/dungeons/text-generation.js +71 -0
  44. package/index.js +8 -6
  45. package/lib/core/config-validator.js +28 -8
  46. package/lib/core/storage.js +5 -5
  47. package/lib/generators/events.js +4 -4
  48. package/lib/orchestrators/mixpanel-sender.js +16 -13
  49. package/lib/orchestrators/user-loop.js +14 -6
  50. package/lib/templates/soup-presets.js +188 -0
  51. package/lib/utils/utils.js +52 -6
  52. package/package.json +1 -1
  53. package/types.d.ts +20 -3
  54. package/dungeons/adspend.js +0 -130
  55. package/dungeons/anon.js +0 -128
  56. package/dungeons/benchmark-heavy.js +0 -240
  57. package/dungeons/benchmark-light.js +0 -140
  58. package/dungeons/big.js +0 -226
  59. package/dungeons/business.js +0 -391
  60. package/dungeons/complex.js +0 -428
  61. package/dungeons/experiments.js +0 -137
  62. package/dungeons/funnels.js +0 -309
  63. package/dungeons/mil.js +0 -323
  64. package/dungeons/mirror.js +0 -161
  65. package/dungeons/soup-test.js +0 -52
  66. package/dungeons/streaming.js +0 -372
  67. package/dungeons/strict-event-test.js +0 -30
  68. package/dungeons/student-teacher.js +0 -438
  69. package/dungeons/too-big-events.js +0 -203
  70. package/dungeons/user-agent.js +0 -209
@@ -11,7 +11,146 @@ const chance = u.initChance(SEED);
11
11
  const num_users = 12_000;
12
12
  const days = 180;
13
13
 
14
- /** @typedef {import("../types.js").Dungeon} Config */
14
+ /** @typedef {import("../types.d.ts").Dungeon} Config */
15
+
16
+ /*
17
+ * ═══════════════════════════════════════════════════════════════════════════════
18
+ * DATASET OVERVIEW
19
+ * ═══════════════════════════════════════════════════════════════════════════════
20
+ *
21
+ * QuestForge — A D&D-inspired action RPG where players create characters,
22
+ * join parties, embark on quests, fight bosses, and level up. Think Baldur's
23
+ * Gate meets a mobile RPG with in-game purchases and seasonal content.
24
+ *
25
+ * CORE USER LOOP:
26
+ * Players install the app, create a character (race + class + alignment),
27
+ * and join a party. They then cycle through quests — starting quests,
28
+ * engaging in gameplay (attacks, defenses, enemy defeats), completing quests
29
+ * for gold rewards, fighting bosses, and leveling up. In-game purchases
30
+ * (gold, gems, weapons, armor, boosts) monetize the experience.
31
+ *
32
+ * SCALE: 12,000 users, ~1.08M events, 180 days
33
+ *
34
+ * KEY DIMENSIONS:
35
+ * - Platform: Mobile, Xbox, Playstation, Switch, Web
36
+ * - Game mode: Single Player vs Multiplayer (biased toward Multiplayer)
37
+ * - Character: 9 races, 12 classes, 9 alignments, 13 backgrounds
38
+ * - Quests: 5 types, 4 difficulties, 5 locations
39
+ * - Experiment: fast leveling / tension economy / free trial with A/B/C/Control
40
+ *
41
+ * FUNNELS:
42
+ * 1. Onboarding: app install → character creation → join party (80% conversion)
43
+ * 2. Quest loop: start quest → gameplay summary → complete quest (99% conversion)
44
+ */
45
+
46
+ /*
47
+ * ═══════════════════════════════════════════════════════════════════════════════
48
+ * ANALYTICS HOOKS
49
+ * ═══════════════════════════════════════════════════════════════════════════════
50
+ *
51
+ * This dungeon has 3 deliberate patterns engineered via hooks:
52
+ *
53
+ * ───────────────────────────────────────────────────────────────────────────────
54
+ * 1. GOLD SCALING BY LEVEL (event hook)
55
+ * ───────────────────────────────────────────────────────────────────────────────
56
+ *
57
+ * PATTERN: On "complete quest" events, the quest reward (gold) is multiplied by
58
+ * (1 + level * 0.1), so a level-10 player earns 2x gold and a level-20 player
59
+ * earns 3x gold compared to level-1.
60
+ *
61
+ * HOW TO FIND IT IN MIXPANEL:
62
+ * - Report type: Insights
63
+ * - Event: "complete quest"
64
+ * - Measure: Average of "quest reward (gold)"
65
+ * - Breakdown: "level at end"
66
+ * - Expected: Linear increase — level 1 ≈ 55 gold, level 10 ≈ 110 gold,
67
+ * level 20 ≈ 165 gold. Clear positive correlation between level and reward.
68
+ *
69
+ * ───────────────────────────────────────────────────────────────────────────────
70
+ * 2. WHALE PURCHASES (event hook)
71
+ * ───────────────────────────────────────────────────────────────────────────────
72
+ *
73
+ * PATTERN: ~33% of users (determined by first character of user_id hash) are
74
+ * "whales" who spend 1.8x on in-game purchases and are tagged is_whale: true.
75
+ *
76
+ * HOW TO FIND IT IN MIXPANEL:
77
+ *
78
+ * Report 1: Whale vs Normal Purchase Amounts
79
+ * - Report type: Insights
80
+ * - Event: "in-game purchase"
81
+ * - Measure: Average of "purchase amount"
82
+ * - Breakdown: "is_whale"
83
+ * - Expected: is_whale=true shows ~1.8x higher avg purchase amount than
84
+ * is_whale=false (e.g., ~18 vs ~10)
85
+ *
86
+ * Report 2: Revenue Concentration
87
+ * - Report type: Insights
88
+ * - Event: "in-game purchase"
89
+ * - Measure: Sum of "purchase amount"
90
+ * - Breakdown: "is_whale"
91
+ * - Expected: ~33% of users (whales) contribute disproportionate total revenue
92
+ *
93
+ * ───────────────────────────────────────────────────────────────────────────────
94
+ * 3. ALIGNMENT ARCHETYPE (user hook)
95
+ * ───────────────────────────────────────────────────────────────────────────────
96
+ *
97
+ * PATTERN: User profiles are enriched with an "archetype" property based on
98
+ * alignment. Evil alignments → "villain", Good alignments → "hero", others → "neutral".
99
+ *
100
+ * HOW TO FIND IT IN MIXPANEL:
101
+ *
102
+ * Report 1: Archetype Distribution
103
+ * - Report type: Insights
104
+ * - Event: Any event (e.g., "complete quest")
105
+ * - Measure: Total unique users
106
+ * - Breakdown: User profile "archetype"
107
+ * - Expected: Three segments — "hero" (~22%), "villain" (~22%), "neutral" (~56%)
108
+ * matching the 2/9, 2/9, 5/9 alignment split
109
+ *
110
+ * Report 2: Archetype Behavior Comparison
111
+ * - Report type: Insights
112
+ * - Event: "fight boss"
113
+ * - Measure: Total events per user
114
+ * - Breakdown: User profile "archetype"
115
+ * - Expected: All three archetypes should show similar event volumes
116
+ * (archetype doesn't affect gameplay — just a profiling hook)
117
+ *
118
+ * ═══════════════════════════════════════════════════════════════════════════════
119
+ * EXPECTED METRICS SUMMARY
120
+ * ═══════════════════════════════════════════════════════════════════════════════
121
+ *
122
+ * Hook | Metric | Baseline | Hook Effect | Ratio
123
+ * ────────────────────────|─────────────────────────|──────────|──────────────|──────
124
+ * Gold Scaling | Avg gold at level 1 | ~55 | ~55 | 1.0x
125
+ * Gold Scaling | Avg gold at level 10 | ~55 | ~110 | 2.0x
126
+ * Gold Scaling | Avg gold at level 20 | ~55 | ~165 | 3.0x
127
+ * Whale Purchases | Avg purchase (whale) | ~10 | ~18 | 1.8x
128
+ * Whale Purchases | Revenue share (whale) | ~33% | >50% | disprop.
129
+ * Alignment Archetype | Hero users | — | ~22% | 2/9
130
+ * Alignment Archetype | Villain users | — | ~22% | 2/9
131
+ * Alignment Archetype | Neutral users | — | ~56% | 5/9
132
+ *
133
+ * ═══════════════════════════════════════════════════════════════════════════════
134
+ * ADVANCED ANALYSIS IDEAS
135
+ * ═══════════════════════════════════════════════════════════════════════════════
136
+ *
137
+ * 1. Gold Economy Analysis: Plot avg gold earned by level AND quest difficulty.
138
+ * Do Legendary quests at high levels create outsized gold rewards?
139
+ *
140
+ * 2. Whale Segmentation: Cross-reference is_whale with platform and game mode.
141
+ * Are whales concentrated on mobile? Do multiplayer whales spend more?
142
+ *
143
+ * 3. Archetype × Class Matrix: Do certain class/archetype combos correlate
144
+ * with higher boss fight rates or quest completion?
145
+ *
146
+ * 4. Experiment Impact: Compare "fast leveling" vs "tension economy" vs
147
+ * "free trial" on purchase amounts, level progression, and retention.
148
+ *
149
+ * 5. Quest Difficulty Funnel: How does quest difficulty affect completion
150
+ * rate, death count, and hint/boost usage? Is "Legendary" too hard?
151
+ *
152
+ * ═══════════════════════════════════════════════════════════════════════════════
153
+ */
15
154
 
16
155
  /** @type {Config} */
17
156
  const config = {
@@ -51,26 +190,26 @@ const config = {
51
190
  conversionRate: 0.99,
52
191
  timeToConvert: 1,
53
192
  props: {
54
- "quest type": u.pickAWinner([
193
+ "quest type": [
55
194
  "Rescue",
56
195
  "Retrieve",
57
196
  "Explore",
58
197
  "Destroy",
59
198
  "Investigate",
60
- ]),
61
- "quest difficulty": u.pickAWinner([
199
+ ],
200
+ "quest difficulty": [
62
201
  "Easy",
63
202
  "Medium",
64
203
  "Hard",
65
204
  "Legendary",
66
- ]),
67
- "quest location": u.pickAWinner([
205
+ ],
206
+ "quest location": [
68
207
  "Forest",
69
208
  "Dungeon",
70
209
  "Mountain",
71
210
  "City",
72
211
  "Desert",
73
- ])
212
+ ]
74
213
  }
75
214
  },
76
215
  ],
@@ -80,7 +219,7 @@ const config = {
80
219
  event: "character creation",
81
220
  weight: 2,
82
221
  properties: {
83
- mode: u.pickAWinner(["fast", "slow", "template"]),
222
+ mode: ["fast", "slow", "template"],
84
223
  },
85
224
  },
86
225
  {
@@ -88,7 +227,7 @@ const config = {
88
227
  weight: 8,
89
228
  properties: {
90
229
  "party size": u.weighNumRange(1, 6),
91
- "party leader": u.pickAWinner([
230
+ "party leader": [
92
231
  "Bard",
93
232
  "Cleric",
94
233
  "Fighter",
@@ -98,33 +237,33 @@ const config = {
98
237
  "Ranger",
99
238
  "Sorcerer",
100
239
  "Warlock",
101
- ]),
240
+ ],
102
241
  },
103
242
  },
104
243
  {
105
244
  event: "start quest",
106
245
  weight: 12,
107
246
  properties: {
108
- "quest type": u.pickAWinner([
247
+ "quest type": [
109
248
  "Rescue",
110
249
  "Retrieve",
111
250
  "Explore",
112
251
  "Destroy",
113
252
  "Investigate",
114
- ]),
115
- "quest difficulty": u.pickAWinner([
253
+ ],
254
+ "quest difficulty": [
116
255
  "Easy",
117
256
  "Medium",
118
257
  "Hard",
119
258
  "Legendary",
120
- ]),
121
- "quest location": u.pickAWinner([
259
+ ],
260
+ "quest location": [
122
261
  "Forest",
123
262
  "Dungeon",
124
263
  "Mountain",
125
264
  "City",
126
265
  "Desert",
127
- ]),
266
+ ],
128
267
  "party size": u.weighNumRange(1, 6),
129
268
  "used hint": u.pickAWinner(["yes", "no"], 0.3),
130
269
  "used boost": u.pickAWinner(["yes", "no"], 0.2),
@@ -159,7 +298,7 @@ const config = {
159
298
  "event": "in-game purchase",
160
299
  "weight": 2,
161
300
  "properties": {
162
- "purchase type": u.pickAWinner([
301
+ "purchase type": [
163
302
  "Gold",
164
303
  "Gems",
165
304
  "Items: Weapons",
@@ -168,7 +307,7 @@ const config = {
168
307
  "Items: Scrolls",
169
308
  "Boosts",
170
309
  "Currency",
171
- ]),
310
+ ],
172
311
  "purchase amount": u.weighNumRange(1, 50, 1, 20),
173
312
  }
174
313
  },
@@ -176,63 +315,63 @@ const config = {
176
315
  event: "fight boss",
177
316
  weight: 3,
178
317
  properties: {
179
- "boss type": u.pickAWinner([
318
+ "boss type": [
180
319
  "Dragon",
181
320
  "Demon",
182
321
  "Lich",
183
322
  "Vampire",
184
323
  "Beholder",
185
- ]),
324
+ ],
186
325
  "boss level": u.weighNumRange(10, 20),
187
- "boss difficulty": u.pickAWinner([
326
+ "boss difficulty": [
188
327
  "Hard",
189
328
  "Legendary",
190
329
  "Impossible",
191
- ]),
330
+ ],
192
331
  "fight duration (mins)": u.weighNumRange(1, 60),
193
-
332
+
194
333
  },
195
334
  },
196
335
  {
197
336
  event: "level up",
198
337
  weight: 1,
199
338
  properties: {
200
- "new abilities": u.pickAWinner([
339
+ "new abilities": [
201
340
  "Attack",
202
341
  "Spell",
203
342
  "Feat",
204
343
  "Skill",
205
- ]),
344
+ ],
206
345
  },
207
346
  },
208
347
  {
209
348
  event: "attack",
210
349
  weight: 5,
211
350
  properties: {
212
- generic_prop: u.pickAWinner(["foo", "bar", "baz", "qux"]),
351
+ generic_prop: ["foo", "bar", "baz", "qux"],
213
352
  }
214
353
  },
215
354
  {
216
355
  event: "defend",
217
356
  weight: 3,
218
357
  properties: {
219
- generic_prop: u.pickAWinner(["foo", "bar", "baz", "qux"]),
358
+ generic_prop: ["foo", "bar", "baz", "qux"],
220
359
  }
221
360
  },
222
361
  ],
223
362
  superProps: {
224
- platform: u.pickAWinner([
363
+ platform: [
225
364
  "Mobile",
226
365
  "Xbox",
227
366
  "Playstation",
228
367
  "Switch",
229
368
  "Web"
230
- ]),
369
+ ],
231
370
  "game mode": u.pickAWinner([
232
371
  "Single Player",
233
372
  "Multiplayer",
234
373
  ], 1),
235
- language: u.pickAWinner([
374
+ language: [
236
375
  "English",
237
376
  "Spanish",
238
377
  "French",
@@ -240,7 +379,7 @@ const config = {
240
379
  "Japanese",
241
380
  "Korean",
242
381
  "Chinese",
243
- ], 0),
382
+ ],
244
383
 
245
384
  },
246
385
  scdProps: {
@@ -249,18 +388,18 @@ const config = {
249
388
  // "type": "number",
250
389
  // values: u.weighNumRange(0, 250, 1, 200),
251
390
  // timing: "fixed",
252
- // max: 250,
391
+ // max: 250,
253
392
  // }
254
393
  },
255
394
  userProps: {
256
- experiment: u.pickAWinner([
395
+ experiment: [
257
396
  "fast leveling",
258
397
  "tension economy",
259
398
  "free trial",
260
- ]),
399
+ ],
261
400
  variant: ["A", "B", "C", "Control"],
262
401
 
263
- race: u.pickAWinner([
402
+ race: [
264
403
  "Human",
265
404
  "Elf",
266
405
  "Dwarf",
@@ -270,8 +409,8 @@ const config = {
270
409
  "Half-Elf",
271
410
  "Half-Orc",
272
411
  "Tiefling",
273
- ]),
274
- class: u.pickAWinner([
412
+ ],
413
+ class: [
275
414
  "Barbarian",
276
415
  "Bard",
277
416
  "Cleric",
@@ -284,8 +423,8 @@ const config = {
284
423
  "Sorcerer",
285
424
  "Warlock",
286
425
  "Wizard",
287
- ]),
288
- alignment: u.pickAWinner([
426
+ ],
427
+ alignment: [
289
428
  "Lawful Good",
290
429
  "Neutral Good",
291
430
  "Chaotic Good",
@@ -295,9 +434,9 @@ const config = {
295
434
  "Lawful Evil",
296
435
  "Neutral Evil",
297
436
  "Chaotic Evil",
298
- ]),
437
+ ],
299
438
  level: u.weighNumRange(1, 20),
300
- background: u.pickAWinner([
439
+ background: [
301
440
  "Acolyte",
302
441
  "Charlatan",
303
442
  "Criminal",
@@ -311,9 +450,10 @@ const config = {
311
450
  "Sailor",
312
451
  "Soldier",
313
452
  "Urchin",
314
- ]),
453
+ ],
315
454
  "subscription MRR": u.weighNumRange(0, 250, 1, 200)
316
455
  },
456
+ // HOOK: 3 patterns — gold scaling by level, whale purchases, alignment archetype
317
457
  hook: function (record, type, meta) {
318
458
 
319
459
  if (type === "event") {
@@ -0,0 +1,204 @@
1
+ {
2
+ "events": [
3
+ {
4
+ "event": "account created",
5
+ "weight": 1,
6
+ "isFirstEvent": true,
7
+ "properties": {
8
+ "signup_source": ["web", "mobile", "agent_referral", "partner"],
9
+ "account_type": ["individual", "family", "business"]
10
+ }
11
+ },
12
+ {
13
+ "event": "page viewed",
14
+ "weight": 10,
15
+ "properties": {
16
+ "page_name": ["home", "quotes", "coverage_options", "claims", "faq", "profile", "payment", "documents"],
17
+ "referrer": ["direct", "google", "email", "social_media"]
18
+ }
19
+ },
20
+ {
21
+ "event": "quote requested",
22
+ "weight": 5,
23
+ "properties": {
24
+ "coverage_level": ["basic", "standard", "premium"],
25
+ "deductible": { "$range": [250, 5000] }
26
+ }
27
+ },
28
+ {
29
+ "event": "quote received",
30
+ "weight": 4,
31
+ "properties": {
32
+ "monthly_premium": { "$range": [30, 800] },
33
+ "coverage_amount": { "$range": [10000, 500000] },
34
+ "quote_comparison_count": { "$range": [1, 5] }
35
+ }
36
+ },
37
+ {
38
+ "event": "application started",
39
+ "weight": 4,
40
+ "properties": {
41
+ "coverage_level": ["basic", "standard", "premium"],
42
+ "estimated_premium": { "$range": [30, 800] }
43
+ }
44
+ },
45
+ {
46
+ "event": "application step completed",
47
+ "weight": 6,
48
+ "properties": {
49
+ "step_name": ["personal_info", "coverage_selection", "medical_history", "vehicle_info", "beneficiary", "review"],
50
+ "step_number": { "$range": [1, 6] },
51
+ "time_on_step_sec": { "$range": [15, 600] }
52
+ }
53
+ },
54
+ {
55
+ "event": "document uploaded",
56
+ "weight": 3,
57
+ "properties": {
58
+ "document_type": ["drivers_license", "proof_of_address", "vehicle_registration", "medical_records", "property_photos"],
59
+ "file_size_kb": { "$range": [50, 5000] }
60
+ }
61
+ },
62
+ {
63
+ "event": "application submitted",
64
+ "weight": 3,
65
+ "properties": {
66
+ "documents_attached": { "$range": [1, 5] },
67
+ "application_time_min": { "$range": [5, 60] }
68
+ }
69
+ },
70
+ {
71
+ "event": "application approved",
72
+ "weight": 2,
73
+ "properties": {
74
+ "approved_premium": { "$range": [30, 800] },
75
+ "approval_time_hours": { "$range": [1, 72] }
76
+ }
77
+ },
78
+ {
79
+ "event": "policy activated",
80
+ "weight": 2,
81
+ "properties": {
82
+ "policy_term_months": [6, 12, 12, 12, 24],
83
+ "effective_date_offset_days": { "$range": [0, 30] }
84
+ }
85
+ },
86
+ {
87
+ "event": "claim filed",
88
+ "weight": 2,
89
+ "properties": {
90
+ "claim_type": ["collision", "theft", "water_damage", "fire", "medical", "liability"],
91
+ "estimated_amount": { "$range": [100, 50000] }
92
+ }
93
+ },
94
+ {
95
+ "event": "claim status checked",
96
+ "weight": 4,
97
+ "properties": {
98
+ "claim_status": ["submitted", "under_review", "approved", "denied", "payment_pending"],
99
+ "days_since_filed": { "$range": [1, 60] }
100
+ }
101
+ },
102
+ {
103
+ "event": "payment made",
104
+ "weight": 5,
105
+ "properties": {
106
+ "payment_method": ["credit_card", "bank_transfer", "auto_pay", "check"],
107
+ "amount": { "$range": [30, 800] },
108
+ "payment_status": ["success", "success", "success", "success", "failed"]
109
+ }
110
+ },
111
+ {
112
+ "event": "support ticket created",
113
+ "weight": 4,
114
+ "properties": {
115
+ "issue_category": ["billing", "claims", "coverage", "technical", "policy_change"],
116
+ "priority": ["low", "medium", "medium", "high"],
117
+ "channel": ["chat", "phone", "email", "web_form"]
118
+ }
119
+ },
120
+ {
121
+ "event": "support ticket resolved",
122
+ "weight": 3,
123
+ "properties": {
124
+ "resolution_type": ["self_service", "agent_assisted", "escalated", "auto_resolved"],
125
+ "satisfaction_score": { "$range": [1, 5] },
126
+ "resolution_time_hours": { "$range": [1, 72] }
127
+ }
128
+ },
129
+ {
130
+ "event": "coverage reviewed",
131
+ "weight": 4,
132
+ "properties": {
133
+ "current_premium": { "$range": [30, 800] },
134
+ "coverage_adequate": [true, true, true, false]
135
+ }
136
+ },
137
+ {
138
+ "event": "profile updated",
139
+ "weight": 2,
140
+ "properties": {
141
+ "field_updated": ["address", "phone", "email", "beneficiary", "payment_method", "vehicle_info"]
142
+ }
143
+ },
144
+ {
145
+ "event": "renewal completed",
146
+ "weight": 2,
147
+ "properties": {
148
+ "renewal_premium": { "$range": [30, 800] },
149
+ "premium_change_pct": { "$range": [-15, 20] },
150
+ "auto_renewed": [true, true, false]
151
+ }
152
+ }
153
+ ],
154
+ "superProps": {
155
+ "platform": ["web", "ios", "android"],
156
+ "insurance_type": ["auto", "home", "life", "health", "renters"]
157
+ },
158
+ "userProps": {
159
+ "age_range": ["18-25", "26-35", "36-45", "46-55", "56-65", "65+"],
160
+ "risk_profile": ["low", "medium", "high"],
161
+ "policy_count": { "$range": [0, 5] },
162
+ "lifetime_premium": { "$range": [0, 50000] },
163
+ "preferred_contact": ["email", "phone", "app_notification"]
164
+ },
165
+ "funnels": [
166
+ {
167
+ "name": "Onboarding",
168
+ "sequence": ["account created", "page viewed", "quote requested"],
169
+ "isFirstFunnel": true,
170
+ "conversionRate": 85,
171
+ "timeToConvert": 0.5
172
+ },
173
+ {
174
+ "name": "Application Completion",
175
+ "sequence": ["application started", "application step completed", "document uploaded", "application submitted"],
176
+ "conversionRate": 60,
177
+ "timeToConvert": 48,
178
+ "weight": 4,
179
+ "order": "sequential"
180
+ },
181
+ {
182
+ "name": "Application Approval",
183
+ "sequence": ["application submitted", "application approved", "policy activated"],
184
+ "conversionRate": 70,
185
+ "timeToConvert": 72,
186
+ "weight": 3,
187
+ "order": "sequential"
188
+ },
189
+ {
190
+ "name": "Claims Process",
191
+ "sequence": ["claim filed", "claim status checked", "support ticket created"],
192
+ "conversionRate": 50,
193
+ "timeToConvert": 24,
194
+ "weight": 2
195
+ },
196
+ {
197
+ "name": "Policy Renewal",
198
+ "sequence": ["coverage reviewed", "payment made", "renewal completed"],
199
+ "conversionRate": 65,
200
+ "timeToConvert": 72,
201
+ "weight": 3
202
+ }
203
+ ]
204
+ }