@iann29/rastro 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (135) hide show
  1. package/README.md +203 -56
  2. package/agent/integration.md +17 -15
  3. package/agent/manifest.json +6 -4
  4. package/agent/manifest.schema.json +8 -5
  5. package/dist/client/federation.d.ts +34 -8
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +17 -3
  8. package/dist/client/federation.js.map +1 -1
  9. package/dist/client/index.d.ts +486 -31
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +209 -41
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +8 -0
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +82 -8
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/affiliates.d.ts.map +1 -1
  19. package/dist/component/affiliates.js +6 -2
  20. package/dist/component/affiliates.js.map +1 -1
  21. package/dist/component/cardinality.d.ts.map +1 -1
  22. package/dist/component/cardinality.js.map +1 -1
  23. package/dist/component/constants.d.ts +6 -0
  24. package/dist/component/constants.d.ts.map +1 -1
  25. package/dist/component/constants.js +12 -0
  26. package/dist/component/constants.js.map +1 -1
  27. package/dist/component/diagnostics.d.ts.map +1 -1
  28. package/dist/component/diagnostics.js.map +1 -1
  29. package/dist/component/eventStore.d.ts +3 -1
  30. package/dist/component/eventStore.d.ts.map +1 -1
  31. package/dist/component/eventStore.js +13 -10
  32. package/dist/component/eventStore.js.map +1 -1
  33. package/dist/component/funnels.d.ts.map +1 -1
  34. package/dist/component/funnels.js +5 -3
  35. package/dist/component/funnels.js.map +1 -1
  36. package/dist/component/geo.d.ts.map +1 -1
  37. package/dist/component/geo.js +3 -2
  38. package/dist/component/geo.js.map +1 -1
  39. package/dist/component/goals.d.ts.map +1 -1
  40. package/dist/component/goals.js +8 -5
  41. package/dist/component/goals.js.map +1 -1
  42. package/dist/component/guards.d.ts.map +1 -1
  43. package/dist/component/guards.js.map +1 -1
  44. package/dist/component/http.d.ts.map +1 -1
  45. package/dist/component/http.js +71 -37
  46. package/dist/component/http.js.map +1 -1
  47. package/dist/component/identity.d.ts +13 -0
  48. package/dist/component/identity.d.ts.map +1 -0
  49. package/dist/component/identity.js +58 -0
  50. package/dist/component/identity.js.map +1 -0
  51. package/dist/component/ingest.d.ts +3 -1
  52. package/dist/component/ingest.d.ts.map +1 -1
  53. package/dist/component/ingest.js +168 -29
  54. package/dist/component/ingest.js.map +1 -1
  55. package/dist/component/live.d.ts.map +1 -1
  56. package/dist/component/live.js +1 -3
  57. package/dist/component/live.js.map +1 -1
  58. package/dist/component/reports.d.ts +70 -4
  59. package/dist/component/reports.d.ts.map +1 -1
  60. package/dist/component/reports.js +232 -59
  61. package/dist/component/reports.js.map +1 -1
  62. package/dist/component/retention.d.ts +4 -4
  63. package/dist/component/retention.d.ts.map +1 -1
  64. package/dist/component/retention.js +54 -22
  65. package/dist/component/retention.js.map +1 -1
  66. package/dist/component/sanitize.d.ts.map +1 -1
  67. package/dist/component/sanitize.js +42 -11
  68. package/dist/component/sanitize.js.map +1 -1
  69. package/dist/component/schema.d.ts +83 -10
  70. package/dist/component/schema.js +34 -1
  71. package/dist/component/schema.js.map +1 -1
  72. package/dist/component/sites.d.ts.map +1 -1
  73. package/dist/component/sites.js +6 -6
  74. package/dist/component/sites.js.map +1 -1
  75. package/dist/component/useragent.d.ts +9 -0
  76. package/dist/component/useragent.d.ts.map +1 -0
  77. package/dist/component/useragent.js +152 -0
  78. package/dist/component/useragent.js.map +1 -0
  79. package/dist/component/validators.d.ts +29 -18
  80. package/dist/component/validators.d.ts.map +1 -1
  81. package/dist/component/validators.js +8 -2
  82. package/dist/component/validators.js.map +1 -1
  83. package/dist/component/visitors.d.ts +19 -0
  84. package/dist/component/visitors.d.ts.map +1 -0
  85. package/dist/component/visitors.js +86 -0
  86. package/dist/component/visitors.js.map +1 -0
  87. package/dist/component/vitals.d.ts +41 -0
  88. package/dist/component/vitals.d.ts.map +1 -0
  89. package/dist/component/vitals.js +115 -0
  90. package/dist/component/vitals.js.map +1 -0
  91. package/dist/react/index.d.ts.map +1 -1
  92. package/dist/react/index.js.map +1 -1
  93. package/dist/tracker/generated.d.ts +8 -4
  94. package/dist/tracker/generated.d.ts.map +1 -1
  95. package/dist/tracker/generated.js +8 -4
  96. package/dist/tracker/generated.js.map +1 -1
  97. package/dist/tracker/tracker.d.ts.map +1 -1
  98. package/dist/tracker/tracker.js +23 -11
  99. package/dist/tracker/tracker.js.map +1 -1
  100. package/dist/tracker/vitals.d.ts +10 -0
  101. package/dist/tracker/vitals.d.ts.map +1 -0
  102. package/dist/tracker/vitals.js +137 -0
  103. package/dist/tracker/vitals.js.map +1 -0
  104. package/dist/tracker.min.js +1 -1
  105. package/dist/vitals.min.js +1 -0
  106. package/docs/benchmarks/2026-08-20-realistic.md +71 -71
  107. package/docs/benchmarks/2026-08-21-formal-certification.md +50 -30
  108. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  109. package/docs/federation.md +1 -1
  110. package/package.json +27 -9
  111. package/scripts/benchmark-ingest.mjs +101 -48
  112. package/src/component/_generated/api.ts +8 -0
  113. package/src/component/_generated/component.ts +87 -5
  114. package/src/component/affiliates.ts +20 -5
  115. package/src/component/cardinality.ts +8 -7
  116. package/src/component/constants.ts +12 -0
  117. package/src/component/diagnostics.ts +3 -2
  118. package/src/component/eventStore.ts +53 -46
  119. package/src/component/funnels.ts +19 -16
  120. package/src/component/geo.ts +16 -14
  121. package/src/component/goals.ts +29 -21
  122. package/src/component/guards.ts +3 -1
  123. package/src/component/http.ts +126 -78
  124. package/src/component/identity.ts +74 -0
  125. package/src/component/ingest.ts +349 -130
  126. package/src/component/live.ts +5 -4
  127. package/src/component/reports.ts +572 -221
  128. package/src/component/retention.ts +221 -98
  129. package/src/component/sanitize.ts +77 -27
  130. package/src/component/schema.ts +46 -5
  131. package/src/component/sites.ts +22 -11
  132. package/src/component/useragent.ts +171 -0
  133. package/src/component/validators.ts +19 -7
  134. package/src/component/visitors.ts +116 -0
  135. package/src/component/vitals.ts +146 -0
