@iann29/rastro 0.1.0-alpha.1 → 0.1.0-alpha.10

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 (163) hide show
  1. package/README.md +521 -66
  2. package/agent/integration.md +661 -0
  3. package/agent/manifest.json +187 -0
  4. package/agent/manifest.schema.json +411 -0
  5. package/dist/client/federation.d.ts +236 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +196 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +2467 -18
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +461 -32
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +16 -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 +302 -4
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/_generated/server.d.ts +4 -0
  19. package/dist/component/_generated/server.d.ts.map +1 -1
  20. package/dist/component/_generated/server.js.map +1 -1
  21. package/dist/component/affiliates.d.ts.map +1 -1
  22. package/dist/component/affiliates.js +6 -2
  23. package/dist/component/affiliates.js.map +1 -1
  24. package/dist/component/cardinality.d.ts +12 -0
  25. package/dist/component/cardinality.d.ts.map +1 -0
  26. package/dist/component/cardinality.js +94 -0
  27. package/dist/component/cardinality.js.map +1 -0
  28. package/dist/component/constants.d.ts +25 -1
  29. package/dist/component/constants.d.ts.map +1 -1
  30. package/dist/component/constants.js +38 -1
  31. package/dist/component/constants.js.map +1 -1
  32. package/dist/component/convex.config.d.ts +6 -1
  33. package/dist/component/convex.config.js +9 -1
  34. package/dist/component/convex.config.js.map +1 -1
  35. package/dist/component/coverage.d.ts +19 -0
  36. package/dist/component/coverage.d.ts.map +1 -0
  37. package/dist/component/coverage.js +30 -0
  38. package/dist/component/coverage.js.map +1 -0
  39. package/dist/component/diagnostics.d.ts +9 -0
  40. package/dist/component/diagnostics.d.ts.map +1 -0
  41. package/dist/component/diagnostics.js +47 -0
  42. package/dist/component/diagnostics.js.map +1 -0
  43. package/dist/component/errors.d.ts +1 -1
  44. package/dist/component/errors.d.ts.map +1 -1
  45. package/dist/component/errors.js.map +1 -1
  46. package/dist/component/eventStore.d.ts +21 -9
  47. package/dist/component/eventStore.d.ts.map +1 -1
  48. package/dist/component/eventStore.js +142 -152
  49. package/dist/component/eventStore.js.map +1 -1
  50. package/dist/component/funnels.d.ts.map +1 -1
  51. package/dist/component/funnels.js +5 -3
  52. package/dist/component/funnels.js.map +1 -1
  53. package/dist/component/geo.d.ts +71 -0
  54. package/dist/component/geo.d.ts.map +1 -0
  55. package/dist/component/geo.js +611 -0
  56. package/dist/component/geo.js.map +1 -0
  57. package/dist/component/goals.d.ts.map +1 -1
  58. package/dist/component/goals.js +8 -5
  59. package/dist/component/goals.js.map +1 -1
  60. package/dist/component/guards.d.ts.map +1 -1
  61. package/dist/component/guards.js.map +1 -1
  62. package/dist/component/http.d.ts.map +1 -1
  63. package/dist/component/http.js +248 -49
  64. package/dist/component/http.js.map +1 -1
  65. package/dist/component/identity.d.ts +13 -0
  66. package/dist/component/identity.d.ts.map +1 -0
  67. package/dist/component/identity.js +58 -0
  68. package/dist/component/identity.js.map +1 -0
  69. package/dist/component/ingest.d.ts +3 -1
  70. package/dist/component/ingest.d.ts.map +1 -1
  71. package/dist/component/ingest.js +604 -55
  72. package/dist/component/ingest.js.map +1 -1
  73. package/dist/component/live.d.ts.map +1 -1
  74. package/dist/component/live.js +7 -6
  75. package/dist/component/live.js.map +1 -1
  76. package/dist/component/reports.d.ts +259 -10
  77. package/dist/component/reports.d.ts.map +1 -1
  78. package/dist/component/reports.js +1110 -124
  79. package/dist/component/reports.js.map +1 -1
  80. package/dist/component/retention.d.ts +75 -1
  81. package/dist/component/retention.d.ts.map +1 -1
  82. package/dist/component/retention.js +537 -32
  83. package/dist/component/retention.js.map +1 -1
  84. package/dist/component/sanitize.d.ts +24 -1
  85. package/dist/component/sanitize.d.ts.map +1 -1
  86. package/dist/component/sanitize.js +96 -16
  87. package/dist/component/sanitize.js.map +1 -1
  88. package/dist/component/schema.d.ts +378 -62
  89. package/dist/component/schema.js +178 -20
  90. package/dist/component/schema.js.map +1 -1
  91. package/dist/component/sites.d.ts.map +1 -1
  92. package/dist/component/sites.js +11 -7
  93. package/dist/component/sites.js.map +1 -1
  94. package/dist/component/useragent.d.ts +9 -0
  95. package/dist/component/useragent.d.ts.map +1 -0
  96. package/dist/component/useragent.js +152 -0
  97. package/dist/component/useragent.js.map +1 -0
  98. package/dist/component/validators.d.ts +101 -65
  99. package/dist/component/validators.d.ts.map +1 -1
  100. package/dist/component/validators.js +19 -13
  101. package/dist/component/validators.js.map +1 -1
  102. package/dist/component/visitors.d.ts +19 -0
  103. package/dist/component/visitors.d.ts.map +1 -0
  104. package/dist/component/visitors.js +86 -0
  105. package/dist/component/visitors.js.map +1 -0
  106. package/dist/component/vitals.d.ts +41 -0
  107. package/dist/component/vitals.d.ts.map +1 -0
  108. package/dist/component/vitals.js +115 -0
  109. package/dist/component/vitals.js.map +1 -0
  110. package/dist/react/index.d.ts.map +1 -1
  111. package/dist/react/index.js.map +1 -1
  112. package/dist/tracker/generated.d.ts +8 -4
  113. package/dist/tracker/generated.d.ts.map +1 -1
  114. package/dist/tracker/generated.js +8 -4
  115. package/dist/tracker/generated.js.map +1 -1
  116. package/dist/tracker/tracker.d.ts +1 -1
  117. package/dist/tracker/tracker.d.ts.map +1 -1
  118. package/dist/tracker/tracker.js +57 -20
  119. package/dist/tracker/tracker.js.map +1 -1
  120. package/dist/tracker/vitals.d.ts +10 -0
  121. package/dist/tracker/vitals.d.ts.map +1 -0
  122. package/dist/tracker/vitals.js +140 -0
  123. package/dist/tracker/vitals.js.map +1 -0
  124. package/dist/tracker.min.js +1 -1
  125. package/dist/vitals.min.js +1 -0
  126. package/docs/benchmarks/2026-08-20-realistic.md +76 -76
  127. package/docs/benchmarks/2026-08-21-formal-certification.md +353 -0
  128. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  129. package/docs/federation-setup.md +397 -0
  130. package/docs/federation.md +262 -0
  131. package/docs/upgrading.md +259 -0
  132. package/llms.txt +71 -0
  133. package/package.json +55 -11
  134. package/scripts/benchmark-ingest.mjs +175 -73
  135. package/scripts/generate-federation-keys.mjs +20 -0
  136. package/src/component/_generated/api.ts +16 -0
  137. package/src/component/_generated/component.ts +366 -4
  138. package/src/component/_generated/server.ts +4 -0
  139. package/src/component/affiliates.ts +20 -5
  140. package/src/component/cardinality.ts +117 -0
  141. package/src/component/constants.ts +38 -1
  142. package/src/component/convex.config.ts +11 -1
  143. package/src/component/coverage.ts +36 -0
  144. package/src/component/diagnostics.ts +65 -0
  145. package/src/component/errors.ts +2 -1
  146. package/src/component/eventStore.ts +217 -193
  147. package/src/component/funnels.ts +19 -16
  148. package/src/component/geo.ts +781 -0
  149. package/src/component/goals.ts +29 -21
  150. package/src/component/guards.ts +3 -1
  151. package/src/component/http.ts +357 -57
  152. package/src/component/identity.ts +74 -0
  153. package/src/component/ingest.ts +1040 -135
  154. package/src/component/live.ts +13 -7
  155. package/src/component/reports.ts +1675 -183
  156. package/src/component/retention.ts +770 -96
  157. package/src/component/sanitize.ts +144 -29
  158. package/src/component/schema.ts +200 -21
  159. package/src/component/sites.ts +27 -12
  160. package/src/component/useragent.ts +171 -0
  161. package/src/component/validators.ts +29 -13
  162. package/src/component/visitors.ts +116 -0
  163. package/src/component/vitals.ts +146 -0
@@ -1,8 +1,15 @@
1
1
  import type { FunctionArgs, FunctionReturnType, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
2
+ import { type Infer } from "convex/values";
2
3
  import type { ComponentApi } from "../component/_generated/component.js";
3
- import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator } from "../component/validators.js";
4
- export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, };
4
+ import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator } from "../component/validators.js";
5
+ import { type FederatedAnalyticsAuthorizerOptions, type FederatedAnalyticsConnectionStatus, type FederatedSiteSummary } from "./federation.js";
6
+ export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator, };
5
7
  export type { EventProperties, EventType, FunnelStep, IngestContext, TrackerEvent, } from "../component/validators.js";
8
+ export { VITAL_METRICS, VITAL_THRESHOLDS } from "../component/vitals.js";
9
+ export { normalizeRoute } from "../component/sanitize.js";
10
+ export type { VitalMetric } from "../component/vitals.js";
11
+ 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";
12
+ export type { FederatedAnalyticsCapability, FederatedAnalyticsAuthorizerOptions, FederatedAnalyticsConnection, FederatedAnalyticsConnectionStatus, FederatedAnalyticsErrorCode, FederatedAnalyticsIdentity, FederatedAnalyticsManifest, FederatedSiteSummary, ResolveFederatedAnalyticsConnection, } from "./federation.js";
6
13
  export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
7
14
  export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
8
15
  export type UpdateSiteInput = FunctionArgs<ComponentApi["sites"]["update"]>;
@@ -14,8 +21,10 @@ export type IngestInput = FunctionArgs<ComponentApi["ingest"]["ingestBatch"]>;
14
21
  export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatch"]>;
15
22
  export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
16
23
  export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
24
+ export type LinkVisitorInput = FunctionArgs<ComponentApi["visitors"]["link"]>;
25
+ export type LinkVisitorOutput = FunctionReturnType<ComponentApi["visitors"]["link"]>;
17
26
  export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
18
- export type Overview = FunctionReturnType<ComponentApi["reports"]["overview"]>;
27
+ export type Overview = Infer<typeof hostOverviewValidator>;
19
28
  export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
20
29
  export type LiveVisitor = FunctionReturnType<ComponentApi["reports"]["liveVisitors"]>[number];
21
30
  export type ListSessionsInput = FunctionArgs<ComponentApi["reports"]["listSessions"]>;