@@ -1,11 +1,13 @@
1
1
  import type { FunctionArgs, FunctionReturnType, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
2
2
  import { type Infer } from "convex/values";
3
3
  import type { ComponentApi } from "../component/_generated/component.js";
4
- import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator } from "../component/validators.js";
4
+ import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator } from "../component/validators.js";
5
5
  import { type FederatedAnalyticsAuthorizerOptions, type FederatedAnalyticsConnectionStatus, type FederatedSiteSummary } from "./federation.js";
6
- export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, };
6
+ export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator, };
7
7
  export type { EventProperties, EventType, FunnelStep, IngestContext, TrackerEvent, } from "../component/validators.js";
8
- export { FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_READ_PERMISSION, } from "./federation.js";
8
+ export { VITAL_METRICS, VITAL_THRESHOLDS } from "../component/vitals.js";
9
+ export type { VitalMetric } from "../component/vitals.js";
10
+ export { FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_READ_PERMISSION, FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES, FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS, } from "./federation.js";
9
11
  export type { FederatedAnalyticsCapability, FederatedAnalyticsAuthorizerOptions, FederatedAnalyticsConnection, FederatedAnalyticsConnectionStatus, FederatedAnalyticsErrorCode, FederatedAnalyticsIdentity, FederatedAnalyticsManifest, FederatedSiteSummary, ResolveFederatedAnalyticsConnection, } from "./federation.js";
10
12
  export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
11
13
  export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
@@ -18,6 +20,8 @@ export type IngestInput = FunctionArgs<ComponentApi["ingest"]["ingestBatch"]>;
18
20
  export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatch"]>;
19
21
  export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
20
22
  export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
23
+ export type LinkVisitorInput = FunctionArgs<ComponentApi["visitors"]["link"]>;
24
+ export type LinkVisitorOutput = FunctionReturnType<ComponentApi["visitors"]["link"]>;
21
25
  export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
22
26
  export type Overview = Infer<typeof hostOverviewValidator>;
23
27
  export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
@@ -36,6 +40,8 @@ export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsRe
36
40
  export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
37
41
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
38
42
  export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
43
+ export type VitalsReportInput = FunctionArgs<ComponentApi["reports"]["vitalsReport"]>;
44
+ export type VitalsReport = Infer<typeof hostVitalsReportValidator>;
39
45
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
40
46
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
41
47
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -66,7 +72,7 @@ export type DataCoverage = {
66
72
  from: number;
67
73
  to: number;
68
74
  datasets: Array<{
69
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
75
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
70
76
  coverage: CoverageStatus;
71
77
  }>;
72
78
  };
@@ -99,7 +105,7 @@ export type RetentionStatus = {
99
105
  }>;
100
106
  backlog: number;
101
107
  };
102
- export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
108
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
103
109
  export type RunRetentionPolicyInput = {
104
110
  siteId: string;
105
111
  kind: RetentionKind;
@@ -146,6 +152,10 @@ export declare class Rastro {
146
152
  duplicates: number;
147
153
  rejected: number;
148
154
  }>;
155
+ linkVisitor(ctx: MutationCtx, args: LinkVisitorInput): Promise<{
156
+ aliasCount: number;
157
+ linked: boolean;
158
+ }>;
149
159
  overview(ctx: QueryCtx | MutationCtx | ActionCtx, args: OverviewInput): Promise<{
150
160
  currency: string;
151
161
  from: number;
@@ -153,6 +163,7 @@ export declare class Rastro {
153
163
  metadata: {
154
164
  breakdowns: {
155
165
  topBrowsers: "eventVolume";
166
+ topCampaigns: "eventVolume";
156
167
  topCountries: "eventVolume";
157
168
  topDevices: "eventVolume";
158
169
  topEvents: "eventVolume";
@@ -168,7 +179,7 @@ export declare class Rastro {
168
179
  state: "complete" | "partial" | "retained" | "unavailable";
169
180
  };
170
181
  features: {
171
- botDetection: "unsupported";
182
+ botDetection: "userAgent";
172
183
  errorInsights: "unsupported";
173
184
  outboundLinks: "eventVolume";
174
185
  sessionReplay: "unsupported";
@@ -205,6 +216,11 @@ export declare class Rastro {
205
216
  revenueCents: number;
206
217
  value: string;
207
218
  }>;
219
+ topCampaigns: Array<{
220
+ count: number;
221
+ revenueCents: number;
222
+ value: string;
223
+ }>;
208
224
  topCountries: Array<{
209
225
  count: number;
210
226
  revenueCents: number;
@@ -303,6 +319,7 @@ export declare class Rastro {
303
319
  utmMedium?: string;
304
320
  utmSource?: string;
305
321
  visitorId: string;
322
+ visitorKey?: string;
306
323
  }>;
307
324
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
308
325
  splitCursor?: string | null;
@@ -334,7 +351,7 @@ export declare class Rastro {
334
351
  siteId: string;
335
352
  target?: string;
336
353
  timestamp: number;
337
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
354
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
338
355
  visitorId: string;
339
356
  }>;
340
357
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -389,7 +406,7 @@ export declare class Rastro {
389
406
  siteId: string;
390
407
  target?: string;
391
408
  timestamp: number;
392
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
409
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
393
410
  visitorId: string;
394
411
  }[]>;
395
412
  goalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: GoalsReportInput): Promise<{
@@ -504,6 +521,57 @@ export declare class Rastro {
504
521
  };
505
522
  truncated: boolean;
506
523
  }>;
524
+ vitalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: VitalsReportInput): Promise<{
525
+ metadata: {
526
+ basis: "dailyRollup" | "boundedLegacy";
527
+ coverage: {
528
+ availableFrom: number | null;
529
+ availableThrough: number | null;
530
+ generation: number | null;
531
+ retainedBefore: number | null;
532
+ state: "complete" | "partial" | "retained" | "unavailable";
533
+ };
534
+ range: {
535
+ boundary: "inclusive";
536
+ from: number;
537
+ timezone: "UTC";
538
+ to: number;
539
+ };
540
+ };
541
+ metrics: Array<{
542
+ average: number;
543
+ count: number;
544
+ devices: Array<{
545
+ average: number;
546
+ count: number;
547
+ device: string;
548
+ good: number;
549
+ needsImprovement: number;
550
+ p75: number;
551
+ poor: number;
552
+ }>;
553
+ good: number;
554
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
555
+ needsImprovement: number;
556
+ p75: number;
557
+ pages: Array<{
558
+ average: number;
559
+ count: number;
560
+ good: number;
561
+ needsImprovement: number;
562
+ p75: number;
563
+ page: string;
564
+ poor: number;
565
+ }>;
566
+ poor: number;
567
+ timeSeries: Array<{
568
+ count: number;
569
+ p75: number;
570
+ timestamp: number;
571
+ }>;
572
+ }>;
573
+ truncated: boolean;
574
+ }>;
507
575
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
508
576
  listGoals(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
509
577
  _creationTime: number;
@@ -565,7 +633,7 @@ export declare class Rastro {
565
633
  retainedBefore: number | null;
566
634
  state: "complete" | "partial" | "retained" | "unavailable";
567
635
  };
568
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
636
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
569
637
  }>;
570
638
  from: number;
571
639
  siteId: string;
@@ -578,7 +646,7 @@ export declare class Rastro {
578
646
  jobs: Array<{
579
647
  before: number;
580
648
  deleted: number;
581
- kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
649
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
582
650
  scheduledAt: number | null;
583
651
  status: "pending" | "running" | "complete";
584
652
  updatedAt: number;
@@ -598,7 +666,7 @@ export declare class Rastro {
598
666
  hasMore: boolean;
599
667
  }>;
600
668
  }
601
- export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup" | "retention.policy" | "retention.status" | "coverage.read";
669
+ export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "visitor.link" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "report.vitals" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup" | "retention.policy" | "retention.status" | "coverage.read";
602
670
  export type AnalyticsAuthorizationRequest = {
603
671
  operation: AnalyticsOperation;
604
672
  siteIds: string[];
@@ -613,6 +681,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
613
681
  metadata: {
614
682
  breakdowns: {
615
683
  topBrowsers: "eventVolume";
684
+ topCampaigns: "eventVolume";
616
685
  topCountries: "eventVolume";
617
686
  topDevices: "eventVolume";
618
687
  topEvents: "eventVolume";
@@ -628,7 +697,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
628
697
  state: "complete" | "partial" | "retained" | "unavailable";
629
698
  };
630
699
  features: {
631
- botDetection: "unsupported";
700
+ botDetection: "userAgent";
632
701
  errorInsights: "unsupported";
633
702
  outboundLinks: "eventVolume";
634
703
  sessionReplay: "unsupported";
@@ -665,6 +734,11 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
665
734
  revenueCents: number;
666
735
  value: string;
667
736
  }[];
737
+ topCampaigns: {
738
+ count: number;
739
+ revenueCents: number;
740
+ value: string;
741
+ }[];
668
742
  topCountries: {
669
743
  count: number;
670
744
  revenueCents: number;
@@ -779,6 +853,19 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
779
853
  count: import("convex/values").VFloat64<number, "required">;
780
854
  revenueCents: import("convex/values").VFloat64<number, "required">;
781
855
  }, "required", "count" | "revenueCents" | "value">, "required">;
856
+ topCampaigns: import("convex/values").VArray<{
857
+ count: number;
858
+ revenueCents: number;
859
+ value: string;
860
+ }[], import("convex/values").VObject<{
861
+ count: number;
862
+ revenueCents: number;
863
+ value: string;
864
+ }, {
865
+ value: import("convex/values").VString<string, "required">;
866
+ count: import("convex/values").VFloat64<number, "required">;
867
+ revenueCents: import("convex/values").VFloat64<number, "required">;
868
+ }, "required", "count" | "revenueCents" | "value">, "required">;
782
869
  topPages: import("convex/values").VArray<{
783
870
  count: number;
784
871
  revenueCents: number;
@@ -860,6 +947,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
860
947
  metadata: import("convex/values").VObject<{
861
948
  breakdowns: {
862
949
  topBrowsers: "eventVolume";
950
+ topCampaigns: "eventVolume";
863
951
  topCountries: "eventVolume";
864
952
  topDevices: "eventVolume";
865
953
  topEvents: "eventVolume";
@@ -875,7 +963,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
875
963
  state: "complete" | "partial" | "retained" | "unavailable";
876
964
  };
877
965
  features: {
878
- botDetection: "unsupported";
966
+ botDetection: "userAgent";
879
967
  errorInsights: "unsupported";
880
968
  outboundLinks: "eventVolume";
881
969
  sessionReplay: "unsupported";
@@ -909,6 +997,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
909
997
  }, "required", "basis" | "exact" | "legacyIncomplete" | "precision" | "sketchVersion">;
910
998
  breakdowns: import("convex/values").VObject<{
911
999
  topBrowsers: "eventVolume";
1000
+ topCampaigns: "eventVolume";
912
1001
  topCountries: "eventVolume";
913
1002
  topDevices: "eventVolume";
914
1003
  topEvents: "eventVolume";
@@ -917,13 +1006,14 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
917
1006
  topSources: "eventVolume";
918
1007
  }, {
919
1008
  topSources: import("convex/values").VLiteral<"eventVolume", "required">;
1009
+ topCampaigns: import("convex/values").VLiteral<"eventVolume", "required">;
920
1010
  topPages: import("convex/values").VLiteral<"eventVolume", "required">;
921
1011
  topCountries: import("convex/values").VLiteral<"eventVolume", "required">;
922
1012
  topDevices: import("convex/values").VLiteral<"eventVolume", "required">;
923
1013
  topBrowsers: import("convex/values").VLiteral<"eventVolume", "required">;
924
1014
  topEvents: import("convex/values").VLiteral<"eventVolume", "required">;
925
1015
  topGoals: import("convex/values").VLiteral<"goalCompletionVolume", "required">;
926
- }, "required", "topBrowsers" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
1016
+ }, "required", "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
927
1017
  coverage: import("convex/values").VObject<{
928
1018
  availableFrom: number | null;
929
1019
  availableThrough: number | null;
@@ -949,7 +1039,7 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
949
1039
  timezone: import("convex/values").VLiteral<"UTC", "required">;
950
1040
  }, "required", "boundary" | "from" | "timezone" | "to">;
951
1041
  features: import("convex/values").VObject<{
952
- botDetection: "unsupported";
1042
+ botDetection: "userAgent";
953
1043
  errorInsights: "unsupported";
954
1044
  outboundLinks: "eventVolume";
955
1045
  sessionReplay: "unsupported";
@@ -957,10 +1047,10 @@ declare const hostOverviewValidator: import("convex/values").VObject<{
957
1047
  sessionReplay: import("convex/values").VLiteral<"unsupported", "required">;
958
1048
  errorInsights: import("convex/values").VLiteral<"unsupported", "required">;
959
1049
  outboundLinks: import("convex/values").VLiteral<"eventVolume", "required">;
960
- botDetection: import("convex/values").VLiteral<"unsupported", "required">;
1050
+ botDetection: import("convex/values").VLiteral<"userAgent", "required">;
961
1051
  }, "required", "botDetection" | "errorInsights" | "outboundLinks" | "sessionReplay">;
962
- }, "required", "breakdowns" | "breakdowns.topBrowsers" | "breakdowns.topCountries" | "breakdowns.topDevices" | "breakdowns.topEvents" | "breakdowns.topGoals" | "breakdowns.topPages" | "breakdowns.topSources" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "features" | "features.botDetection" | "features.errorInsights" | "features.outboundLinks" | "features.sessionReplay" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "visitors" | "visitors.basis" | "visitors.exact" | "visitors.legacyIncomplete" | "visitors.precision" | "visitors.sketchVersion">;
963
- }, "required", "currency" | "from" | "interval" | "metadata" | "metadata.breakdowns" | "metadata.breakdowns.topBrowsers" | "metadata.breakdowns.topCountries" | "metadata.breakdowns.topDevices" | "metadata.breakdowns.topEvents" | "metadata.breakdowns.topGoals" | "metadata.breakdowns.topPages" | "metadata.breakdowns.topSources" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.features" | "metadata.features.botDetection" | "metadata.features.errorInsights" | "metadata.features.outboundLinks" | "metadata.features.sessionReplay" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.visitors" | "metadata.visitors.basis" | "metadata.visitors.exact" | "metadata.visitors.legacyIncomplete" | "metadata.visitors.precision" | "metadata.visitors.sketchVersion" | "timeSeries" | "to" | "topBrowsers" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources" | "totals" | "totals.clicks" | "totals.conversions" | "totals.customEvents" | "totals.events" | "totals.outboundClicks" | "totals.pageviews" | "totals.revenueCents" | "totals.sessions" | "totals.visitors">;
1052
+ }, "required", "breakdowns" | "breakdowns.topBrowsers" | "breakdowns.topCampaigns" | "breakdowns.topCountries" | "breakdowns.topDevices" | "breakdowns.topEvents" | "breakdowns.topGoals" | "breakdowns.topPages" | "breakdowns.topSources" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "features" | "features.botDetection" | "features.errorInsights" | "features.outboundLinks" | "features.sessionReplay" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "visitors" | "visitors.basis" | "visitors.exact" | "visitors.legacyIncomplete" | "visitors.precision" | "visitors.sketchVersion">;
1053
+ }, "required", "currency" | "from" | "interval" | "metadata" | "metadata.breakdowns" | "metadata.breakdowns.topBrowsers" | "metadata.breakdowns.topCampaigns" | "metadata.breakdowns.topCountries" | "metadata.breakdowns.topDevices" | "metadata.breakdowns.topEvents" | "metadata.breakdowns.topGoals" | "metadata.breakdowns.topPages" | "metadata.breakdowns.topSources" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.features" | "metadata.features.botDetection" | "metadata.features.errorInsights" | "metadata.features.outboundLinks" | "metadata.features.sessionReplay" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.visitors" | "metadata.visitors.basis" | "metadata.visitors.exact" | "metadata.visitors.legacyIncomplete" | "metadata.visitors.precision" | "metadata.visitors.sketchVersion" | "timeSeries" | "to" | "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources" | "totals" | "totals.clicks" | "totals.conversions" | "totals.customEvents" | "totals.events" | "totals.outboundClicks" | "totals.pageviews" | "totals.revenueCents" | "totals.sessions" | "totals.visitors">;
964
1054
  declare const hostGoalsReportValidator: import("convex/values").VObject<{
965
1055
  goals: {
966
1056
  _creationTime: number;
@@ -1381,6 +1471,235 @@ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1381
1471
  }, "required", "basis" | "exact">;
1382
1472
  }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "uniqueVisitors" | "uniqueVisitors.basis" | "uniqueVisitors.exact">;
1383
1473
  }, "required", "affiliates" | "metadata" | "metadata.basis" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.uniqueVisitors" | "metadata.uniqueVisitors.basis" | "metadata.uniqueVisitors.exact" | "truncated">;
1474
+ declare const hostVitalsReportValidator: import("convex/values").VObject<{
1475
+ metadata: {
1476
+ basis: "boundedLegacy" | "dailyRollup";
1477
+ coverage: {
1478
+ availableFrom: number | null;
1479
+ availableThrough: number | null;
1480
+ generation: number | null;
1481
+ retainedBefore: number | null;
1482
+ state: "complete" | "partial" | "retained" | "unavailable";
1483
+ };
1484
+ range: {
1485
+ boundary: "inclusive";
1486
+ from: number;
1487
+ timezone: "UTC";
1488
+ to: number;
1489
+ };
1490
+ };
1491
+ metrics: {
1492
+ average: number;
1493
+ count: number;
1494
+ devices: {
1495
+ average: number;
1496
+ count: number;
1497
+ device: string;
1498
+ good: number;
1499
+ needsImprovement: number;
1500
+ p75: number;
1501
+ poor: number;
1502
+ }[];
1503
+ good: number;
1504
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1505
+ needsImprovement: number;
1506
+ p75: number;
1507
+ pages: {
1508
+ average: number;
1509
+ count: number;
1510
+ good: number;
1511
+ needsImprovement: number;
1512
+ p75: number;
1513
+ page: string;
1514
+ poor: number;
1515
+ }[];
1516
+ poor: number;
1517
+ timeSeries: {
1518
+ count: number;
1519
+ p75: number;
1520
+ timestamp: number;
1521
+ }[];
1522
+ }[];
1523
+ truncated: boolean;
1524
+ }, {
1525
+ metrics: import("convex/values").VArray<{
1526
+ average: number;
1527
+ count: number;
1528
+ devices: {
1529
+ average: number;
1530
+ count: number;
1531
+ device: string;
1532
+ good: number;
1533
+ needsImprovement: number;
1534
+ p75: number;
1535
+ poor: number;
1536
+ }[];
1537
+ good: number;
1538
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1539
+ needsImprovement: number;
1540
+ p75: number;
1541
+ pages: {
1542
+ average: number;
1543
+ count: number;
1544
+ good: number;
1545
+ needsImprovement: number;
1546
+ p75: number;
1547
+ page: string;
1548
+ poor: number;
1549
+ }[];
1550
+ poor: number;
1551
+ timeSeries: {
1552
+ count: number;
1553
+ p75: number;
1554
+ timestamp: number;
1555
+ }[];
1556
+ }[], import("convex/values").VObject<{
1557
+ average: number;
1558
+ count: number;
1559
+ devices: {
1560
+ average: number;
1561
+ count: number;
1562
+ device: string;
1563
+ good: number;
1564
+ needsImprovement: number;
1565
+ p75: number;
1566
+ poor: number;
1567
+ }[];
1568
+ good: number;
1569
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1570
+ needsImprovement: number;
1571
+ p75: number;
1572
+ pages: {
1573
+ average: number;
1574
+ count: number;
1575
+ good: number;
1576
+ needsImprovement: number;
1577
+ p75: number;
1578
+ page: string;
1579
+ poor: number;
1580
+ }[];
1581
+ poor: number;
1582
+ timeSeries: {
1583
+ count: number;
1584
+ p75: number;
1585
+ timestamp: number;
1586
+ }[];
1587
+ }, {
1588
+ count: import("convex/values").VFloat64<number, "required">;
1589
+ p75: import("convex/values").VFloat64<number, "required">;
1590
+ average: import("convex/values").VFloat64<number, "required">;
1591
+ good: import("convex/values").VFloat64<number, "required">;
1592
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1593
+ poor: import("convex/values").VFloat64<number, "required">;
1594
+ metric: import("convex/values").VUnion<"CLS" | "FCP" | "INP" | "LCP" | "TTFB", [import("convex/values").VLiteral<"LCP", "required">, import("convex/values").VLiteral<"CLS", "required">, import("convex/values").VLiteral<"INP", "required">, import("convex/values").VLiteral<"FCP", "required">, import("convex/values").VLiteral<"TTFB", "required">], "required", never>;
1595
+ devices: import("convex/values").VArray<{
1596
+ average: number;
1597
+ count: number;
1598
+ device: string;
1599
+ good: number;
1600
+ needsImprovement: number;
1601
+ p75: number;
1602
+ poor: number;
1603
+ }[], import("convex/values").VObject<{
1604
+ average: number;
1605
+ count: number;
1606
+ device: string;
1607
+ good: number;
1608
+ needsImprovement: number;
1609
+ p75: number;
1610
+ poor: number;
1611
+ }, {
1612
+ count: import("convex/values").VFloat64<number, "required">;
1613
+ p75: import("convex/values").VFloat64<number, "required">;
1614
+ average: import("convex/values").VFloat64<number, "required">;
1615
+ good: import("convex/values").VFloat64<number, "required">;
1616
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1617
+ poor: import("convex/values").VFloat64<number, "required">;
1618
+ device: import("convex/values").VString<string, "required">;
1619
+ }, "required", "average" | "count" | "device" | "good" | "needsImprovement" | "p75" | "poor">, "required">;
1620
+ pages: import("convex/values").VArray<{
1621
+ average: number;
1622
+ count: number;
1623
+ good: number;
1624
+ needsImprovement: number;
1625
+ p75: number;
1626
+ page: string;
1627
+ poor: number;
1628
+ }[], import("convex/values").VObject<{
1629
+ average: number;
1630
+ count: number;
1631
+ good: number;
1632
+ needsImprovement: number;
1633
+ p75: number;
1634
+ page: string;
1635
+ poor: number;
1636
+ }, {
1637
+ count: import("convex/values").VFloat64<number, "required">;
1638
+ p75: import("convex/values").VFloat64<number, "required">;
1639
+ average: import("convex/values").VFloat64<number, "required">;
1640
+ good: import("convex/values").VFloat64<number, "required">;
1641
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1642
+ poor: import("convex/values").VFloat64<number, "required">;
1643
+ page: import("convex/values").VString<string, "required">;
1644
+ }, "required", "average" | "count" | "good" | "needsImprovement" | "p75" | "page" | "poor">, "required">;
1645
+ timeSeries: import("convex/values").VArray<{
1646
+ count: number;
1647
+ p75: number;
1648
+ timestamp: number;
1649
+ }[], import("convex/values").VObject<{
1650
+ count: number;
1651
+ p75: number;
1652
+ timestamp: number;
1653
+ }, {
1654
+ timestamp: import("convex/values").VFloat64<number, "required">;
1655
+ count: import("convex/values").VFloat64<number, "required">;
1656
+ p75: import("convex/values").VFloat64<number, "required">;
1657
+ }, "required", "count" | "p75" | "timestamp">, "required">;
1658
+ }, "required", "average" | "count" | "devices" | "good" | "metric" | "needsImprovement" | "p75" | "pages" | "poor" | "timeSeries">, "required">;
1659
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1660
+ metadata: import("convex/values").VObject<{
1661
+ basis: "boundedLegacy" | "dailyRollup";
1662
+ coverage: {
1663
+ availableFrom: number | null;
1664
+ availableThrough: number | null;
1665
+ generation: number | null;
1666
+ retainedBefore: number | null;
1667
+ state: "complete" | "partial" | "retained" | "unavailable";
1668
+ };
1669
+ range: {
1670
+ boundary: "inclusive";
1671
+ from: number;
1672
+ timezone: "UTC";
1673
+ to: number;
1674
+ };
1675
+ }, {
1676
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1677
+ coverage: import("convex/values").VObject<{
1678
+ availableFrom: number | null;
1679
+ availableThrough: number | null;
1680
+ generation: number | null;
1681
+ retainedBefore: number | null;
1682
+ state: "complete" | "partial" | "retained" | "unavailable";
1683
+ }, {
1684
+ state: import("convex/values").VUnion<"complete" | "partial" | "retained" | "unavailable", [import("convex/values").VLiteral<"complete", "required">, import("convex/values").VLiteral<"partial", "required">, import("convex/values").VLiteral<"retained", "required">, import("convex/values").VLiteral<"unavailable", "required">], "required", never>;
1685
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1686
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1687
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1688
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1689
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1690
+ range: import("convex/values").VObject<{
1691
+ boundary: "inclusive";
1692
+ from: number;
1693
+ timezone: "UTC";
1694
+ to: number;
1695
+ }, {
1696
+ from: import("convex/values").VFloat64<number, "required">;
1697
+ to: import("convex/values").VFloat64<number, "required">;
1698
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1699
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1700
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1701
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1702
+ }, "required", "metadata" | "metadata.basis" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metrics" | "truncated">;
1384
1703
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1385
1704
  authorize: AnalyticsAuthorizer;
1386
1705
  }): {
@@ -1442,6 +1761,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1442
1761
  latitude?: number | undefined;
1443
1762
  longitude?: number | undefined;
1444
1763
  os?: string | undefined;
1764
+ visitorKey?: string | undefined;
1445
1765
  } | undefined;
1446
1766
  events: {
1447
1767
  affiliateSlug?: string | undefined;
@@ -1457,7 +1777,8 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1457
1777
  sessionId: string;
1458
1778
  target?: string | undefined;
1459
1779
  timestamp: number;
1460
- type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview";
1780
+ type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview" | "vital";
1781
+ value?: number | undefined;
1461
1782
  visitorId: string;
1462
1783
  }[];
1463
1784
  origin: string;
@@ -1483,6 +1804,14 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1483
1804
  duplicates: number;
1484
1805
  rejected: number;
1485
1806
  }>>;
1807
+ linkVisitor: import("convex/server").RegisteredMutation<"public", {
1808
+ previousVisitorId: string;
1809
+ siteId: string;
1810
+ visitorId: string;
1811
+ }, Promise<{
1812
+ aliasCount: number;
1813
+ linked: boolean;
1814
+ }>>;
1486
1815
  overview: import("convex/server").RegisteredQuery<"public", {
1487
1816
  from: number;
1488
1817
  interval?: "day" | "hour" | undefined;
@@ -1495,6 +1824,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1495
1824
  metadata: {
1496
1825
  breakdowns: {
1497
1826
  topBrowsers: "eventVolume";
1827
+ topCampaigns: "eventVolume";
1498
1828
  topCountries: "eventVolume";
1499
1829
  topDevices: "eventVolume";
1500
1830
  topEvents: "eventVolume";
@@ -1510,7 +1840,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1510
1840
  state: "complete" | "partial" | "retained" | "unavailable";
1511
1841
  };
1512
1842
  features: {
1513
- botDetection: "unsupported";
1843
+ botDetection: "userAgent";
1514
1844
  errorInsights: "unsupported";
1515
1845
  outboundLinks: "eventVolume";
1516
1846
  sessionReplay: "unsupported";
@@ -1547,6 +1877,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1547
1877
  revenueCents: number;
1548
1878
  value: string;
1549
1879
  }>;
1880
+ topCampaigns: Array<{
1881
+ count: number;
1882
+ revenueCents: number;
1883
+ value: string;
1884
+ }>;
1550
1885
  topCountries: Array<{
1551
1886
  count: number;
1552
1887
  revenueCents: number;
@@ -1661,6 +1996,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1661
1996
  utmMedium?: string;
1662
1997
  utmSource?: string;
1663
1998
  visitorId: string;
1999
+ visitorKey?: string;
1664
2000
  }>;
1665
2001
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
1666
2002
  splitCursor?: string | null;
@@ -1705,7 +2041,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1705
2041
  siteId: string;
1706
2042
  target?: string;
1707
2043
  timestamp: number;
1708
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2044
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
1709
2045
  visitorId: string;
1710
2046
  }>;
1711
2047
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -1778,7 +2114,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1778
2114
  siteId: string;
1779
2115
  target?: string;
1780
2116
  timestamp: number;
1781
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2117
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
1782
2118
  visitorId: string;
1783
2119
  }[]>>;
1784
2120
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -1905,6 +2241,61 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1905
2241
  };
1906
2242
  truncated: boolean;
1907
2243
  }>>;
2244
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2245
+ from: number;
2246
+ siteId: string;
2247
+ to: number;
2248
+ }, Promise<{
2249
+ metadata: {
2250
+ basis: "dailyRollup" | "boundedLegacy";
2251
+ coverage: {
2252
+ availableFrom: number | null;
2253
+ availableThrough: number | null;
2254
+ generation: number | null;
2255
+ retainedBefore: number | null;
2256
+ state: "complete" | "partial" | "retained" | "unavailable";
2257
+ };
2258
+ range: {
2259
+ boundary: "inclusive";
2260
+ from: number;
2261
+ timezone: "UTC";
2262
+ to: number;
2263
+ };
2264
+ };
2265
+ metrics: Array<{
2266
+ average: number;
2267
+ count: number;
2268
+ devices: Array<{
2269
+ average: number;
2270
+ count: number;
2271
+ device: string;
2272
+ good: number;
2273
+ needsImprovement: number;
2274
+ p75: number;
2275
+ poor: number;
2276
+ }>;
2277
+ good: number;
2278
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2279
+ needsImprovement: number;
2280
+ p75: number;
2281
+ pages: Array<{
2282
+ average: number;
2283
+ count: number;
2284
+ good: number;
2285
+ needsImprovement: number;
2286
+ p75: number;
2287
+ page: string;
2288
+ poor: number;
2289
+ }>;
2290
+ poor: number;
2291
+ timeSeries: Array<{
2292
+ count: number;
2293
+ p75: number;
2294
+ timestamp: number;
2295
+ }>;
2296
+ }>;
2297
+ truncated: boolean;
2298
+ }>>;
1908
2299
  dataCoverage: import("convex/server").RegisteredQuery<"public", {
1909
2300
  from: number;
1910
2301
  siteId: string;
@@ -1918,7 +2309,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1918
2309
  retainedBefore: number | null;
1919
2310
  state: "complete" | "partial" | "retained" | "unavailable";
1920
2311
  };
1921
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2312
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
1922
2313
  }>;
1923
2314
  from: number;
1924
2315
  siteId: string;
@@ -1931,7 +2322,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1931
2322
  jobs: Array<{
1932
2323
  before: number;
1933
2324
  deleted: number;
1934
- kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
2325
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
1935
2326
  scheduledAt: number | null;
1936
2327
  status: "pending" | "running" | "complete";
1937
2328
  updatedAt: number;
@@ -1958,7 +2349,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1958
2349
  }, Promise<null>>;
1959
2350
  runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
1960
2351
  batchSize?: number | undefined;
1961
- kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2352
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
1962
2353
  siteId: string;
1963
2354
  }, Promise<{
1964
2355
  before: number;
@@ -2059,7 +2450,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
2059
2450
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
2060
2451
  batchSize?: number | undefined;
2061
2452
  before: number;
2062
- kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2453
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
2063
2454
  siteId: string;
2064
2455
  }, Promise<{
2065
2456
  before: number;
@@ -2087,8 +2478,9 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2087
2478
  funnelsReport: "funnelsReport";
2088
2479
  affiliatesReport: "affiliatesReport";
2089
2480
  dataCoverage: "dataCoverage";
2481
+ vitalsReport: "vitalsReport";
2090
2482
  };