@@ -27,11 +36,15 @@ export type ConversionsPage = FunctionReturnType<ComponentApi["reports"]["listCo
27
36
  export type VisitorJourneyInput = FunctionArgs<ComponentApi["reports"]["visitorJourney"]>;
28
37
  export type VisitorJourney = FunctionReturnType<ComponentApi["reports"]["visitorJourney"]>;
29
38
  export type GoalsReportInput = FunctionArgs<ComponentApi["reports"]["goalsReport"]>;
30
- export type GoalsReport = FunctionReturnType<ComponentApi["reports"]["goalsReport"]>;
39
+ export type GoalsReport = Infer<typeof hostGoalsReportValidator>;
31
40
  export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsReport"]>;
32
- export type FunnelsReport = FunctionReturnType<ComponentApi["reports"]["funnelsReport"]>;
41
+ export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
33
42
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
34
- export type AffiliatesReport = FunctionReturnType<ComponentApi["reports"]["affiliatesReport"]>;
43
+ export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
44
+ export type VitalsReportInput = FunctionArgs<ComponentApi["reports"]["vitalsReport"]>;
45
+ export type VitalsReport = Infer<typeof hostVitalsReportValidator>;
46
+ export type SiteMapInput = FunctionArgs<ComponentApi["reports"]["siteMap"]>;
47
+ export type SiteMap = Infer<typeof hostSiteMapValidator>;
35
48
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
36
49
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
37
50
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -41,8 +54,66 @@ export type Funnel = FunctionReturnType<ComponentApi["funnels"]["list"]>[number]
41
54
  export type UpsertAffiliateInput = FunctionArgs<ComponentApi["affiliates"]["upsert"]>;
42
55
  export type UpsertAffiliateOutput = FunctionReturnType<ComponentApi["affiliates"]["upsert"]>;
43
56
  export type Affiliate = FunctionReturnType<ComponentApi["affiliates"]["list"]>[number];
44
- export type CleanupInput = FunctionArgs<ComponentApi["retention"]["cleanup"]>;
45
- export type CleanupOutput = FunctionReturnType<ComponentApi["retention"]["cleanup"]>;
57
+ export type CleanupInput = {
58
+ siteId: string;
59
+ kind: RetentionKind;
60
+ before: number;
61
+ batchSize?: number;
62
+ };
63
+ export type CleanupOutput = {
64
+ deleted: number;
65
+ hasMore: boolean;
66
+ before: number;
67
+ };
68
+ export type DataCoverageInput = {
69
+ siteId: string;
70
+ from: number;
71
+ to: number;
72
+ };
73
+ export type DataCoverage = {
74
+ siteId: string;
75
+ from: number;
76
+ to: number;
77
+ datasets: Array<{
78
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
79
+ coverage: CoverageStatus;
80
+ }>;
81
+ };
82
+ export type CoverageStatus = {
83
+ state: "complete" | "partial" | "retained" | "unavailable";
84
+ generation: number | null;
85
+ availableFrom: number | null;
86
+ availableThrough: number | null;
87
+ retainedBefore: number | null;
88
+ };
89
+ export type RetentionPolicyInput = {
90
+ siteId: string;
91
+ eventsDays: number;
92
+ sessionsDays: number;
93
+ conversionsDays: number;
94
+ aggregatesDays: number;
95
+ reportsDays: number;
96
+ };
97
+ export type RetentionStatus = {
98
+ policy: (Omit<RetentionPolicyInput, "siteId"> & {
99
+ updatedAt: number;
100
+ }) | null;
101
+ jobs: Array<{
102
+ kind: string;
103
+ before: number;
104
+ status: "pending" | "running" | "complete";
105
+ deleted: number;
106
+ scheduledAt: number | null;
107
+ updatedAt: number;
108
+ }>;
109
+ backlog: number;
110
+ };
111
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
112
+ export type RunRetentionPolicyInput = {
113
+ siteId: string;
114
+ kind: RetentionKind;
115
+ batchSize?: number;
116
+ };
46
117
  export declare class Rastro {
47
118
  private readonly component;
48
119
  constructor(component: ComponentApi);
@@ -84,10 +155,52 @@ export declare class Rastro {
84
155
  duplicates: number;
85
156
  rejected: number;
86
157
  }>;
158
+ linkVisitor(ctx: MutationCtx, args: LinkVisitorInput): Promise<{
159
+ aliasCount: number;
160
+ linked: boolean;
161
+ }>;
87
162
  overview(ctx: QueryCtx | MutationCtx | ActionCtx, args: OverviewInput): Promise<{
88
163
  currency: string;
89
164
  from: number;
90
165
  interval: "hour" | "day";
166
+ metadata: {
167
+ breakdowns: {
168
+ topBrowsers: "eventVolume";
169
+ topCampaigns: "eventVolume";
170
+ topCountries: "eventVolume";
171
+ topDevices: "eventVolume";
172
+ topEvents: "eventVolume";
173
+ topGoals: "goalCompletionVolume";
174
+ topPages: "eventVolume";
175
+ topSources: "eventVolume";
176
+ };
177
+ coverage: {
178
+ availableFrom: number | null;
179
+ availableThrough: number | null;
180
+ generation: number | null;
181
+ retainedBefore: number | null;
182
+ state: "complete" | "partial" | "retained" | "unavailable";
183
+ };
184
+ features: {
185
+ botDetection: "userAgent";
186
+ errorInsights: "unsupported";
187
+ outboundLinks: "eventVolume";
188
+ sessionReplay: "unsupported";
189
+ };
190
+ range: {
191
+ boundary: "inclusive";
192
+ from: number;
193
+ timezone: "UTC";
194
+ to: number;
195
+ };
196
+ visitors: {
197
+ basis: "estimatedUnique" | "bucketOccurrences";
198
+ exact: boolean;
199
+ legacyIncomplete: boolean;
200
+ precision: number | null;
201
+ sketchVersion: number | null;
202
+ };
203
+ };
91
204
  timeSeries: Array<{
92
205
  clicks: number;
93
206
  conversions: number;
@@ -106,6 +219,11 @@ export declare class Rastro {
106
219
  revenueCents: number;
107
220
  value: string;
108
221
  }>;
222
+ topCampaigns: Array<{
223
+ count: number;
224
+ revenueCents: number;
225
+ value: string;
226
+ }>;
109
227
  topCountries: Array<{
110
228
  count: number;
111
229
  revenueCents: number;
@@ -160,9 +278,11 @@ export declare class Rastro {
160
278
  lastSeenAt: number;
161
279
  latitude?: number;
162
280
  longitude?: number;
281
+ movedAt?: number;
163
282
  os: string;
164
283
  pageviewCount: number;
165
284
  path: string;
285
+ previousPath?: string;
166
286
  sessionId: string;
167
287
  siteId: string;
168
288
  source: string;
@@ -204,6 +324,7 @@ export declare class Rastro {
204
324
  utmMedium?: string;
205
325
  utmSource?: string;
206
326
  visitorId: string;
327
+ visitorKey?: string;
207
328
  }>;
208
329
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
209
330
  splitCursor?: string | null;
@@ -235,7 +356,7 @@ export declare class Rastro {
235
356
  siteId: string;
236
357
  target?: string;
237
358
  timestamp: number;
238
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
359
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
239
360
  visitorId: string;
240
361
  }>;
241
362
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -290,7 +411,7 @@ export declare class Rastro {
290
411
  siteId: string;
291
412
  target?: string;
292
413
  timestamp: number;
293
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
414
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
294
415
  visitorId: string;
295
416
  }[]>;
296
417
  goalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: GoalsReportInput): Promise<{
@@ -308,6 +429,22 @@ export declare class Rastro {
308
429
  updatedAt: number;
309
430
  valueCents: number;
310
431
  }>;
432
+ metadata: {
433
+ basis: "dailyRollup" | "boundedLegacy";
434
+ coverage: {
435
+ availableFrom: number | null;
436
+ availableThrough: number | null;
437
+ generation: number | null;
438
+ retainedBefore: number | null;
439
+ state: "complete" | "partial" | "retained" | "unavailable";
440
+ };
441
+ range: {
442
+ boundary: "inclusive";
443
+ from: number;
444
+ timezone: "UTC";
445
+ to: number;
446
+ };
447
+ };
311
448
  truncated: boolean;
312
449
  }>;
313
450
  funnelsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: FunnelsReportInput): Promise<{
@@ -317,6 +454,22 @@ export declare class Rastro {
317
454
  conversionWindowMs: number;
318
455
  createdAt: number;
319
456
  key: string;
457
+ metadata: {
458
+ basis: "dailyRollup" | "boundedLegacy";
459
+ coverage: {
460
+ availableFrom: number | null;
461
+ availableThrough: number | null;
462
+ generation: number | null;
463
+ retainedBefore: number | null;
464
+ state: "complete" | "partial" | "retained" | "unavailable";
465
+ };
466
+ range: {
467
+ boundary: "inclusive";
468
+ from: number;
469
+ timezone: "UTC";
470
+ to: number;
471
+ };
472
+ };
320
473
  name: string;
321
474
  siteId: string;
322
475
  steps: Array<{
@@ -351,8 +504,137 @@ export declare class Rastro {
351
504
  updatedAt: number;
352
505
  visits: number;
353
506
  }>;
507
+ metadata: {
508
+ basis: "dailyRollup" | "boundedLegacy";
509
+ coverage: {
510
+ availableFrom: number | null;
511
+ availableThrough: number | null;
512
+ generation: number | null;
513
+ retainedBefore: number | null;
514
+ state: "complete" | "partial" | "retained" | "unavailable";
515
+ };
516
+ range: {
517
+ boundary: "inclusive";
518
+ from: number;
519
+ timezone: "UTC";
520
+ to: number;
521
+ };
522
+ uniqueVisitors: {
523
+ basis: "estimatedUnique" | "exactLegacy";
524
+ exact: boolean;
525
+ };
526
+ };
527
+ truncated: boolean;
528
+ }>;
529
+ vitalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: VitalsReportInput): Promise<{
530
+ metadata: {
531
+ basis: "dailyRollup" | "boundedLegacy";
532
+ coverage: {
533
+ availableFrom: number | null;
534
+ availableThrough: number | null;
535
+ generation: number | null;
536
+ retainedBefore: number | null;
537
+ state: "complete" | "partial" | "retained" | "unavailable";
538
+ };
539
+ range: {
540
+ boundary: "inclusive";
541
+ from: number;
542
+ timezone: "UTC";
543
+ to: number;
544
+ };
545
+ };
546
+ metrics: Array<{
547
+ average: number;
548
+ count: number;
549
+ devices: Array<{
550
+ average: number;
551
+ count: number;
552
+ device: string;
553
+ good: number;
554
+ needsImprovement: number;
555
+ p75: number;
556
+ poor: number;
557
+ }>;
558
+ good: number;
559
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
560
+ needsImprovement: number;
561
+ p75: number;
562
+ pages: Array<{
563
+ average: number;
564
+ count: number;
565
+ good: number;
566
+ needsImprovement: number;
567
+ p75: number;
568
+ page: string;
569
+ poor: number;
570
+ }>;
571
+ poor: number;
572
+ timeSeries: Array<{
573
+ count: number;
574
+ p75: number;
575
+ timestamp: number;
576
+ }>;
577
+ }>;
354
578
  truncated: boolean;
355
579
  }>;
580
+ siteMap(ctx: QueryCtx | MutationCtx | ActionCtx, args: SiteMapInput): Promise<{
581
+ from: number;
582
+ metadata: {
583
+ basis: "dailyRollup" | "boundedLegacy";
584
+ coverage: {
585
+ availableFrom: number | null;
586
+ availableThrough: number | null;
587
+ generation: number | null;
588
+ retainedBefore: number | null;
589
+ state: "complete" | "partial" | "retained" | "unavailable";
590
+ };
591
+ limits: {
592
+ routesPerDay: number;
593
+ rows: number;
594
+ transitionSlots: number;
595
+ };
596
+ range: {
597
+ boundary: "inclusive";
598
+ from: number;
599
+ timezone: "UTC";
600
+ to: number;
601
+ };
602
+ visitors: {
603
+ basis: "estimatedUnique";
604
+ exact: boolean;
605
+ };
606
+ };
607
+ routes: Array<{
608
+ bounces: number;
609
+ daily: Array<{
610
+ bucketStart: number;
611
+ pageviews: number;
612
+ }>;
613
+ dwellMs: number;
614
+ dwellSamples: number;
615
+ entries: number;
616
+ exits: number;
617
+ pageviews: number;
618
+ route: string;
619
+ transitionsIn: number;
620
+ transitionsOut: number;
621
+ visitors: number;
622
+ }>;
623
+ to: number;
624
+ transitions: Array<{
625
+ count: number;
626
+ from: string;
627
+ to: string;
628
+ }>;
629
+ truncated: {
630
+ routes: boolean;
631
+ transitions: boolean;
632
+ };
633
+ window: {
634
+ from: number;
635
+ to: number;
636
+ } | null;
637
+ }>;
356
638
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
357
639
  listGoals(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
358
640
  _creationTime: number;
@@ -401,11 +683,53 @@ export declare class Rastro {
401
683
  }[]>;
402
684
  removeAffiliate(ctx: MutationCtx, siteId: string, affiliateId: string): Promise<null>;
403
685
  cleanup(ctx: MutationCtx, args: CleanupInput): Promise<{
686
+ before: number;
687
+ deleted: number;
688
+ hasMore: boolean;
689
+ }>;
690
+ dataCoverage(ctx: QueryCtx | MutationCtx | ActionCtx, args: DataCoverageInput): Promise<{
691
+ datasets: Array<{
692
+ coverage: {
693
+ availableFrom: number | null;
694
+ availableThrough: number | null;
695
+ generation: number | null;
696
+ retainedBefore: number | null;
697
+ state: "complete" | "partial" | "retained" | "unavailable";
698
+ };
699
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
700
+ }>;
701
+ from: number;
702
+ siteId: string;
703
+ to: number;
704
+ }>;
705
+ setRetentionPolicy(ctx: MutationCtx, args: RetentionPolicyInput): Promise<null>;
706
+ disableRetentionPolicy(ctx: MutationCtx, siteId: string): Promise<null>;
707
+ retentionStatus(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
708
+ backlog: number;
709
+ jobs: Array<{
710
+ before: number;
711
+ deleted: number;
712
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
713
+ scheduledAt: number | null;
714
+ status: "pending" | "running" | "complete";
715
+ updatedAt: number;
716
+ }>;
717
+ policy: {
718
+ aggregatesDays: number;
719
+ conversionsDays: number;
720
+ eventsDays: number;
721
+ reportsDays: number;
722
+ sessionsDays: number;
723
+ updatedAt: number;
724
+ } | null;
725
+ }>;
726
+ runRetentionPolicy(ctx: MutationCtx, args: RunRetentionPolicyInput): Promise<{
727
+ before: number;
404
728
  deleted: number;
405
729
  hasMore: boolean;
406
730
  }>;
407
731
  }
408
- 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";
732
+ 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" | "report.siteMap" | "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";
409
733
  export type AnalyticsAuthorizationRequest = {
410
734
  operation: AnalyticsOperation;
411
735
  siteIds: string[];
@@ -413,6 +737,1242 @@ export type AnalyticsAuthorizationRequest = {
413
737
  };
414
738
  export type AnalyticsAuthorizationContext = Pick<GenericQueryCtx<GenericDataModel>, "auth" | "db" | "runQuery">;
415
739
  export type AnalyticsAuthorizer = (ctx: AnalyticsAuthorizationContext, request: AnalyticsAuthorizationRequest) => void | Promise<void>;
740
+ declare const hostOverviewValidator: import("convex/values").VObject<{
741
+ currency: string;
742
+ from: number;
743
+ interval: "day" | "hour";
744
+ metadata: {
745
+ breakdowns: {
746
+ topBrowsers: "eventVolume";
747
+ topCampaigns: "eventVolume";
748
+ topCountries: "eventVolume";
749
+ topDevices: "eventVolume";
750
+ topEvents: "eventVolume";
751
+ topGoals: "goalCompletionVolume";
752
+ topPages: "eventVolume";
753
+ topSources: "eventVolume";
754
+ };
755
+ coverage: {
756
+ availableFrom: number | null;
757
+ availableThrough: number | null;
758
+ generation: number | null;
759
+ retainedBefore: number | null;
760
+ state: "complete" | "partial" | "retained" | "unavailable";
761
+ };
762
+ features: {
763
+ botDetection: "userAgent";
764
+ errorInsights: "unsupported";
765
+ outboundLinks: "eventVolume";
766
+ sessionReplay: "unsupported";
767
+ };
768
+ range: {
769
+ boundary: "inclusive";
770
+ from: number;
771
+ timezone: "UTC";
772
+ to: number;
773
+ };
774
+ visitors: {
775
+ basis: "bucketOccurrences" | "estimatedUnique";
776
+ exact: boolean;
777
+ legacyIncomplete: boolean;
778
+ precision: number | null;
779
+ sketchVersion: number | null;
780
+ };
781
+ };
782
+ timeSeries: {
783
+ clicks: number;
784
+ conversions: number;
785
+ customEvents: number;
786
+ events: number;
787
+ outboundClicks: number;
788
+ pageviews: number;
789
+ revenueCents: number;
790
+ sessions: number;
791
+ timestamp: number;
792
+ visitors: number;
793
+ }[];
794
+ to: number;
795
+ topBrowsers: {
796
+ count: number;
797
+ revenueCents: number;
798
+ value: string;
799
+ }[];
800
+ topCampaigns: {
801
+ count: number;
802
+ revenueCents: number;
803
+ value: string;
804
+ }[];
805
+ topCountries: {
806
+ count: number;
807
+ revenueCents: number;
808
+ value: string;
809
+ }[];
810
+ topDevices: {
811
+ count: number;
812
+ revenueCents: number;
813
+ value: string;
814
+ }[];
815
+ topEvents: {
816
+ count: number;
817
+ revenueCents: number;
818
+ value: string;
819
+ }[];
820
+ topGoals: {
821
+ count: number;
822
+ revenueCents: number;
823
+ value: string;
824
+ }[];
825
+ topPages: {
826
+ count: number;
827
+ revenueCents: number;
828
+ value: string;
829
+ }[];
830
+ topSources: {
831
+ count: number;
832
+ revenueCents: number;
833
+ value: string;
834
+ }[];
835
+ totals: {
836
+ clicks: number;
837
+ conversions: number;
838
+ customEvents: number;
839
+ events: number;
840
+ outboundClicks: number;
841
+ pageviews: number;
842
+ revenueCents: number;
843
+ sessions: number;
844
+ visitors: number;
845
+ };
846
+ }, {
847
+ from: import("convex/values").VFloat64<number, "required">;
848
+ to: import("convex/values").VFloat64<number, "required">;
849
+ interval: import("convex/values").VUnion<"day" | "hour", [import("convex/values").VLiteral<"hour", "required">, import("convex/values").VLiteral<"day", "required">], "required", never>;
850
+ currency: import("convex/values").VString<string, "required">;
851
+ totals: import("convex/values").VObject<{
852
+ clicks: number;
853
+ conversions: number;
854
+ customEvents: number;
855
+ events: number;
856
+ outboundClicks: number;
857
+ pageviews: number;
858
+ revenueCents: number;
859
+ sessions: number;
860
+ visitors: number;
861
+ }, {
862
+ events: import("convex/values").VFloat64<number, "required">;
863
+ pageviews: import("convex/values").VFloat64<number, "required">;
864
+ clicks: import("convex/values").VFloat64<number, "required">;
865
+ customEvents: import("convex/values").VFloat64<number, "required">;
866
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
867
+ sessions: import("convex/values").VFloat64<number, "required">;
868
+ visitors: import("convex/values").VFloat64<number, "required">;
869
+ conversions: import("convex/values").VFloat64<number, "required">;
870
+ revenueCents: import("convex/values").VFloat64<number, "required">;
871
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "visitors">;
872
+ timeSeries: import("convex/values").VArray<{
873
+ clicks: number;
874
+ conversions: number;
875
+ customEvents: number;
876
+ events: number;
877
+ outboundClicks: number;
878
+ pageviews: number;
879
+ revenueCents: number;
880
+ sessions: number;
881
+ timestamp: number;
882
+ visitors: number;
883
+ }[], import("convex/values").VObject<{
884
+ clicks: number;
885
+ conversions: number;
886
+ customEvents: number;
887
+ events: number;
888
+ outboundClicks: number;
889
+ pageviews: number;
890
+ revenueCents: number;
891
+ sessions: number;
892
+ timestamp: number;
893
+ visitors: number;
894
+ }, {
895
+ events: import("convex/values").VFloat64<number, "required">;
896
+ pageviews: import("convex/values").VFloat64<number, "required">;
897
+ clicks: import("convex/values").VFloat64<number, "required">;
898
+ customEvents: import("convex/values").VFloat64<number, "required">;
899
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
900
+ sessions: import("convex/values").VFloat64<number, "required">;
901
+ visitors: import("convex/values").VFloat64<number, "required">;
902
+ conversions: import("convex/values").VFloat64<number, "required">;
903
+ revenueCents: import("convex/values").VFloat64<number, "required">;
904
+ timestamp: import("convex/values").VFloat64<number, "required">;
905
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "timestamp" | "visitors">, "required">;
906
+ topSources: import("convex/values").VArray<{
907
+ count: number;
908
+ revenueCents: number;
909
+ value: string;
910
+ }[], import("convex/values").VObject<{
911
+ count: number;
912
+ revenueCents: number;
913
+ value: string;
914
+ }, {
915
+ value: import("convex/values").VString<string, "required">;
916
+ count: import("convex/values").VFloat64<number, "required">;
917
+ revenueCents: import("convex/values").VFloat64<number, "required">;
918
+ }, "required", "count" | "revenueCents" | "value">, "required">;
919
+ topCampaigns: import("convex/values").VArray<{
920
+ count: number;
921
+ revenueCents: number;
922
+ value: string;
923
+ }[], import("convex/values").VObject<{
924
+ count: number;
925
+ revenueCents: number;
926
+ value: string;
927
+ }, {
928
+ value: import("convex/values").VString<string, "required">;
929
+ count: import("convex/values").VFloat64<number, "required">;
930
+ revenueCents: import("convex/values").VFloat64<number, "required">;
931
+ }, "required", "count" | "revenueCents" | "value">, "required">;
932
+ topPages: import("convex/values").VArray<{
933
+ count: number;
934
+ revenueCents: number;
935
+ value: string;
936
+ }[], import("convex/values").VObject<{
937
+ count: number;
938
+ revenueCents: number;
939
+ value: string;
940
+ }, {
941
+ value: import("convex/values").VString<string, "required">;
942
+ count: import("convex/values").VFloat64<number, "required">;
943
+ revenueCents: import("convex/values").VFloat64<number, "required">;
944
+ }, "required", "count" | "revenueCents" | "value">, "required">;
945
+ topCountries: import("convex/values").VArray<{
946
+ count: number;
947
+ revenueCents: number;
948
+ value: string;
949
+ }[], import("convex/values").VObject<{
950
+ count: number;
951
+ revenueCents: number;
952
+ value: string;
953
+ }, {
954
+ value: import("convex/values").VString<string, "required">;
955
+ count: import("convex/values").VFloat64<number, "required">;
956
+ revenueCents: import("convex/values").VFloat64<number, "required">;
957
+ }, "required", "count" | "revenueCents" | "value">, "required">;
958
+ topDevices: import("convex/values").VArray<{
959
+ count: number;
960
+ revenueCents: number;
961
+ value: string;
962
+ }[], import("convex/values").VObject<{
963
+ count: number;
964
+ revenueCents: number;
965
+ value: string;
966
+ }, {
967
+ value: import("convex/values").VString<string, "required">;
968
+ count: import("convex/values").VFloat64<number, "required">;
969
+ revenueCents: import("convex/values").VFloat64<number, "required">;
970
+ }, "required", "count" | "revenueCents" | "value">, "required">;
971
+ topBrowsers: import("convex/values").VArray<{
972
+ count: number;
973
+ revenueCents: number;
974
+ value: string;
975
+ }[], import("convex/values").VObject<{
976
+ count: number;
977
+ revenueCents: number;
978
+ value: string;
979
+ }, {
980
+ value: import("convex/values").VString<string, "required">;
981
+ count: import("convex/values").VFloat64<number, "required">;
982
+ revenueCents: import("convex/values").VFloat64<number, "required">;
983
+ }, "required", "count" | "revenueCents" | "value">, "required">;
984
+ topEvents: import("convex/values").VArray<{
985
+ count: number;
986
+ revenueCents: number;
987
+ value: string;
988
+ }[], import("convex/values").VObject<{
989
+ count: number;
990
+ revenueCents: number;
991
+ value: string;
992
+ }, {
993
+ value: import("convex/values").VString<string, "required">;
994
+ count: import("convex/values").VFloat64<number, "required">;
995
+ revenueCents: import("convex/values").VFloat64<number, "required">;
996
+ }, "required", "count" | "revenueCents" | "value">, "required">;
997
+ topGoals: import("convex/values").VArray<{
998
+ count: number;
999
+ revenueCents: number;
1000
+ value: string;
1001
+ }[], import("convex/values").VObject<{
1002
+ count: number;
1003
+ revenueCents: number;
1004
+ value: string;
1005
+ }, {
1006
+ value: import("convex/values").VString<string, "required">;
1007
+ count: import("convex/values").VFloat64<number, "required">;
1008
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1009
+ }, "required", "count" | "revenueCents" | "value">, "required">;
1010
+ metadata: import("convex/values").VObject<{
1011
+ breakdowns: {
1012
+ topBrowsers: "eventVolume";
1013
+ topCampaigns: "eventVolume";
1014
+ topCountries: "eventVolume";
1015
+ topDevices: "eventVolume";
1016
+ topEvents: "eventVolume";
1017
+ topGoals: "goalCompletionVolume";
1018
+ topPages: "eventVolume";
1019
+ topSources: "eventVolume";
1020
+ };
1021
+ coverage: {
1022
+ availableFrom: number | null;
1023
+ availableThrough: number | null;
1024
+ generation: number | null;
1025
+ retainedBefore: number | null;
1026
+ state: "complete" | "partial" | "retained" | "unavailable";
1027
+ };
1028
+ features: {
1029
+ botDetection: "userAgent";
1030
+ errorInsights: "unsupported";
1031
+ outboundLinks: "eventVolume";
1032
+ sessionReplay: "unsupported";
1033
+ };
1034
+ range: {
1035
+ boundary: "inclusive";
1036
+ from: number;
1037
+ timezone: "UTC";
1038
+ to: number;
1039
+ };
1040
+ visitors: {
1041
+ basis: "bucketOccurrences" | "estimatedUnique";
1042
+ exact: boolean;
1043
+ legacyIncomplete: boolean;
1044
+ precision: number | null;
1045
+ sketchVersion: number | null;
1046
+ };
1047
+ }, {
1048
+ visitors: import("convex/values").VObject<{
1049
+ basis: "bucketOccurrences" | "estimatedUnique";
1050
+ exact: boolean;
1051
+ legacyIncomplete: boolean;
1052
+ precision: number | null;
1053
+ sketchVersion: number | null;
1054
+ }, {
1055
+ basis: import("convex/values").VUnion<"bucketOccurrences" | "estimatedUnique", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"bucketOccurrences", "required">], "required", never>;
1056
+ exact: import("convex/values").VBoolean<boolean, "required">;
1057
+ legacyIncomplete: import("convex/values").VBoolean<boolean, "required">;
1058
+ sketchVersion: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1059
+ precision: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1060
+ }, "required", "basis" | "exact" | "legacyIncomplete" | "precision" | "sketchVersion">;
1061
+ breakdowns: import("convex/values").VObject<{
1062
+ topBrowsers: "eventVolume";
1063
+ topCampaigns: "eventVolume";
1064
+ topCountries: "eventVolume";
1065
+ topDevices: "eventVolume";
1066
+ topEvents: "eventVolume";
1067
+ topGoals: "goalCompletionVolume";
1068
+ topPages: "eventVolume";
1069
+ topSources: "eventVolume";
1070
+ }, {
1071
+ topSources: import("convex/values").VLiteral<"eventVolume", "required">;
1072
+ topCampaigns: import("convex/values").VLiteral<"eventVolume", "required">;
1073
+ topPages: import("convex/values").VLiteral<"eventVolume", "required">;
1074
+ topCountries: import("convex/values").VLiteral<"eventVolume", "required">;
1075
+ topDevices: import("convex/values").VLiteral<"eventVolume", "required">;
1076
+ topBrowsers: import("convex/values").VLiteral<"eventVolume", "required">;
1077
+ topEvents: import("convex/values").VLiteral<"eventVolume", "required">;
1078
+ topGoals: import("convex/values").VLiteral<"goalCompletionVolume", "required">;
1079
+ }, "required", "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
1080
+ coverage: import("convex/values").VObject<{
1081
+ availableFrom: number | null;
1082
+ availableThrough: number | null;
1083
+ generation: number | null;
1084
+ retainedBefore: number | null;
1085
+ state: "complete" | "partial" | "retained" | "unavailable";
1086
+ }, {
1087
+ 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>;
1088
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1089
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1090
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1091
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1092
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1093
+ range: import("convex/values").VObject<{
1094
+ boundary: "inclusive";
1095
+ from: number;
1096
+ timezone: "UTC";
1097
+ to: number;
1098
+ }, {
1099
+ from: import("convex/values").VFloat64<number, "required">;
1100
+ to: import("convex/values").VFloat64<number, "required">;
1101
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1102
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1103
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1104
+ features: import("convex/values").VObject<{
1105
+ botDetection: "userAgent";
1106
+ errorInsights: "unsupported";
1107
+ outboundLinks: "eventVolume";
1108
+ sessionReplay: "unsupported";
1109
+ }, {
1110
+ sessionReplay: import("convex/values").VLiteral<"unsupported", "required">;
1111
+ errorInsights: import("convex/values").VLiteral<"unsupported", "required">;
1112
+ outboundLinks: import("convex/values").VLiteral<"eventVolume", "required">;
1113
+ botDetection: import("convex/values").VLiteral<"userAgent", "required">;
1114
+ }, "required", "botDetection" | "errorInsights" | "outboundLinks" | "sessionReplay">;
1115
+ }, "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">;
1116
+ }, "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">;
1117
+ declare const hostGoalsReportValidator: import("convex/values").VObject<{
1118
+ goals: {
1119
+ _creationTime: number;
1120
+ _id: string;
1121
+ active: boolean;
1122
+ completions: number;
1123
+ createdAt: number;
1124
+ key: string;
1125
+ matchType: "custom" | "pageview";
1126
+ matchValue: string;
1127
+ name: string;
1128
+ siteId: string;
1129
+ updatedAt: number;
1130
+ valueCents: number;
1131
+ }[];
1132
+ metadata: {
1133
+ basis: "boundedLegacy" | "dailyRollup";
1134
+ coverage: {
1135
+ availableFrom: number | null;
1136
+ availableThrough: number | null;
1137
+ generation: number | null;
1138
+ retainedBefore: number | null;
1139
+ state: "complete" | "partial" | "retained" | "unavailable";
1140
+ };
1141
+ range: {
1142
+ boundary: "inclusive";
1143
+ from: number;
1144
+ timezone: "UTC";
1145
+ to: number;
1146
+ };
1147
+ };
1148
+ truncated: boolean;
1149
+ }, {
1150
+ goals: import("convex/values").VArray<{
1151
+ _creationTime: number;
1152
+ _id: string;
1153
+ active: boolean;
1154
+ completions: number;
1155
+ createdAt: number;
1156
+ key: string;
1157
+ matchType: "custom" | "pageview";
1158
+ matchValue: string;
1159
+ name: string;
1160
+ siteId: string;
1161
+ updatedAt: number;
1162
+ valueCents: number;
1163
+ }[], import("convex/values").VObject<{
1164
+ _creationTime: number;
1165
+ _id: string;
1166
+ active: boolean;
1167
+ completions: number;
1168
+ createdAt: number;
1169
+ key: string;
1170
+ matchType: "custom" | "pageview";
1171
+ matchValue: string;
1172
+ name: string;
1173
+ siteId: string;
1174
+ updatedAt: number;
1175
+ valueCents: number;
1176
+ }, {
1177
+ _id: import("convex/values").VString<string, "required">;
1178
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1179
+ siteId: import("convex/values").VString<string, "required">;
1180
+ key: import("convex/values").VString<string, "required">;
1181
+ name: import("convex/values").VString<string, "required">;
1182
+ matchType: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1183
+ matchValue: import("convex/values").VString<string, "required">;
1184
+ valueCents: never;
1185
+ active: import("convex/values").VBoolean<boolean, "required">;
1186
+ createdAt: import("convex/values").VFloat64<number, "required">;
1187
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1188
+ completions: import("convex/values").VFloat64<number, "required">;
1189
+ }, "required", "_creationTime" | "_id" | "active" | "completions" | "createdAt" | "key" | "matchType" | "matchValue" | "name" | "siteId" | "updatedAt" | "valueCents">, "required">;
1190
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1191
+ metadata: import("convex/values").VObject<{
1192
+ basis: "boundedLegacy" | "dailyRollup";
1193
+ coverage: {
1194
+ availableFrom: number | null;
1195
+ availableThrough: number | null;
1196
+ generation: number | null;
1197
+ retainedBefore: number | null;
1198
+ state: "complete" | "partial" | "retained" | "unavailable";
1199
+ };
1200
+ range: {
1201
+ boundary: "inclusive";
1202
+ from: number;
1203
+ timezone: "UTC";
1204
+ to: number;
1205
+ };
1206
+ }, {
1207
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1208
+ coverage: import("convex/values").VObject<{
1209
+ availableFrom: number | null;
1210
+ availableThrough: number | null;
1211
+ generation: number | null;
1212
+ retainedBefore: number | null;
1213
+ state: "complete" | "partial" | "retained" | "unavailable";
1214
+ }, {
1215
+ 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>;
1216
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1217
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1218
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1219
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1220
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1221
+ range: import("convex/values").VObject<{
1222
+ boundary: "inclusive";
1223
+ from: number;
1224
+ timezone: "UTC";
1225
+ to: number;
1226
+ }, {
1227
+ from: import("convex/values").VFloat64<number, "required">;
1228
+ to: import("convex/values").VFloat64<number, "required">;
1229
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1230
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1231
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1232
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1233
+ }, "required", "goals" | "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" | "truncated">;
1234
+ declare const hostFunnelsReportValidator: import("convex/values").VArray<{
1235
+ _creationTime: number;
1236
+ _id: string;
1237
+ active: boolean;
1238
+ conversionWindowMs: number;
1239
+ createdAt: number;
1240
+ key: string;
1241
+ metadata: {
1242
+ basis: "boundedLegacy" | "dailyRollup";
1243
+ coverage: {
1244
+ availableFrom: number | null;
1245
+ availableThrough: number | null;
1246
+ generation: number | null;
1247
+ retainedBefore: number | null;
1248
+ state: "complete" | "partial" | "retained" | "unavailable";
1249
+ };
1250
+ range: {
1251
+ boundary: "inclusive";
1252
+ from: number;
1253
+ timezone: "UTC";
1254
+ to: number;
1255
+ };
1256
+ };
1257
+ name: string;
1258
+ siteId: string;
1259
+ steps: {
1260
+ name: string;
1261
+ type: "custom" | "pageview";
1262
+ value: string;
1263
+ }[];
1264
+ stepsReport: {
1265
+ completions: number;
1266
+ entrants: number;
1267
+ name: string;
1268
+ step: number;
1269
+ }[];
1270
+ truncated: boolean;
1271
+ updatedAt: number;
1272
+ }[], import("convex/values").VObject<{
1273
+ _creationTime: number;
1274
+ _id: string;
1275
+ active: boolean;
1276
+ conversionWindowMs: number;
1277
+ createdAt: number;
1278
+ key: string;
1279
+ metadata: {
1280
+ basis: "boundedLegacy" | "dailyRollup";
1281
+ coverage: {
1282
+ availableFrom: number | null;
1283
+ availableThrough: number | null;
1284
+ generation: number | null;
1285
+ retainedBefore: number | null;
1286
+ state: "complete" | "partial" | "retained" | "unavailable";
1287
+ };
1288
+ range: {
1289
+ boundary: "inclusive";
1290
+ from: number;
1291
+ timezone: "UTC";
1292
+ to: number;
1293
+ };
1294
+ };
1295
+ name: string;
1296
+ siteId: string;
1297
+ steps: {
1298
+ name: string;
1299
+ type: "custom" | "pageview";
1300
+ value: string;
1301
+ }[];
1302
+ stepsReport: {
1303
+ completions: number;
1304
+ entrants: number;
1305
+ name: string;
1306
+ step: number;
1307
+ }[];
1308
+ truncated: boolean;
1309
+ updatedAt: number;
1310
+ }, {
1311
+ _id: import("convex/values").VString<string, "required">;
1312
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1313
+ siteId: import("convex/values").VString<string, "required">;
1314
+ key: import("convex/values").VString<string, "required">;
1315
+ name: import("convex/values").VString<string, "required">;
1316
+ steps: import("convex/values").VArray<{
1317
+ name: string;
1318
+ type: "custom" | "pageview";
1319
+ value: string;
1320
+ }[], import("convex/values").VObject<{
1321
+ name: string;
1322
+ type: "custom" | "pageview";
1323
+ value: string;
1324
+ }, {
1325
+ type: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1326
+ value: import("convex/values").VString<string, "required">;
1327
+ name: import("convex/values").VString<string, "required">;
1328
+ }, "required", "name" | "type" | "value">, "required">;
1329
+ conversionWindowMs: import("convex/values").VFloat64<number, "required">;
1330
+ active: import("convex/values").VBoolean<boolean, "required">;
1331
+ createdAt: import("convex/values").VFloat64<number, "required">;
1332
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1333
+ stepsReport: import("convex/values").VArray<{
1334
+ completions: number;
1335
+ entrants: number;
1336
+ name: string;
1337
+ step: number;
1338
+ }[], import("convex/values").VObject<{
1339
+ completions: number;
1340
+ entrants: number;
1341
+ name: string;
1342
+ step: number;
1343
+ }, {
1344
+ step: import("convex/values").VFloat64<number, "required">;
1345
+ name: import("convex/values").VString<string, "required">;
1346
+ entrants: import("convex/values").VFloat64<number, "required">;
1347
+ completions: import("convex/values").VFloat64<number, "required">;
1348
+ }, "required", "completions" | "entrants" | "name" | "step">, "required">;
1349
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1350
+ metadata: import("convex/values").VObject<{
1351
+ basis: "boundedLegacy" | "dailyRollup";
1352
+ coverage: {
1353
+ availableFrom: number | null;
1354
+ availableThrough: number | null;
1355
+ generation: number | null;
1356
+ retainedBefore: number | null;
1357
+ state: "complete" | "partial" | "retained" | "unavailable";
1358
+ };
1359
+ range: {
1360
+ boundary: "inclusive";
1361
+ from: number;
1362
+ timezone: "UTC";
1363
+ to: number;
1364
+ };
1365
+ }, {
1366
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1367
+ coverage: import("convex/values").VObject<{
1368
+ availableFrom: number | null;
1369
+ availableThrough: number | null;
1370
+ generation: number | null;
1371
+ retainedBefore: number | null;
1372
+ state: "complete" | "partial" | "retained" | "unavailable";
1373
+ }, {
1374
+ 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>;
1375
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1376
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1377
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1378
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1379
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1380
+ range: import("convex/values").VObject<{
1381
+ boundary: "inclusive";
1382
+ from: number;
1383
+ timezone: "UTC";
1384
+ to: number;
1385
+ }, {
1386
+ from: import("convex/values").VFloat64<number, "required">;
1387
+ to: import("convex/values").VFloat64<number, "required">;
1388
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1389
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1390
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1391
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1392
+ }, "required", "_creationTime" | "_id" | "active" | "conversionWindowMs" | "createdAt" | "key" | "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" | "name" | "siteId" | "steps" | "stepsReport" | "truncated" | "updatedAt">, "required">;
1393
+ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1394
+ affiliates: {
1395
+ _creationTime: number;
1396
+ _id: string;
1397
+ active: boolean;
1398
+ attributionWindowDays: number;
1399
+ commissionBps: number;
1400
+ commissionCents: number;
1401
+ conversions: number;
1402
+ createdAt: number;
1403
+ name: string;
1404
+ revenueCents: number;
1405
+ siteId: string;
1406
+ slug: string;
1407
+ uniqueVisitors: number;
1408
+ updatedAt: number;
1409
+ visits: number;
1410
+ }[];
1411
+ metadata: {
1412
+ basis: "boundedLegacy" | "dailyRollup";
1413
+ coverage: {
1414
+ availableFrom: number | null;
1415
+ availableThrough: number | null;
1416
+ generation: number | null;
1417
+ retainedBefore: number | null;
1418
+ state: "complete" | "partial" | "retained" | "unavailable";
1419
+ };
1420
+ range: {
1421
+ boundary: "inclusive";
1422
+ from: number;
1423
+ timezone: "UTC";
1424
+ to: number;
1425
+ };
1426
+ uniqueVisitors: {
1427
+ basis: "estimatedUnique" | "exactLegacy";
1428
+ exact: boolean;
1429
+ };
1430
+ };
1431
+ truncated: boolean;
1432
+ }, {
1433
+ affiliates: import("convex/values").VArray<{
1434
+ _creationTime: number;
1435
+ _id: string;
1436
+ active: boolean;
1437
+ attributionWindowDays: number;
1438
+ commissionBps: number;
1439
+ commissionCents: number;
1440
+ conversions: number;
1441
+ createdAt: number;
1442
+ name: string;
1443
+ revenueCents: number;
1444
+ siteId: string;
1445
+ slug: string;
1446
+ uniqueVisitors: number;
1447
+ updatedAt: number;
1448
+ visits: number;
1449
+ }[], import("convex/values").VObject<{
1450
+ _creationTime: number;
1451
+ _id: string;
1452
+ active: boolean;
1453
+ attributionWindowDays: number;
1454
+ commissionBps: number;
1455
+ commissionCents: number;
1456
+ conversions: number;
1457
+ createdAt: number;
1458
+ name: string;
1459
+ revenueCents: number;
1460
+ siteId: string;
1461
+ slug: string;
1462
+ uniqueVisitors: number;
1463
+ updatedAt: number;
1464
+ visits: number;
1465
+ }, {
1466
+ _id: import("convex/values").VString<string, "required">;
1467
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1468
+ siteId: import("convex/values").VString<string, "required">;
1469
+ slug: import("convex/values").VString<string, "required">;
1470
+ name: import("convex/values").VString<string, "required">;
1471
+ commissionBps: import("convex/values").VFloat64<number, "required">;
1472
+ attributionWindowDays: import("convex/values").VFloat64<number, "required">;
1473
+ active: import("convex/values").VBoolean<boolean, "required">;
1474
+ createdAt: import("convex/values").VFloat64<number, "required">;
1475
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1476
+ visits: import("convex/values").VFloat64<number, "required">;
1477
+ uniqueVisitors: import("convex/values").VFloat64<number, "required">;
1478
+ conversions: import("convex/values").VFloat64<number, "required">;
1479
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1480
+ commissionCents: import("convex/values").VFloat64<number, "required">;
1481
+ }, "required", "_creationTime" | "_id" | "active" | "attributionWindowDays" | "commissionBps" | "commissionCents" | "conversions" | "createdAt" | "name" | "revenueCents" | "siteId" | "slug" | "uniqueVisitors" | "updatedAt" | "visits">, "required">;
1482
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1483
+ metadata: import("convex/values").VObject<{
1484
+ basis: "boundedLegacy" | "dailyRollup";
1485
+ coverage: {
1486
+ availableFrom: number | null;
1487
+ availableThrough: number | null;
1488
+ generation: number | null;
1489
+ retainedBefore: number | null;
1490
+ state: "complete" | "partial" | "retained" | "unavailable";
1491
+ };
1492
+ range: {
1493
+ boundary: "inclusive";
1494
+ from: number;
1495
+ timezone: "UTC";
1496
+ to: number;
1497
+ };
1498
+ uniqueVisitors: {
1499
+ basis: "estimatedUnique" | "exactLegacy";
1500
+ exact: boolean;
1501
+ };
1502
+ }, {
1503
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1504
+ coverage: import("convex/values").VObject<{
1505
+ availableFrom: number | null;
1506
+ availableThrough: number | null;
1507
+ generation: number | null;
1508
+ retainedBefore: number | null;
1509
+ state: "complete" | "partial" | "retained" | "unavailable";
1510
+ }, {
1511
+ 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>;
1512
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1513
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1514
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1515
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1516
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1517
+ range: import("convex/values").VObject<{
1518
+ boundary: "inclusive";
1519
+ from: number;
1520
+ timezone: "UTC";
1521
+ to: number;
1522
+ }, {
1523
+ from: import("convex/values").VFloat64<number, "required">;
1524
+ to: import("convex/values").VFloat64<number, "required">;
1525
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1526
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1527
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1528
+ uniqueVisitors: import("convex/values").VObject<{
1529
+ basis: "estimatedUnique" | "exactLegacy";
1530
+ exact: boolean;
1531
+ }, {
1532
+ basis: import("convex/values").VUnion<"estimatedUnique" | "exactLegacy", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"exactLegacy", "required">], "required", never>;
1533
+ exact: import("convex/values").VBoolean<boolean, "required">;
1534
+ }, "required", "basis" | "exact">;
1535
+ }, "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">;
1536
+ }, "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">;
1537
+ declare const hostVitalsReportValidator: import("convex/values").VObject<{
1538
+ metadata: {
1539
+ basis: "boundedLegacy" | "dailyRollup";
1540
+ coverage: {
1541
+ availableFrom: number | null;
1542
+ availableThrough: number | null;
1543
+ generation: number | null;
1544
+ retainedBefore: number | null;
1545
+ state: "complete" | "partial" | "retained" | "unavailable";
1546
+ };
1547
+ range: {
1548
+ boundary: "inclusive";
1549
+ from: number;
1550
+ timezone: "UTC";
1551
+ to: number;
1552
+ };
1553
+ };
1554
+ metrics: {
1555
+ average: number;
1556
+ count: number;
1557
+ devices: {
1558
+ average: number;
1559
+ count: number;
1560
+ device: string;
1561
+ good: number;
1562
+ needsImprovement: number;
1563
+ p75: number;
1564
+ poor: number;
1565
+ }[];
1566
+ good: number;
1567
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1568
+ needsImprovement: number;
1569
+ p75: number;
1570
+ pages: {
1571
+ average: number;
1572
+ count: number;
1573
+ good: number;
1574
+ needsImprovement: number;
1575
+ p75: number;
1576
+ page: string;
1577
+ poor: number;
1578
+ }[];
1579
+ poor: number;
1580
+ timeSeries: {
1581
+ count: number;
1582
+ p75: number;
1583
+ timestamp: number;
1584
+ }[];
1585
+ }[];
1586
+ truncated: boolean;
1587
+ }, {
1588
+ metrics: import("convex/values").VArray<{
1589
+ average: number;
1590
+ count: number;
1591
+ devices: {
1592
+ average: number;
1593
+ count: number;
1594
+ device: string;
1595
+ good: number;
1596
+ needsImprovement: number;
1597
+ p75: number;
1598
+ poor: number;
1599
+ }[];
1600
+ good: number;
1601
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1602
+ needsImprovement: number;
1603
+ p75: number;
1604
+ pages: {
1605
+ average: number;
1606
+ count: number;
1607
+ good: number;
1608
+ needsImprovement: number;
1609
+ p75: number;
1610
+ page: string;
1611
+ poor: number;
1612
+ }[];
1613
+ poor: number;
1614
+ timeSeries: {
1615
+ count: number;
1616
+ p75: number;
1617
+ timestamp: number;
1618
+ }[];
1619
+ }[], import("convex/values").VObject<{
1620
+ average: number;
1621
+ count: number;
1622
+ devices: {
1623
+ average: number;
1624
+ count: number;
1625
+ device: string;
1626
+ good: number;
1627
+ needsImprovement: number;
1628
+ p75: number;
1629
+ poor: number;
1630
+ }[];
1631
+ good: number;
1632
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1633
+ needsImprovement: number;
1634
+ p75: number;
1635
+ pages: {
1636
+ average: number;
1637
+ count: number;
1638
+ good: number;
1639
+ needsImprovement: number;
1640
+ p75: number;
1641
+ page: string;
1642
+ poor: number;
1643
+ }[];
1644
+ poor: number;
1645
+ timeSeries: {
1646
+ count: number;
1647
+ p75: number;
1648
+ timestamp: number;
1649
+ }[];
1650
+ }, {
1651
+ count: import("convex/values").VFloat64<number, "required">;
1652
+ p75: import("convex/values").VFloat64<number, "required">;
1653
+ average: import("convex/values").VFloat64<number, "required">;
1654
+ good: import("convex/values").VFloat64<number, "required">;
1655
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1656
+ poor: import("convex/values").VFloat64<number, "required">;
1657
+ 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>;
1658
+ devices: import("convex/values").VArray<{
1659
+ average: number;
1660
+ count: number;
1661
+ device: string;
1662
+ good: number;
1663
+ needsImprovement: number;
1664
+ p75: number;
1665
+ poor: number;
1666
+ }[], import("convex/values").VObject<{
1667
+ average: number;
1668
+ count: number;
1669
+ device: string;
1670
+ good: number;
1671
+ needsImprovement: number;
1672
+ p75: number;
1673
+ poor: number;
1674
+ }, {
1675
+ count: import("convex/values").VFloat64<number, "required">;
1676
+ p75: import("convex/values").VFloat64<number, "required">;
1677
+ average: import("convex/values").VFloat64<number, "required">;
1678
+ good: import("convex/values").VFloat64<number, "required">;
1679
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1680
+ poor: import("convex/values").VFloat64<number, "required">;
1681
+ device: import("convex/values").VString<string, "required">;
1682
+ }, "required", "average" | "count" | "device" | "good" | "needsImprovement" | "p75" | "poor">, "required">;
1683
+ pages: import("convex/values").VArray<{
1684
+ average: number;
1685
+ count: number;
1686
+ good: number;
1687
+ needsImprovement: number;
1688
+ p75: number;
1689
+ page: string;
1690
+ poor: number;
1691
+ }[], import("convex/values").VObject<{
1692
+ average: number;
1693
+ count: number;
1694
+ good: number;
1695
+ needsImprovement: number;
1696
+ p75: number;
1697
+ page: string;
1698
+ poor: number;
1699
+ }, {
1700
+ count: import("convex/values").VFloat64<number, "required">;
1701
+ p75: import("convex/values").VFloat64<number, "required">;
1702
+ average: import("convex/values").VFloat64<number, "required">;
1703
+ good: import("convex/values").VFloat64<number, "required">;
1704
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1705
+ poor: import("convex/values").VFloat64<number, "required">;
1706
+ page: import("convex/values").VString<string, "required">;
1707
+ }, "required", "average" | "count" | "good" | "needsImprovement" | "p75" | "page" | "poor">, "required">;
1708
+ timeSeries: import("convex/values").VArray<{
1709
+ count: number;
1710
+ p75: number;
1711
+ timestamp: number;
1712
+ }[], import("convex/values").VObject<{
1713
+ count: number;
1714
+ p75: number;
1715
+ timestamp: number;
1716
+ }, {
1717
+ timestamp: import("convex/values").VFloat64<number, "required">;
1718
+ count: import("convex/values").VFloat64<number, "required">;
1719
+ p75: import("convex/values").VFloat64<number, "required">;
1720
+ }, "required", "count" | "p75" | "timestamp">, "required">;
1721
+ }, "required", "average" | "count" | "devices" | "good" | "metric" | "needsImprovement" | "p75" | "pages" | "poor" | "timeSeries">, "required">;
1722
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1723
+ metadata: import("convex/values").VObject<{
1724
+ basis: "boundedLegacy" | "dailyRollup";
1725
+ coverage: {
1726
+ availableFrom: number | null;
1727
+ availableThrough: number | null;
1728
+ generation: number | null;
1729
+ retainedBefore: number | null;
1730
+ state: "complete" | "partial" | "retained" | "unavailable";
1731
+ };
1732
+ range: {
1733
+ boundary: "inclusive";
1734
+ from: number;
1735
+ timezone: "UTC";
1736
+ to: number;
1737
+ };
1738
+ }, {
1739
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1740
+ coverage: import("convex/values").VObject<{
1741
+ availableFrom: number | null;
1742
+ availableThrough: number | null;
1743
+ generation: number | null;
1744
+ retainedBefore: number | null;
1745
+ state: "complete" | "partial" | "retained" | "unavailable";
1746
+ }, {
1747
+ 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>;
1748
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1749
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1750
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1751
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1752
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1753
+ range: import("convex/values").VObject<{
1754
+ boundary: "inclusive";
1755
+ from: number;
1756
+ timezone: "UTC";
1757
+ to: number;
1758
+ }, {
1759
+ from: import("convex/values").VFloat64<number, "required">;
1760
+ to: import("convex/values").VFloat64<number, "required">;
1761
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1762
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1763
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1764
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1765
+ }, "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">;
1766
+ declare const hostSiteMapValidator: import("convex/values").VObject<{
1767
+ from: number;
1768
+ metadata: {
1769
+ basis: "boundedLegacy" | "dailyRollup";
1770
+ coverage: {
1771
+ availableFrom: number | null;
1772
+ availableThrough: number | null;
1773
+ generation: number | null;
1774
+ retainedBefore: number | null;
1775
+ state: "complete" | "partial" | "retained" | "unavailable";
1776
+ };
1777
+ limits: {
1778
+ routesPerDay: number;
1779
+ rows: number;
1780
+ transitionSlots: number;
1781
+ };
1782
+ range: {
1783
+ boundary: "inclusive";
1784
+ from: number;
1785
+ timezone: "UTC";
1786
+ to: number;
1787
+ };
1788
+ visitors: {
1789
+ basis: "estimatedUnique";
1790
+ exact: boolean;
1791
+ };
1792
+ };
1793
+ routes: {
1794
+ bounces: number;
1795
+ daily: {
1796
+ bucketStart: number;
1797
+ pageviews: number;
1798
+ }[];
1799
+ dwellMs: number;
1800
+ dwellSamples: number;
1801
+ entries: number;
1802
+ exits: number;
1803
+ pageviews: number;
1804
+ route: string;
1805
+ transitionsIn: number;
1806
+ transitionsOut: number;
1807
+ visitors: number;
1808
+ }[];
1809
+ to: number;
1810
+ transitions: {
1811
+ count: number;
1812
+ from: string;
1813
+ to: string;
1814
+ }[];
1815
+ truncated: {
1816
+ routes: boolean;
1817
+ transitions: boolean;
1818
+ };
1819
+ window: {
1820
+ from: number;
1821
+ to: number;
1822
+ } | null;
1823
+ }, {
1824
+ from: import("convex/values").VFloat64<number, "required">;
1825
+ to: import("convex/values").VFloat64<number, "required">;
1826
+ window: import("convex/values").VUnion<{
1827
+ from: number;
1828
+ to: number;
1829
+ } | null, [import("convex/values").VObject<{
1830
+ from: number;
1831
+ to: number;
1832
+ }, {
1833
+ from: import("convex/values").VFloat64<number, "required">;
1834
+ to: import("convex/values").VFloat64<number, "required">;
1835
+ }, "required", "from" | "to">, import("convex/values").VNull<null, "required">], "required", "from" | "to">;
1836
+ routes: import("convex/values").VArray<{
1837
+ bounces: number;
1838
+ daily: {
1839
+ bucketStart: number;
1840
+ pageviews: number;
1841
+ }[];
1842
+ dwellMs: number;
1843
+ dwellSamples: number;
1844
+ entries: number;
1845
+ exits: number;
1846
+ pageviews: number;
1847
+ route: string;
1848
+ transitionsIn: number;
1849
+ transitionsOut: number;
1850
+ visitors: number;
1851
+ }[], import("convex/values").VObject<{
1852
+ bounces: number;
1853
+ daily: {
1854
+ bucketStart: number;
1855
+ pageviews: number;
1856
+ }[];
1857
+ dwellMs: number;
1858
+ dwellSamples: number;
1859
+ entries: number;
1860
+ exits: number;
1861
+ pageviews: number;
1862
+ route: string;
1863
+ transitionsIn: number;
1864
+ transitionsOut: number;
1865
+ visitors: number;
1866
+ }, {
1867
+ route: import("convex/values").VString<string, "required">;
1868
+ pageviews: import("convex/values").VFloat64<number, "required">;
1869
+ visitors: import("convex/values").VFloat64<number, "required">;
1870
+ entries: import("convex/values").VFloat64<number, "required">;
1871
+ exits: import("convex/values").VFloat64<number, "required">;
1872
+ bounces: import("convex/values").VFloat64<number, "required">;
1873
+ transitionsIn: import("convex/values").VFloat64<number, "required">;
1874
+ transitionsOut: import("convex/values").VFloat64<number, "required">;
1875
+ dwellMs: import("convex/values").VFloat64<number, "required">;
1876
+ dwellSamples: import("convex/values").VFloat64<number, "required">;
1877
+ daily: import("convex/values").VArray<{
1878
+ bucketStart: number;
1879
+ pageviews: number;
1880
+ }[], import("convex/values").VObject<{
1881
+ bucketStart: number;
1882
+ pageviews: number;
1883
+ }, {
1884
+ bucketStart: import("convex/values").VFloat64<number, "required">;
1885
+ pageviews: import("convex/values").VFloat64<number, "required">;
1886
+ }, "required", "bucketStart" | "pageviews">, "required">;
1887
+ }, "required", "bounces" | "daily" | "dwellMs" | "dwellSamples" | "entries" | "exits" | "pageviews" | "route" | "transitionsIn" | "transitionsOut" | "visitors">, "required">;
1888
+ transitions: import("convex/values").VArray<{
1889
+ count: number;
1890
+ from: string;
1891
+ to: string;
1892
+ }[], import("convex/values").VObject<{
1893
+ count: number;
1894
+ from: string;
1895
+ to: string;
1896
+ }, {
1897
+ from: import("convex/values").VString<string, "required">;
1898
+ to: import("convex/values").VString<string, "required">;
1899
+ count: import("convex/values").VFloat64<number, "required">;
1900
+ }, "required", "count" | "from" | "to">, "required">;
1901
+ truncated: import("convex/values").VObject<{
1902
+ routes: boolean;
1903
+ transitions: boolean;
1904
+ }, {
1905
+ routes: import("convex/values").VBoolean<boolean, "required">;
1906
+ transitions: import("convex/values").VBoolean<boolean, "required">;
1907
+ }, "required", "routes" | "transitions">;
1908
+ metadata: import("convex/values").VObject<{
1909
+ basis: "boundedLegacy" | "dailyRollup";
1910
+ coverage: {
1911
+ availableFrom: number | null;
1912
+ availableThrough: number | null;
1913
+ generation: number | null;
1914
+ retainedBefore: number | null;
1915
+ state: "complete" | "partial" | "retained" | "unavailable";
1916
+ };
1917
+ limits: {
1918
+ routesPerDay: number;
1919
+ rows: number;
1920
+ transitionSlots: number;
1921
+ };
1922
+ range: {
1923
+ boundary: "inclusive";
1924
+ from: number;
1925
+ timezone: "UTC";
1926
+ to: number;
1927
+ };
1928
+ visitors: {
1929
+ basis: "estimatedUnique";
1930
+ exact: boolean;
1931
+ };
1932
+ }, {
1933
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1934
+ coverage: import("convex/values").VObject<{
1935
+ availableFrom: number | null;
1936
+ availableThrough: number | null;
1937
+ generation: number | null;
1938
+ retainedBefore: number | null;
1939
+ state: "complete" | "partial" | "retained" | "unavailable";
1940
+ }, {
1941
+ 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>;
1942
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1943
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1944
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1945
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1946
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1947
+ range: import("convex/values").VObject<{
1948
+ boundary: "inclusive";
1949
+ from: number;
1950
+ timezone: "UTC";
1951
+ to: number;
1952
+ }, {
1953
+ from: import("convex/values").VFloat64<number, "required">;
1954
+ to: import("convex/values").VFloat64<number, "required">;
1955
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1956
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1957
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1958
+ visitors: import("convex/values").VObject<{
1959
+ basis: "estimatedUnique";
1960
+ exact: boolean;
1961
+ }, {
1962
+ basis: import("convex/values").VLiteral<"estimatedUnique", "required">;
1963
+ exact: import("convex/values").VBoolean<boolean, "required">;
1964
+ }, "required", "basis" | "exact">;
1965
+ limits: import("convex/values").VObject<{
1966
+ routesPerDay: number;
1967
+ rows: number;
1968
+ transitionSlots: number;
1969
+ }, {
1970
+ routesPerDay: import("convex/values").VFloat64<number, "required">;
1971
+ transitionSlots: import("convex/values").VFloat64<number, "required">;
1972
+ rows: import("convex/values").VFloat64<number, "required">;
1973
+ }, "required", "routesPerDay" | "rows" | "transitionSlots">;
1974
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "limits" | "limits.routesPerDay" | "limits.rows" | "limits.transitionSlots" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "visitors" | "visitors.basis" | "visitors.exact">;
1975
+ }, "required", "from" | "metadata" | "metadata.basis" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.limits" | "metadata.limits.routesPerDay" | "metadata.limits.rows" | "metadata.limits.transitionSlots" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.visitors" | "metadata.visitors.basis" | "metadata.visitors.exact" | "routes" | "to" | "transitions" | "truncated" | "truncated.routes" | "truncated.transitions" | "window" | "window.from" | "window.to">;
416
1976
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
417
1977
  authorize: AnalyticsAuthorizer;
418
1978
  }): {
@@ -474,6 +2034,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
474
2034
  latitude?: number | undefined;
475
2035
  longitude?: number | undefined;
476
2036
  os?: string | undefined;
2037
+ visitorKey?: string | undefined;
477
2038
  } | undefined;
478
2039
  events: {
479
2040
  affiliateSlug?: string | undefined;
@@ -489,7 +2050,8 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
489
2050
  sessionId: string;
490
2051
  target?: string | undefined;
491
2052
  timestamp: number;
492
- type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview";
2053
+ type: "click" | "conversion" | "custom" | "heartbeat" | "leave" | "outbound" | "pageview" | "vital";
2054
+ value?: number | undefined;
493
2055
  visitorId: string;
494
2056
  }[];
495
2057
  origin: string;
@@ -515,6 +2077,14 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
515
2077
  duplicates: number;
516
2078
  rejected: number;
517
2079
  }>>;
2080
+ linkVisitor: import("convex/server").RegisteredMutation<"public", {
2081
+ previousVisitorId: string;
2082
+ siteId: string;
2083
+ visitorId: string;
2084
+ }, Promise<{
2085
+ aliasCount: number;
2086
+ linked: boolean;
2087
+ }>>;
518
2088
  overview: import("convex/server").RegisteredQuery<"public", {
519
2089
  from: number;
520
2090
  interval?: "day" | "hour" | undefined;
@@ -524,6 +2094,44 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
524
2094
  currency: string;
525
2095
  from: number;
526
2096
  interval: "hour" | "day";
2097
+ metadata: {
2098
+ breakdowns: {
2099
+ topBrowsers: "eventVolume";
2100
+ topCampaigns: "eventVolume";
2101
+ topCountries: "eventVolume";
2102
+ topDevices: "eventVolume";
2103
+ topEvents: "eventVolume";
2104
+ topGoals: "goalCompletionVolume";
2105
+ topPages: "eventVolume";
2106
+ topSources: "eventVolume";
2107
+ };
2108
+ coverage: {
2109
+ availableFrom: number | null;
2110
+ availableThrough: number | null;
2111
+ generation: number | null;
2112
+ retainedBefore: number | null;
2113
+ state: "complete" | "partial" | "retained" | "unavailable";
2114
+ };
2115
+ features: {
2116
+ botDetection: "userAgent";
2117
+ errorInsights: "unsupported";
2118
+ outboundLinks: "eventVolume";
2119
+ sessionReplay: "unsupported";
2120
+ };
2121
+ range: {
2122
+ boundary: "inclusive";
2123
+ from: number;
2124
+ timezone: "UTC";
2125
+ to: number;
2126
+ };
2127
+ visitors: {
2128
+ basis: "estimatedUnique" | "bucketOccurrences";
2129
+ exact: boolean;
2130
+ legacyIncomplete: boolean;
2131
+ precision: number | null;
2132
+ sketchVersion: number | null;
2133
+ };
2134
+ };
527
2135
  timeSeries: Array<{
528
2136
  clicks: number;
529
2137
  conversions: number;
@@ -542,6 +2150,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
542
2150
  revenueCents: number;
543
2151
  value: string;
544
2152
  }>;
2153
+ topCampaigns: Array<{
2154
+ count: number;
2155
+ revenueCents: number;
2156
+ value: string;
2157
+ }>;
545
2158
  topCountries: Array<{
546
2159
  count: number;
547
2160
  revenueCents: number;
@@ -600,9 +2213,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
600
2213
  lastSeenAt: number;
601
2214
  latitude?: number;
602
2215
  longitude?: number;
2216
+ movedAt?: number;
603
2217
  os: string;
604
2218
  pageviewCount: number;
605
2219
  path: string;
2220
+ previousPath?: string;
606
2221
  sessionId: string;
607
2222
  siteId: string;
608
2223
  source: string;
@@ -656,6 +2271,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
656
2271
  utmMedium?: string;
657
2272
  utmSource?: string;
658
2273
  visitorId: string;
2274
+ visitorKey?: string;
659
2275
  }>;
660
2276
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
661
2277
  splitCursor?: string | null;
@@ -700,7 +2316,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
700
2316
  siteId: string;
701
2317
  target?: string;
702
2318
  timestamp: number;
703
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2319
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
704
2320
  visitorId: string;
705
2321
  }>;
706
2322
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -773,7 +2389,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
773
2389
  siteId: string;
774
2390
  target?: string;
775
2391
  timestamp: number;
776
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2392
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
777
2393
  visitorId: string;
778
2394
  }[]>>;
779
2395
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -795,6 +2411,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
795
2411
  updatedAt: number;
796
2412
  valueCents: number;
797
2413
  }>;
2414
+ metadata: {
2415
+ basis: "dailyRollup" | "boundedLegacy";
2416
+ coverage: {
2417
+ availableFrom: number | null;
2418
+ availableThrough: number | null;
2419
+ generation: number | null;
2420
+ retainedBefore: number | null;
2421
+ state: "complete" | "partial" | "retained" | "unavailable";
2422
+ };
2423
+ range: {
2424
+ boundary: "inclusive";
2425
+ from: number;
2426
+ timezone: "UTC";
2427
+ to: number;
2428
+ };
2429
+ };
798
2430
  truncated: boolean;
799
2431
  }>>;
800
2432
  funnelsReport: import("convex/server").RegisteredQuery<"public", {
@@ -808,6 +2440,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
808
2440
  conversionWindowMs: number;
809
2441
  createdAt: number;
810
2442
  key: string;
2443
+ metadata: {
2444
+ basis: "dailyRollup" | "boundedLegacy";
2445
+ coverage: {
2446
+ availableFrom: number | null;
2447
+ availableThrough: number | null;
2448
+ generation: number | null;
2449
+ retainedBefore: number | null;
2450
+ state: "complete" | "partial" | "retained" | "unavailable";
2451
+ };
2452
+ range: {
2453
+ boundary: "inclusive";
2454
+ from: number;
2455
+ timezone: "UTC";
2456
+ to: number;
2457
+ };
2458
+ };
811
2459
  name: string;
812
2460
  siteId: string;
813
2461
  steps: Array<{
@@ -846,11 +2494,208 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
846
2494
  updatedAt: number;
847
2495
  visits: number;
848
2496
  }>;
2497
+ metadata: {
2498
+ basis: "dailyRollup" | "boundedLegacy";
2499
+ coverage: {
2500
+ availableFrom: number | null;
2501
+ availableThrough: number | null;
2502
+ generation: number | null;
2503
+ retainedBefore: number | null;
2504
+ state: "complete" | "partial" | "retained" | "unavailable";
2505
+ };
2506
+ range: {
2507
+ boundary: "inclusive";
2508
+ from: number;
2509
+ timezone: "UTC";
2510
+ to: number;
2511
+ };
2512
+ uniqueVisitors: {
2513
+ basis: "estimatedUnique" | "exactLegacy";
2514
+ exact: boolean;
2515
+ };
2516
+ };
849
2517
  truncated: boolean;
850
2518
  }>>;
851
- upsertGoal: import("convex/server").RegisteredMutation<"public", {
852
- active?: boolean | undefined;
853
- goalId?: string | undefined;
2519
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2520
+ from: number;
2521
+ siteId: string;
2522
+ to: number;
2523
+ }, Promise<{
2524
+ metadata: {
2525
+ basis: "dailyRollup" | "boundedLegacy";
2526
+ coverage: {
2527
+ availableFrom: number | null;
2528
+ availableThrough: number | null;
2529
+ generation: number | null;
2530
+ retainedBefore: number | null;
2531
+ state: "complete" | "partial" | "retained" | "unavailable";
2532
+ };
2533
+ range: {
2534
+ boundary: "inclusive";
2535
+ from: number;
2536
+ timezone: "UTC";
2537
+ to: number;
2538
+ };
2539
+ };
2540
+ metrics: Array<{
2541
+ average: number;
2542
+ count: number;
2543
+ devices: Array<{
2544
+ average: number;
2545
+ count: number;
2546
+ device: string;
2547
+ good: number;
2548
+ needsImprovement: number;
2549
+ p75: number;
2550
+ poor: number;
2551
+ }>;
2552
+ good: number;
2553
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2554
+ needsImprovement: number;
2555
+ p75: number;
2556
+ pages: Array<{
2557
+ average: number;
2558
+ count: number;
2559
+ good: number;
2560
+ needsImprovement: number;
2561
+ p75: number;
2562
+ page: string;
2563
+ poor: number;
2564
+ }>;
2565
+ poor: number;
2566
+ timeSeries: Array<{
2567
+ count: number;
2568
+ p75: number;
2569
+ timestamp: number;
2570
+ }>;
2571
+ }>;
2572
+ truncated: boolean;
2573
+ }>>;
2574
+ siteMap: import("convex/server").RegisteredQuery<"public", {
2575
+ from: number;
2576
+ siteIds: string[];
2577
+ to: number;
2578
+ }, Promise<{
2579
+ from: number;
2580
+ metadata: {
2581
+ basis: "dailyRollup" | "boundedLegacy";
2582
+ coverage: {
2583
+ availableFrom: number | null;
2584
+ availableThrough: number | null;
2585
+ generation: number | null;
2586
+ retainedBefore: number | null;
2587
+ state: "complete" | "partial" | "retained" | "unavailable";
2588
+ };
2589
+ limits: {
2590
+ routesPerDay: number;
2591
+ rows: number;
2592
+ transitionSlots: number;
2593
+ };
2594
+ range: {
2595
+ boundary: "inclusive";
2596
+ from: number;
2597
+ timezone: "UTC";
2598
+ to: number;
2599
+ };
2600
+ visitors: {
2601
+ basis: "estimatedUnique";
2602
+ exact: boolean;
2603
+ };
2604
+ };
2605
+ routes: Array<{
2606
+ bounces: number;
2607
+ daily: Array<{
2608
+ bucketStart: number;
2609
+ pageviews: number;
2610
+ }>;
2611
+ dwellMs: number;
2612
+ dwellSamples: number;
2613
+ entries: number;
2614
+ exits: number;
2615
+ pageviews: number;
2616
+ route: string;
2617
+ transitionsIn: number;
2618
+ transitionsOut: number;
2619
+ visitors: number;
2620
+ }>;
2621
+ to: number;
2622
+ transitions: Array<{
2623
+ count: number;
2624
+ from: string;
2625
+ to: string;
2626
+ }>;
2627
+ truncated: {
2628
+ routes: boolean;
2629
+ transitions: boolean;
2630
+ };
2631
+ window: {
2632
+ from: number;
2633
+ to: number;
2634
+ } | null;
2635
+ }>>;
2636
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
2637
+ from: number;
2638
+ siteId: string;
2639
+ to: number;
2640
+ }, Promise<{
2641
+ datasets: Array<{
2642
+ coverage: {
2643
+ availableFrom: number | null;
2644
+ availableThrough: number | null;
2645
+ generation: number | null;
2646
+ retainedBefore: number | null;
2647
+ state: "complete" | "partial" | "retained" | "unavailable";
2648
+ };
2649
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
2650
+ }>;
2651
+ from: number;
2652
+ siteId: string;
2653
+ to: number;
2654
+ }>>;
2655
+ retentionStatus: import("convex/server").RegisteredQuery<"public", {
2656
+ siteId: string;
2657
+ }, Promise<{
2658
+ backlog: number;
2659
+ jobs: Array<{
2660
+ before: number;
2661
+ deleted: number;
2662
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
2663
+ scheduledAt: number | null;
2664
+ status: "pending" | "running" | "complete";
2665
+ updatedAt: number;
2666
+ }>;
2667
+ policy: {
2668
+ aggregatesDays: number;
2669
+ conversionsDays: number;
2670
+ eventsDays: number;
2671
+ reportsDays: number;
2672
+ sessionsDays: number;
2673
+ updatedAt: number;
2674
+ } | null;
2675
+ }>>;
2676
+ setRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2677
+ aggregatesDays: number;
2678
+ conversionsDays: number;
2679
+ eventsDays: number;
2680
+ reportsDays: number;
2681
+ sessionsDays: number;
2682
+ siteId: string;
2683
+ }, Promise<null>>;
2684
+ disableRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2685
+ siteId: string;
2686
+ }, Promise<null>>;
2687
+ runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2688
+ batchSize?: number | undefined;
2689
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "siteMapRollups" | "vitalRollups";
2690
+ siteId: string;
2691
+ }, Promise<{
2692
+ before: number;
2693
+ deleted: number;
2694
+ hasMore: boolean;
2695
+ }>>;
2696
+ upsertGoal: import("convex/server").RegisteredMutation<"public", {
2697
+ active?: boolean | undefined;
2698
+ goalId?: string | undefined;
854
2699
  key: string;
855
2700
  matchType: "custom" | "pageview";
856
2701
  matchValue: string;
@@ -942,16 +2787,620 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
942
2787
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
943
2788
  batchSize?: number | undefined;
944
2789
  before: number;
945
- kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2790
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
946
2791
  siteId: string;
947
2792
  }, Promise<{
2793
+ before: number;
948
2794
  deleted: number;
949
2795
  hasMore: boolean;
950
2796
  }>>;
951
2797
  };
2798
+ /** Exposes only the reactive read surface used by a federated Rastro dashboard. */
2799
+ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, options: FederatedAnalyticsAuthorizerOptions): {
2800
+ manifest: import("convex/server").RegisteredQuery<"public", {}, {
2801
+ protocol: "amage-rastro-analytics";
2802
+ protocolVersion: 1;
2803
+ moduleName: "rastroFederation";
2804
+ functions: {
2805
+ manifest: "manifest";
2806
+ connectionStatus: "connectionStatus";
2807
+ listSites: "listSites";
2808
+ overview: "overview";
2809
+ liveVisitors: "liveVisitors";
2810
+ listSessions: "listSessions";
2811
+ sessionJourney: "sessionJourney";
2812
+ listConversions: "listConversions";
2813
+ visitorJourney: "visitorJourney";
2814
+ goalsReport: "goalsReport";
2815
+ funnelsReport: "funnelsReport";
2816
+ affiliatesReport: "affiliatesReport";
2817
+ dataCoverage: "dataCoverage";
2818
+ vitalsReport: "vitalsReport";
2819
+ siteMap: "siteMap";
2820
+ };
2821
+ capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
2822
+ limits: {
2823
+ maxSitesPerRequest: 10;
2824
+ maxSitesPerConnection: 10;
2825
+ maxReportRangeDays: 366;
2826
+ maxLiveVisitors: 500;
2827
+ maxJourneyEvents: 500;
2828
+ };
2829
+ }>;
2830
+ connectionStatus: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedAnalyticsConnectionStatus>>;
2831
+ listSites: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedSiteSummary[]>>;
2832
+ overview: import("convex/server").RegisteredQuery<"public", {
2833
+ from: number;
2834
+ interval?: "day" | "hour" | undefined;
2835
+ siteIds: string[];
2836
+ to: number;
2837
+ }, Promise<{
2838
+ currency: string;
2839
+ from: number;
2840
+ interval: "hour" | "day";
2841
+ metadata: {
2842
+ breakdowns: {
2843
+ topBrowsers: "eventVolume";
2844
+ topCampaigns: "eventVolume";
2845
+ topCountries: "eventVolume";
2846
+ topDevices: "eventVolume";
2847
+ topEvents: "eventVolume";
2848
+ topGoals: "goalCompletionVolume";
2849
+ topPages: "eventVolume";
2850
+ topSources: "eventVolume";
2851
+ };
2852
+ coverage: {
2853
+ availableFrom: number | null;
2854
+ availableThrough: number | null;
2855
+ generation: number | null;
2856
+ retainedBefore: number | null;
2857
+ state: "complete" | "partial" | "retained" | "unavailable";
2858
+ };
2859
+ features: {
2860
+ botDetection: "userAgent";
2861
+ errorInsights: "unsupported";
2862
+ outboundLinks: "eventVolume";
2863
+ sessionReplay: "unsupported";
2864
+ };
2865
+ range: {
2866
+ boundary: "inclusive";
2867
+ from: number;
2868
+ timezone: "UTC";
2869
+ to: number;
2870
+ };
2871
+ visitors: {
2872
+ basis: "estimatedUnique" | "bucketOccurrences";
2873
+ exact: boolean;
2874
+ legacyIncomplete: boolean;
2875
+ precision: number | null;
2876
+ sketchVersion: number | null;
2877
+ };
2878
+ };
2879
+ timeSeries: Array<{
2880
+ clicks: number;
2881
+ conversions: number;
2882
+ customEvents: number;
2883
+ events: number;
2884
+ outboundClicks: number;
2885
+ pageviews: number;
2886
+ revenueCents: number;
2887
+ sessions: number;
2888
+ timestamp: number;
2889
+ visitors: number;
2890
+ }>;
2891
+ to: number;
2892
+ topBrowsers: Array<{
2893
+ count: number;
2894
+ revenueCents: number;
2895
+ value: string;
2896
+ }>;
2897
+ topCampaigns: Array<{
2898
+ count: number;
2899
+ revenueCents: number;
2900
+ value: string;
2901
+ }>;
2902
+ topCountries: Array<{
2903
+ count: number;
2904
+ revenueCents: number;
2905
+ value: string;
2906
+ }>;
2907
+ topDevices: Array<{
2908
+ count: number;
2909
+ revenueCents: number;
2910
+ value: string;
2911
+ }>;
2912
+ topEvents: Array<{
2913
+ count: number;
2914
+ revenueCents: number;
2915
+ value: string;
2916
+ }>;
2917
+ topGoals: Array<{
2918
+ count: number;
2919
+ revenueCents: number;
2920
+ value: string;
2921
+ }>;
2922
+ topPages: Array<{
2923
+ count: number;
2924
+ revenueCents: number;
2925
+ value: string;
2926
+ }>;
2927
+ topSources: Array<{
2928
+ count: number;
2929
+ revenueCents: number;
2930
+ value: string;
2931
+ }>;
2932
+ totals: {
2933
+ clicks: number;
2934
+ conversions: number;
2935
+ customEvents: number;
2936
+ events: number;
2937
+ outboundClicks: number;
2938
+ pageviews: number;
2939
+ revenueCents: number;
2940
+ sessions: number;
2941
+ visitors: number;
2942
+ };
2943
+ }>>;
2944
+ liveVisitors: import("convex/server").RegisteredQuery<"public", {
2945
+ limit?: number | undefined;
2946
+ now: number;
2947
+ siteIds: string[];
2948
+ }, Promise<{
2949
+ _creationTime: number;
2950
+ _id: string;
2951
+ browser: string;
2952
+ city?: string;
2953
+ country?: string;
2954
+ device: string;
2955
+ eventCount: number;
2956
+ expiresAt: number;
2957
+ lastSeenAt: number;
2958
+ latitude?: number;
2959
+ longitude?: number;
2960
+ movedAt?: number;
2961
+ os: string;
2962
+ pageviewCount: number;
2963
+ path: string;
2964
+ previousPath?: string;
2965
+ sessionId: string;
2966
+ siteId: string;
2967
+ source: string;
2968
+ startedAt: number;
2969
+ visitorId: string;
2970
+ }[]>>;
2971
+ listSessions: import("convex/server").RegisteredQuery<"public", {
2972
+ from: number;
2973
+ paginationOpts: {
2974
+ id?: number;
2975
+ endCursor?: string | null;
2976
+ maximumRowsRead?: number;
2977
+ maximumBytesRead?: number;
2978
+ numItems: number;
2979
+ cursor: string | null;
2980
+ };
2981
+ siteId: string;
2982
+ to: number;
2983
+ }, Promise<{
2984
+ continueCursor: string;
2985
+ isDone: boolean;
2986
+ page: Array<{
2987
+ _creationTime: number;
2988
+ _id: string;
2989
+ affiliateAttributedAt?: number;
2990
+ affiliateExpiresAt?: number;
2991
+ affiliateId?: string;
2992
+ affiliateSlug?: string;
2993
+ browser: string;
2994
+ city?: string;
2995
+ conversionCount: number;
2996
+ country?: string;
2997
+ currency?: string;
2998
+ device: string;
2999
+ durationMs: number;
3000
+ entryPath: string;
3001
+ eventCount: number;
3002
+ exitPath: string;
3003
+ lastSeenAt: number;
3004
+ latitude?: number;
3005
+ longitude?: number;
3006
+ os: string;
3007
+ pageviewCount: number;
3008
+ referrer?: string;
3009
+ revenueCents: number;
3010
+ sessionId: string;
3011
+ siteId: string;
3012
+ source: string;
3013
+ startedAt: number;
3014
+ utmCampaign?: string;
3015
+ utmMedium?: string;
3016
+ utmSource?: string;
3017
+ visitorId: string;
3018
+ visitorKey?: string;
3019
+ }>;
3020
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3021
+ splitCursor?: string | null;
3022
+ }>>;
3023
+ sessionJourney: import("convex/server").RegisteredQuery<"public", {
3024
+ from: number;
3025
+ paginationOpts: {
3026
+ id?: number;
3027
+ endCursor?: string | null;
3028
+ maximumRowsRead?: number;
3029
+ maximumBytesRead?: number;
3030
+ numItems: number;
3031
+ cursor: string | null;
3032
+ };
3033
+ sessionId: string;
3034
+ siteId: string;
3035
+ to: number;
3036
+ }, Promise<{
3037
+ continueCursor: string;
3038
+ isDone: boolean;
3039
+ page: Array<{
3040
+ _creationTime: number;
3041
+ _id: string;
3042
+ affiliateSlug?: string;
3043
+ browser: string;
3044
+ city?: string;
3045
+ country?: string;
3046
+ currency?: string;
3047
+ device: string;
3048
+ eventId: string;
3049
+ href?: string;
3050
+ latitude?: number;
3051
+ longitude?: number;
3052
+ name?: string;
3053
+ os: string;
3054
+ path: string;
3055
+ properties?: Record<string, string | number | boolean | null>;
3056
+ referrer?: string;
3057
+ revenueCents?: number;
3058
+ sequence: number;
3059
+ sessionId: string;
3060
+ siteId: string;
3061
+ target?: string;
3062
+ timestamp: number;
3063
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
3064
+ visitorId: string;
3065
+ }>;
3066
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3067
+ splitCursor?: string | null;
3068
+ }>>;
3069
+ listConversions: import("convex/server").RegisteredQuery<"public", {
3070
+ from: number;
3071
+ paginationOpts: {
3072
+ id?: number;
3073
+ endCursor?: string | null;
3074
+ maximumRowsRead?: number;
3075
+ maximumBytesRead?: number;
3076
+ numItems: number;
3077
+ cursor: string | null;
3078
+ };
3079
+ siteId: string;
3080
+ to: number;
3081
+ }, Promise<{
3082
+ continueCursor: string;
3083
+ isDone: boolean;
3084
+ page: Array<{
3085
+ _creationTime: number;
3086
+ _id: string;
3087
+ affiliateAttributedAt?: number;
3088
+ affiliateExpiresAt?: number;
3089
+ affiliateId?: string;
3090
+ affiliateSlug?: string;
3091
+ commissionCents: number;
3092
+ currency: string;
3093
+ eventId: string;
3094
+ goalKey?: string;
3095
+ path: string;
3096
+ revenueCents: number;
3097
+ sessionId: string;
3098
+ siteId: string;
3099
+ source: "tracker" | "trusted";
3100
+ timestamp: number;
3101
+ visitorId: string;
3102
+ }>;
3103
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3104
+ splitCursor?: string | null;
3105
+ }>>;
3106
+ visitorJourney: import("convex/server").RegisteredQuery<"public", {
3107
+ from: number;
3108
+ limit?: number | undefined;
3109
+ siteIds: string[];
3110
+ to: number;
3111
+ visitorId: string;
3112
+ }, Promise<{
3113
+ _creationTime: number;
3114
+ _id: string;
3115
+ affiliateSlug?: string;
3116
+ browser: string;
3117
+ city?: string;
3118
+ country?: string;
3119
+ currency?: string;
3120
+ device: string;
3121
+ eventId: string;
3122
+ href?: string;
3123
+ latitude?: number;
3124
+ longitude?: number;
3125
+ name?: string;
3126
+ os: string;
3127
+ path: string;
3128
+ properties?: Record<string, string | number | boolean | null>;
3129
+ referrer?: string;
3130
+ revenueCents?: number;
3131
+ sequence: number;
3132
+ sessionId: string;
3133
+ siteId: string;
3134
+ target?: string;
3135
+ timestamp: number;
3136
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
3137
+ visitorId: string;
3138
+ }[]>>;
3139
+ goalsReport: import("convex/server").RegisteredQuery<"public", {
3140
+ from: number;
3141
+ siteId: string;
3142
+ to: number;
3143
+ }, Promise<{
3144
+ goals: Array<{
3145
+ _creationTime: number;
3146
+ _id: string;
3147
+ active: boolean;
3148
+ completions: number;
3149
+ createdAt: number;
3150
+ key: string;
3151
+ matchType: "pageview" | "custom";
3152
+ matchValue: string;
3153
+ name: string;
3154
+ siteId: string;
3155
+ updatedAt: number;
3156
+ valueCents: number;
3157
+ }>;
3158
+ metadata: {
3159
+ basis: "dailyRollup" | "boundedLegacy";
3160
+ coverage: {
3161
+ availableFrom: number | null;
3162
+ availableThrough: number | null;
3163
+ generation: number | null;
3164
+ retainedBefore: number | null;
3165
+ state: "complete" | "partial" | "retained" | "unavailable";
3166
+ };
3167
+ range: {
3168
+ boundary: "inclusive";
3169
+ from: number;
3170
+ timezone: "UTC";
3171
+ to: number;
3172
+ };
3173
+ };
3174
+ truncated: boolean;
3175
+ }>>;
3176
+ funnelsReport: import("convex/server").RegisteredQuery<"public", {
3177
+ from: number;
3178
+ siteId: string;
3179
+ to: number;
3180
+ }, Promise<{
3181
+ _creationTime: number;
3182
+ _id: string;
3183
+ active: boolean;
3184
+ conversionWindowMs: number;
3185
+ createdAt: number;
3186
+ key: string;
3187
+ metadata: {
3188
+ basis: "dailyRollup" | "boundedLegacy";
3189
+ coverage: {
3190
+ availableFrom: number | null;
3191
+ availableThrough: number | null;
3192
+ generation: number | null;
3193
+ retainedBefore: number | null;
3194
+ state: "complete" | "partial" | "retained" | "unavailable";
3195
+ };
3196
+ range: {
3197
+ boundary: "inclusive";
3198
+ from: number;
3199
+ timezone: "UTC";
3200
+ to: number;
3201
+ };
3202
+ };
3203
+ name: string;
3204
+ siteId: string;
3205
+ steps: Array<{
3206
+ name: string;
3207
+ type: "pageview" | "custom";
3208
+ value: string;
3209
+ }>;
3210
+ stepsReport: Array<{
3211
+ completions: number;
3212
+ entrants: number;
3213
+ name: string;
3214
+ step: number;
3215
+ }>;
3216
+ truncated: boolean;
3217
+ updatedAt: number;
3218
+ }[]>>;
3219
+ affiliatesReport: import("convex/server").RegisteredQuery<"public", {
3220
+ from: number;
3221
+ siteId: string;
3222
+ to: number;
3223
+ }, Promise<{
3224
+ affiliates: Array<{
3225
+ _creationTime: number;
3226
+ _id: string;
3227
+ active: boolean;
3228
+ attributionWindowDays: number;
3229
+ commissionBps: number;
3230
+ commissionCents: number;
3231
+ conversions: number;
3232
+ createdAt: number;
3233
+ name: string;
3234
+ revenueCents: number;
3235
+ siteId: string;
3236
+ slug: string;
3237
+ uniqueVisitors: number;
3238
+ updatedAt: number;
3239
+ visits: number;
3240
+ }>;
3241
+ metadata: {
3242
+ basis: "dailyRollup" | "boundedLegacy";
3243
+ coverage: {
3244
+ availableFrom: number | null;
3245
+ availableThrough: number | null;
3246
+ generation: number | null;
3247
+ retainedBefore: number | null;
3248
+ state: "complete" | "partial" | "retained" | "unavailable";
3249
+ };
3250
+ range: {
3251
+ boundary: "inclusive";
3252
+ from: number;
3253
+ timezone: "UTC";
3254
+ to: number;
3255
+ };
3256
+ uniqueVisitors: {
3257
+ basis: "estimatedUnique" | "exactLegacy";
3258
+ exact: boolean;
3259
+ };
3260
+ };
3261
+ truncated: boolean;
3262
+ }>>;
3263
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
3264
+ from: number;
3265
+ siteId: string;
3266
+ to: number;
3267
+ }, Promise<{
3268
+ metadata: {
3269
+ basis: "dailyRollup" | "boundedLegacy";
3270
+ coverage: {
3271
+ availableFrom: number | null;
3272
+ availableThrough: number | null;
3273
+ generation: number | null;
3274
+ retainedBefore: number | null;
3275
+ state: "complete" | "partial" | "retained" | "unavailable";
3276
+ };
3277
+ range: {
3278
+ boundary: "inclusive";
3279
+ from: number;
3280
+ timezone: "UTC";
3281
+ to: number;
3282
+ };
3283
+ };
3284
+ metrics: Array<{
3285
+ average: number;
3286
+ count: number;
3287
+ devices: Array<{
3288
+ average: number;
3289
+ count: number;
3290
+ device: string;
3291
+ good: number;
3292
+ needsImprovement: number;
3293
+ p75: number;
3294
+ poor: number;
3295
+ }>;
3296
+ good: number;
3297
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
3298
+ needsImprovement: number;
3299
+ p75: number;
3300
+ pages: Array<{
3301
+ average: number;
3302
+ count: number;
3303
+ good: number;
3304
+ needsImprovement: number;
3305
+ p75: number;
3306
+ page: string;
3307
+ poor: number;
3308
+ }>;
3309
+ poor: number;
3310
+ timeSeries: Array<{
3311
+ count: number;
3312
+ p75: number;
3313
+ timestamp: number;
3314
+ }>;
3315
+ }>;
3316
+ truncated: boolean;
3317
+ }>>;
3318
+ siteMap: import("convex/server").RegisteredQuery<"public", {
3319
+ from: number;
3320
+ siteIds: string[];
3321
+ to: number;
3322
+ }, Promise<{
3323
+ from: number;
3324
+ metadata: {
3325
+ basis: "dailyRollup" | "boundedLegacy";
3326
+ coverage: {
3327
+ availableFrom: number | null;
3328
+ availableThrough: number | null;
3329
+ generation: number | null;
3330
+ retainedBefore: number | null;
3331
+ state: "complete" | "partial" | "retained" | "unavailable";
3332
+ };
3333
+ limits: {
3334
+ routesPerDay: number;
3335
+ rows: number;
3336
+ transitionSlots: number;
3337
+ };
3338
+ range: {
3339
+ boundary: "inclusive";
3340
+ from: number;
3341
+ timezone: "UTC";
3342
+ to: number;
3343
+ };
3344
+ visitors: {
3345
+ basis: "estimatedUnique";
3346
+ exact: boolean;
3347
+ };
3348
+ };
3349
+ routes: Array<{
3350
+ bounces: number;
3351
+ daily: Array<{
3352
+ bucketStart: number;
3353
+ pageviews: number;
3354
+ }>;
3355
+ dwellMs: number;
3356
+ dwellSamples: number;
3357
+ entries: number;
3358
+ exits: number;
3359
+ pageviews: number;
3360
+ route: string;
3361
+ transitionsIn: number;
3362
+ transitionsOut: number;
3363
+ visitors: number;
3364
+ }>;
3365
+ to: number;
3366
+ transitions: Array<{
3367
+ count: number;
3368
+ from: string;
3369
+ to: string;
3370
+ }>;
3371
+ truncated: {
3372
+ routes: boolean;
3373
+ transitions: boolean;
3374
+ };
3375
+ window: {
3376
+ from: number;
3377
+ to: number;
3378
+ } | null;
3379
+ }>>;
3380
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
3381
+ from: number;
3382
+ siteId: string;
3383
+ to: number;
3384
+ }, Promise<{
3385
+ datasets: Array<{
3386
+ coverage: {
3387
+ availableFrom: number | null;
3388
+ availableThrough: number | null;
3389
+ generation: number | null;
3390
+ retainedBefore: number | null;
3391
+ state: "complete" | "partial" | "retained" | "unavailable";
3392
+ };
3393
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
3394
+ }>;
3395
+ from: number;
3396
+ siteId: string;
3397
+ to: number;
3398
+ }>>;
3399
+ };
952
3400
  export declare function componentHttpPaths(prefix?: string): {
953
3401
  readonly events: `${string}/events`;
954
3402
  readonly tracker: `${string}/tracker.js`;
3403
+ readonly vitals: `${string}/vitals.js`;
955
3404
  readonly health: `${string}/health`;
956
3405
  };
957
3406
  type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;