2091
- capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney")[];
2483
+ capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney" | "vitals")[];
2092
2484
  limits: {
2093
2485
  maxSitesPerRequest: 10;
2094
2486
  maxSitesPerConnection: 10;
@@ -2111,6 +2503,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2111
2503
  metadata: {
2112
2504
  breakdowns: {
2113
2505
  topBrowsers: "eventVolume";
2506
+ topCampaigns: "eventVolume";
2114
2507
  topCountries: "eventVolume";
2115
2508
  topDevices: "eventVolume";
2116
2509
  topEvents: "eventVolume";
@@ -2126,7 +2519,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2126
2519
  state: "complete" | "partial" | "retained" | "unavailable";
2127
2520
  };
2128
2521
  features: {
2129
- botDetection: "unsupported";
2522
+ botDetection: "userAgent";
2130
2523
  errorInsights: "unsupported";
2131
2524
  outboundLinks: "eventVolume";
2132
2525
  sessionReplay: "unsupported";
@@ -2163,6 +2556,11 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2163
2556
  revenueCents: number;
2164
2557
  value: string;
2165
2558
  }>;
2559
+ topCampaigns: Array<{
2560
+ count: number;
2561
+ revenueCents: number;
2562
+ value: string;
2563
+ }>;
2166
2564
  topCountries: Array<{
2167
2565
  count: number;
2168
2566
  revenueCents: number;
@@ -2277,6 +2675,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2277
2675
  utmMedium?: string;
2278
2676
  utmSource?: string;
2279
2677
  visitorId: string;
2678
+ visitorKey?: string;
2280
2679
  }>;
2281
2680
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2282
2681
  splitCursor?: string | null;
@@ -2321,7 +2720,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2321
2720
  siteId: string;
2322
2721
  target?: string;
2323
2722
  timestamp: number;
2324
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2723
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
2325
2724
  visitorId: string;
2326
2725
  }>;
2327
2726
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -2394,7 +2793,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2394
2793
  siteId: string;
2395
2794
  target?: string;
2396
2795
  timestamp: number;
2397
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2796
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
2398
2797
  visitorId: string;
2399
2798
  }[]>>;
2400
2799
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -2521,6 +2920,61 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2521
2920
  };
2522
2921
  truncated: boolean;
2523
2922
  }>>;
2923
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2924
+ from: number;
2925
+ siteId: string;
2926
+ to: number;
2927
+ }, Promise<{
2928
+ metadata: {
2929
+ basis: "dailyRollup" | "boundedLegacy";
2930
+ coverage: {
2931
+ availableFrom: number | null;
2932
+ availableThrough: number | null;
2933
+ generation: number | null;
2934
+ retainedBefore: number | null;
2935
+ state: "complete" | "partial" | "retained" | "unavailable";
2936
+ };
2937
+ range: {
2938
+ boundary: "inclusive";
2939
+ from: number;
2940
+ timezone: "UTC";
2941
+ to: number;
2942
+ };
2943
+ };
2944
+ metrics: Array<{
2945
+ average: number;
2946
+ count: number;
2947
+ devices: Array<{
2948
+ average: number;
2949
+ count: number;
2950
+ device: string;
2951
+ good: number;
2952
+ needsImprovement: number;
2953
+ p75: number;
2954
+ poor: number;
2955
+ }>;
2956
+ good: number;
2957
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2958
+ needsImprovement: number;
2959
+ p75: number;
2960
+ pages: Array<{
2961
+ average: number;
2962
+ count: number;
2963
+ good: number;
2964
+ needsImprovement: number;
2965
+ p75: number;
2966
+ page: string;
2967
+ poor: number;
2968
+ }>;
2969
+ poor: number;
2970
+ timeSeries: Array<{
2971
+ count: number;
2972
+ p75: number;
2973
+ timestamp: number;
2974
+ }>;
2975
+ }>;
2976
+ truncated: boolean;
2977
+ }>>;
2524
2978
  dataCoverage: import("convex/server").RegisteredQuery<"public", {
2525
2979
  from: number;
2526
2980
  siteId: string;
@@ -2534,7 +2988,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2534
2988
  retainedBefore: number | null;
2535
2989
  state: "complete" | "partial" | "retained" | "unavailable";
2536
2990
  };
2537
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2991
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
2538
2992
  }>;
2539
2993
  from: number;
2540
2994
  siteId: string;
@@ -2544,6 +2998,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2544
2998
  export declare function componentHttpPaths(prefix?: string): {
2545
2999
  readonly events: `${string}/events`;
2546
3000
  readonly tracker: `${string}/tracker.js`;
3001
+ readonly vitals: `${string}/vitals.js`;
2547
3002
  readonly health: `${string}/health`;
2548
3003
  };
2549
3004
  type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;