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

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 (179) hide show
  1. package/README.md +693 -69
  2. package/agent/integration.md +801 -0
  3. package/agent/manifest.json +205 -0
  4. package/agent/manifest.schema.json +444 -0
  5. package/dist/client/federation.d.ts +381 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +274 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +2673 -15
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +565 -33
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +22 -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 +315 -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 +28 -1
  29. package/dist/component/constants.d.ts.map +1 -1
  30. package/dist/component/constants.js +44 -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 +27 -0
  36. package/dist/component/coverage.d.ts.map +1 -0
  37. package/dist/component/coverage.js +56 -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 +73 -0
  54. package/dist/component/geo.d.ts.map +1 -0
  55. package/dist/component/geo.js +648 -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 +281 -62
  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 +498 -95
  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/localTime.d.ts +25 -0
  77. package/dist/component/localTime.d.ts.map +1 -0
  78. package/dist/component/localTime.js +126 -0
  79. package/dist/component/localTime.js.map +1 -0
  80. package/dist/component/reports.d.ts +266 -10
  81. package/dist/component/reports.d.ts.map +1 -1
  82. package/dist/component/reports.js +1243 -137
  83. package/dist/component/reports.js.map +1 -1
  84. package/dist/component/retention.d.ts +75 -1
  85. package/dist/component/retention.d.ts.map +1 -1
  86. package/dist/component/retention.js +561 -38
  87. package/dist/component/retention.js.map +1 -1
  88. package/dist/component/rollupStore.d.ts +320 -0
  89. package/dist/component/rollupStore.d.ts.map +1 -0
  90. package/dist/component/rollupStore.js +596 -0
  91. package/dist/component/rollupStore.js.map +1 -0
  92. package/dist/component/rollups.d.ts +20 -0
  93. package/dist/component/rollups.d.ts.map +1 -0
  94. package/dist/component/rollups.js +73 -0
  95. package/dist/component/rollups.js.map +1 -0
  96. package/dist/component/sanitize.d.ts +24 -1
  97. package/dist/component/sanitize.d.ts.map +1 -1
  98. package/dist/component/sanitize.js +96 -16
  99. package/dist/component/sanitize.js.map +1 -1
  100. package/dist/component/schema.d.ts +687 -65
  101. package/dist/component/schema.js +187 -20
  102. package/dist/component/schema.js.map +1 -1
  103. package/dist/component/sites.d.ts +12 -0
  104. package/dist/component/sites.d.ts.map +1 -1
  105. package/dist/component/sites.js +41 -7
  106. package/dist/component/sites.js.map +1 -1
  107. package/dist/component/useragent.d.ts +9 -0
  108. package/dist/component/useragent.d.ts.map +1 -0
  109. package/dist/component/useragent.js +152 -0
  110. package/dist/component/useragent.js.map +1 -0
  111. package/dist/component/validators.d.ts +124 -69
  112. package/dist/component/validators.d.ts.map +1 -1
  113. package/dist/component/validators.js +35 -14
  114. package/dist/component/validators.js.map +1 -1
  115. package/dist/component/visitors.d.ts +19 -0
  116. package/dist/component/visitors.d.ts.map +1 -0
  117. package/dist/component/visitors.js +86 -0
  118. package/dist/component/visitors.js.map +1 -0
  119. package/dist/component/vitals.d.ts +41 -0
  120. package/dist/component/vitals.d.ts.map +1 -0
  121. package/dist/component/vitals.js +115 -0
  122. package/dist/component/vitals.js.map +1 -0
  123. package/dist/react/index.d.ts.map +1 -1
  124. package/dist/react/index.js.map +1 -1
  125. package/dist/tracker/generated.d.ts +11 -4
  126. package/dist/tracker/generated.d.ts.map +1 -1
  127. package/dist/tracker/generated.js +11 -4
  128. package/dist/tracker/generated.js.map +1 -1
  129. package/dist/tracker/tracker.d.ts +1 -1
  130. package/dist/tracker/tracker.d.ts.map +1 -1
  131. package/dist/tracker/tracker.js +57 -20
  132. package/dist/tracker/tracker.js.map +1 -1
  133. package/dist/tracker/vitals.d.ts +10 -0
  134. package/dist/tracker/vitals.d.ts.map +1 -0
  135. package/dist/tracker/vitals.js +140 -0
  136. package/dist/tracker/vitals.js.map +1 -0
  137. package/dist/tracker.min.js +1 -1
  138. package/dist/vitals.min.js +1 -0
  139. package/docs/benchmarks/2026-08-20-realistic.md +76 -76
  140. package/docs/benchmarks/2026-08-21-formal-certification.md +353 -0
  141. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  142. package/docs/federation-setup.md +464 -0
  143. package/docs/federation.md +352 -0
  144. package/docs/upgrading.md +344 -0
  145. package/llms.txt +72 -0
  146. package/package.json +55 -11
  147. package/scripts/benchmark-ingest.mjs +175 -73
  148. package/scripts/generate-federation-keys.mjs +20 -0
  149. package/src/component/_generated/api.ts +22 -0
  150. package/src/component/_generated/component.ts +381 -4
  151. package/src/component/_generated/server.ts +4 -0
  152. package/src/component/affiliates.ts +20 -5
  153. package/src/component/cardinality.ts +117 -0
  154. package/src/component/constants.ts +44 -1
  155. package/src/component/convex.config.ts +11 -1
  156. package/src/component/coverage.ts +71 -0
  157. package/src/component/diagnostics.ts +65 -0
  158. package/src/component/errors.ts +2 -1
  159. package/src/component/eventStore.ts +217 -193
  160. package/src/component/funnels.ts +19 -16
  161. package/src/component/geo.ts +835 -0
  162. package/src/component/goals.ts +29 -21
  163. package/src/component/guards.ts +3 -1
  164. package/src/component/http.ts +404 -70
  165. package/src/component/identity.ts +74 -0
  166. package/src/component/ingest.ts +894 -188
  167. package/src/component/live.ts +13 -7
  168. package/src/component/localTime.ts +167 -0
  169. package/src/component/reports.ts +1872 -197
  170. package/src/component/retention.ts +788 -96
  171. package/src/component/rollupStore.ts +799 -0
  172. package/src/component/rollups.ts +82 -0
  173. package/src/component/sanitize.ts +144 -29
  174. package/src/component/schema.ts +217 -21
  175. package/src/component/sites.ts +59 -12
  176. package/src/component/useragent.ts +171 -0
  177. package/src/component/validators.ts +49 -14
  178. package/src/component/visitors.ts +116 -0
  179. package/src/component/vitals.ts +146 -0
@@ -1,8 +1,16 @@
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 { localDayStart, nextLocalDayStart, previousLocalDayStart, } from "../component/localTime.js";
11
+ export type { VitalMetric } from "../component/vitals.js";
12
+ export { effectiveFederatedPermissions, FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS, FEDERATED_ANALYTICS_CONFIGURE_PERMISSION, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_PERMISSIONS, FEDERATED_ANALYTICS_READ_PERMISSION, FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES, FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS, federatedAnalyticsPermissionValidator, } from "./federation.js";
13
+ export type { FederatedAnalyticsCapability, FederatedAnalyticsAuthorizerOptions, FederatedAnalyticsConnection, FederatedAnalyticsConnectionStatus, FederatedAnalyticsErrorCode, FederatedAnalyticsIdentity, FederatedAnalyticsManifest, FederatedAnalyticsPermission, FederatedSiteSummary, ResolveFederatedAnalyticsConnection, } from "./federation.js";
6
14
  export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
7
15
  export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
8
16
  export type UpdateSiteInput = FunctionArgs<ComponentApi["sites"]["update"]>;
@@ -14,8 +22,10 @@ export type IngestInput = FunctionArgs<ComponentApi["ingest"]["ingestBatch"]>;
14
22
  export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatch"]>;
15
23
  export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
16
24
  export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
25
+ export type LinkVisitorInput = FunctionArgs<ComponentApi["visitors"]["link"]>;
26
+ export type LinkVisitorOutput = FunctionReturnType<ComponentApi["visitors"]["link"]>;
17
27
  export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
18
- export type Overview = FunctionReturnType<ComponentApi["reports"]["overview"]>;
28
+ export type Overview = Infer<typeof hostOverviewValidator>;
19
29
  export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
20
30
  export type LiveVisitor = FunctionReturnType<ComponentApi["reports"]["liveVisitors"]>[number];
21
31
  export type ListSessionsInput = FunctionArgs<ComponentApi["reports"]["listSessions"]>;
@@ -27,11 +37,15 @@ export type ConversionsPage = FunctionReturnType<ComponentApi["reports"]["listCo
27
37
  export type VisitorJourneyInput = FunctionArgs<ComponentApi["reports"]["visitorJourney"]>;
28
38
  export type VisitorJourney = FunctionReturnType<ComponentApi["reports"]["visitorJourney"]>;
29
39
  export type GoalsReportInput = FunctionArgs<ComponentApi["reports"]["goalsReport"]>;
30
- export type GoalsReport = FunctionReturnType<ComponentApi["reports"]["goalsReport"]>;
40
+ export type GoalsReport = Infer<typeof hostGoalsReportValidator>;
31
41
  export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsReport"]>;
32
- export type FunnelsReport = FunctionReturnType<ComponentApi["reports"]["funnelsReport"]>;
42
+ export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
33
43
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
34
- export type AffiliatesReport = FunctionReturnType<ComponentApi["reports"]["affiliatesReport"]>;
44
+ export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
45
+ export type VitalsReportInput = FunctionArgs<ComponentApi["reports"]["vitalsReport"]>;
46
+ export type VitalsReport = Infer<typeof hostVitalsReportValidator>;
47
+ export type SiteMapInput = FunctionArgs<ComponentApi["reports"]["siteMap"]>;
48
+ export type SiteMap = Infer<typeof hostSiteMapValidator>;
35
49
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
36
50
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
37
51
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -41,8 +55,66 @@ export type Funnel = FunctionReturnType<ComponentApi["funnels"]["list"]>[number]
41
55
  export type UpsertAffiliateInput = FunctionArgs<ComponentApi["affiliates"]["upsert"]>;
42
56
  export type UpsertAffiliateOutput = FunctionReturnType<ComponentApi["affiliates"]["upsert"]>;
43
57
  export type Affiliate = FunctionReturnType<ComponentApi["affiliates"]["list"]>[number];
44
- export type CleanupInput = FunctionArgs<ComponentApi["retention"]["cleanup"]>;
45
- export type CleanupOutput = FunctionReturnType<ComponentApi["retention"]["cleanup"]>;
58
+ export type CleanupInput = {
59
+ siteId: string;
60
+ kind: RetentionKind;
61
+ before: number;
62
+ batchSize?: number;
63
+ };
64
+ export type CleanupOutput = {
65
+ deleted: number;
66
+ hasMore: boolean;
67
+ before: number;
68
+ };
69
+ export type DataCoverageInput = {
70
+ siteId: string;
71
+ from: number;
72
+ to: number;
73
+ };
74
+ export type DataCoverage = {
75
+ siteId: string;
76
+ from: number;
77
+ to: number;
78
+ datasets: Array<{
79
+ dataset: "overviewHour" | "overviewDay" | "overviewLocalDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
80
+ coverage: CoverageStatus;
81
+ }>;
82
+ };
83
+ export type CoverageStatus = {
84
+ state: "complete" | "partial" | "retained" | "unavailable";
85
+ generation: number | null;
86
+ availableFrom: number | null;
87
+ availableThrough: number | null;
88
+ retainedBefore: number | null;
89
+ };
90
+ export type RetentionPolicyInput = {
91
+ siteId: string;
92
+ eventsDays: number;
93
+ sessionsDays: number;
94
+ conversionsDays: number;
95
+ aggregatesDays: number;
96
+ reportsDays: number;
97
+ };
98
+ export type RetentionStatus = {
99
+ policy: (Omit<RetentionPolicyInput, "siteId"> & {
100
+ updatedAt: number;
101
+ }) | null;
102
+ jobs: Array<{
103
+ kind: string;
104
+ before: number;
105
+ status: "pending" | "running" | "complete";
106
+ deleted: number;
107
+ scheduledAt: number | null;
108
+ updatedAt: number;
109
+ }>;
110
+ backlog: number;
111
+ };
112
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
113
+ export type RunRetentionPolicyInput = {
114
+ siteId: string;
115
+ kind: RetentionKind;
116
+ batchSize?: number;
117
+ };
46
118
  export declare class Rastro {
47
119
  private readonly component;
48
120
  constructor(component: ComponentApi);
@@ -61,6 +133,11 @@ export declare class Rastro {
61
133
  timezone?: string;
62
134
  updatedAt: number;
63
135
  } | null>;
136
+ /** The calendar days a site's daily overview answers in; see `sites.localDays`. */
137
+ localDays(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
138
+ since: number;
139
+ timezone: string;
140
+ } | null>;
64
141
  listSites(ctx: QueryCtx | MutationCtx | ActionCtx, args: ListSitesInput): Promise<{
65
142
  _creationTime: number;
66
143
  _id: string;
@@ -84,15 +161,61 @@ export declare class Rastro {
84
161
  duplicates: number;
85
162
  rejected: number;
86
163
  }>;
164
+ linkVisitor(ctx: MutationCtx, args: LinkVisitorInput): Promise<{
165
+ aliasCount: number;
166
+ linked: boolean;
167
+ }>;
87
168
  overview(ctx: QueryCtx | MutationCtx | ActionCtx, args: OverviewInput): Promise<{
88
169
  currency: string;
89
170
  from: number;
90
171
  interval: "hour" | "day";
172
+ metadata: {
173
+ breakdowns: {
174
+ topBrowsers: "pageviews" | "sessions" | "eventVolume";
175
+ topCampaigns: "pageviews" | "sessions" | "eventVolume";
176
+ topCountries: "pageviews" | "sessions" | "eventVolume";
177
+ topDevices: "pageviews" | "sessions" | "eventVolume";
178
+ topEvents: "eventVolume";
179
+ topGoals: "goalCompletionVolume";
180
+ topPages: "pageviews" | "sessions" | "eventVolume";
181
+ topSources: "pageviews" | "sessions" | "eventVolume";
182
+ };
183
+ coverage: {
184
+ availableFrom: number | null;
185
+ availableThrough: number | null;
186
+ generation: number | null;
187
+ retainedBefore: number | null;
188
+ state: "complete" | "partial" | "retained" | "unavailable";
189
+ };
190
+ engagement: "counted" | "unavailable";
191
+ features: {
192
+ botDetection: "userAgent";
193
+ errorInsights: "unsupported";
194
+ outboundLinks: "eventVolume";
195
+ sessionReplay: "unsupported";
196
+ };
197
+ range: {
198
+ boundary: "inclusive";
199
+ from: number;
200
+ timezone: string;
201
+ to: number;
202
+ };
203
+ visitors: {
204
+ basis: "estimatedUnique" | "bucketOccurrences";
205
+ exact: boolean;
206
+ legacyIncomplete: boolean;
207
+ precision: number | null;
208
+ sketchVersion: number | null;
209
+ };
210
+ };
91
211
  timeSeries: Array<{
92
212
  clicks: number;
213
+ continuedSessions: number;
93
214
  conversions: number;
94
215
  customEvents: number;
216
+ durationMs: number;
95
217
  events: number;
218
+ newVisitors: number;
96
219
  outboundClicks: number;
97
220
  pageviews: number;
98
221
  revenueCents: number;
@@ -106,6 +229,11 @@ export declare class Rastro {
106
229
  revenueCents: number;
107
230
  value: string;
108
231
  }>;
232
+ topCampaigns: Array<{
233
+ count: number;
234
+ revenueCents: number;
235
+ value: string;
236
+ }>;
109
237
  topCountries: Array<{
110
238
  count: number;
111
239
  revenueCents: number;
@@ -138,9 +266,12 @@ export declare class Rastro {
138
266
  }>;
139
267
  totals: {
140
268
  clicks: number;
269
+ continuedSessions: number;
141
270
  conversions: number;
142
271
  customEvents: number;
272
+ durationMs: number;
143
273
  events: number;
274
+ newVisitors: number;
144
275
  outboundClicks: number;
145
276
  pageviews: number;
146
277
  revenueCents: number;
@@ -160,9 +291,11 @@ export declare class Rastro {
160
291
  lastSeenAt: number;
161
292
  latitude?: number;
162
293
  longitude?: number;
294
+ movedAt?: number;
163
295
  os: string;
164
296
  pageviewCount: number;
165
297
  path: string;
298
+ previousPath?: string;
166
299
  sessionId: string;
167
300
  siteId: string;
168
301
  source: string;
@@ -204,6 +337,7 @@ export declare class Rastro {
204
337
  utmMedium?: string;
205
338
  utmSource?: string;
206
339
  visitorId: string;
340
+ visitorKey?: string;
207
341
  }>;
208
342
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
209
343
  splitCursor?: string | null;
@@ -235,7 +369,7 @@ export declare class Rastro {
235
369
  siteId: string;
236
370
  target?: string;
237
371
  timestamp: number;
238
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
372
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
239
373
  visitorId: string;
240
374
  }>;
241
375
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -290,7 +424,7 @@ export declare class Rastro {
290
424
  siteId: string;
291
425
  target?: string;
292
426
  timestamp: number;
293
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
427
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
294
428
  visitorId: string;
295
429
  }[]>;
296
430
  goalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: GoalsReportInput): Promise<{
@@ -308,6 +442,22 @@ export declare class Rastro {
308
442
  updatedAt: number;
309
443
  valueCents: number;
310
444
  }>;
445
+ metadata: {
446
+ basis: "dailyRollup" | "boundedLegacy";
447
+ coverage: {
448
+ availableFrom: number | null;
449
+ availableThrough: number | null;
450
+ generation: number | null;
451
+ retainedBefore: number | null;
452
+ state: "complete" | "partial" | "retained" | "unavailable";
453
+ };
454
+ range: {
455
+ boundary: "inclusive";
456
+ from: number;
457
+ timezone: string;
458
+ to: number;
459
+ };
460
+ };
311
461
  truncated: boolean;
312
462
  }>;
313
463
  funnelsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: FunnelsReportInput): Promise<{
@@ -317,6 +467,22 @@ export declare class Rastro {
317
467
  conversionWindowMs: number;
318
468
  createdAt: number;
319
469
  key: string;
470
+ metadata: {
471
+ basis: "dailyRollup" | "boundedLegacy";
472
+ coverage: {
473
+ availableFrom: number | null;
474
+ availableThrough: number | null;
475
+ generation: number | null;
476
+ retainedBefore: number | null;
477
+ state: "complete" | "partial" | "retained" | "unavailable";
478
+ };
479
+ range: {
480
+ boundary: "inclusive";
481
+ from: number;
482
+ timezone: string;
483
+ to: number;
484
+ };
485
+ };
320
486
  name: string;
321
487
  siteId: string;
322
488
  steps: Array<{
@@ -351,8 +517,137 @@ export declare class Rastro {
351
517
  updatedAt: number;
352
518
  visits: number;
353
519
  }>;
520
+ metadata: {
521
+ basis: "dailyRollup" | "boundedLegacy";
522
+ coverage: {
523
+ availableFrom: number | null;
524
+ availableThrough: number | null;
525
+ generation: number | null;
526
+ retainedBefore: number | null;
527
+ state: "complete" | "partial" | "retained" | "unavailable";
528
+ };
529
+ range: {
530
+ boundary: "inclusive";
531
+ from: number;
532
+ timezone: string;
533
+ to: number;
534
+ };
535
+ uniqueVisitors: {
536
+ basis: "estimatedUnique" | "exactLegacy";
537
+ exact: boolean;
538
+ };
539
+ };
540
+ truncated: boolean;
541
+ }>;
542
+ vitalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: VitalsReportInput): Promise<{
543
+ metadata: {
544
+ basis: "dailyRollup" | "boundedLegacy";
545
+ coverage: {
546
+ availableFrom: number | null;
547
+ availableThrough: number | null;
548
+ generation: number | null;
549
+ retainedBefore: number | null;
550
+ state: "complete" | "partial" | "retained" | "unavailable";
551
+ };
552
+ range: {
553
+ boundary: "inclusive";
554
+ from: number;
555
+ timezone: string;
556
+ to: number;
557
+ };
558
+ };
559
+ metrics: Array<{
560
+ average: number;
561
+ count: number;
562
+ devices: Array<{
563
+ average: number;
564
+ count: number;
565
+ device: string;
566
+ good: number;
567
+ needsImprovement: number;
568
+ p75: number;
569
+ poor: number;
570
+ }>;
571
+ good: number;
572
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
573
+ needsImprovement: number;
574
+ p75: number;
575
+ pages: Array<{
576
+ average: number;
577
+ count: number;
578
+ good: number;
579
+ needsImprovement: number;
580
+ p75: number;
581
+ page: string;
582
+ poor: number;
583
+ }>;
584
+ poor: number;
585
+ timeSeries: Array<{
586
+ count: number;
587
+ p75: number;
588
+ timestamp: number;
589
+ }>;
590
+ }>;
354
591
  truncated: boolean;
355
592
  }>;
593
+ siteMap(ctx: QueryCtx | MutationCtx | ActionCtx, args: SiteMapInput): Promise<{
594
+ from: number;
595
+ metadata: {
596
+ basis: "dailyRollup" | "boundedLegacy";
597
+ coverage: {
598
+ availableFrom: number | null;
599
+ availableThrough: number | null;
600
+ generation: number | null;
601
+ retainedBefore: number | null;
602
+ state: "complete" | "partial" | "retained" | "unavailable";
603
+ };
604
+ limits: {
605
+ routesPerDay: number;
606
+ rows: number;
607
+ transitionSlots: number;
608
+ };
609
+ range: {
610
+ boundary: "inclusive";
611
+ from: number;
612
+ timezone: string;
613
+ to: number;
614
+ };
615
+ visitors: {
616
+ basis: "estimatedUnique";
617
+ exact: boolean;
618
+ };
619
+ };
620
+ routes: Array<{
621
+ bounces: number;
622
+ daily: Array<{
623
+ bucketStart: number;
624
+ pageviews: number;
625
+ }>;
626
+ dwellMs: number;
627
+ dwellSamples: number;
628
+ entries: number;
629
+ exits: number;
630
+ pageviews: number;
631
+ route: string;
632
+ transitionsIn: number;
633
+ transitionsOut: number;
634
+ visitors: number;
635
+ }>;
636
+ to: number;
637
+ transitions: Array<{
638
+ count: number;
639
+ from: string;
640
+ to: string;
641
+ }>;
642
+ truncated: {
643
+ routes: boolean;
644
+ transitions: boolean;
645
+ };
646
+ window: {
647
+ from: number;
648
+ to: number;
649
+ } | null;
650
+ }>;
356
651
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
357
652
  listGoals(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
358
653
  _creationTime: number;
@@ -401,11 +696,53 @@ export declare class Rastro {
401
696
  }[]>;
402
697
  removeAffiliate(ctx: MutationCtx, siteId: string, affiliateId: string): Promise<null>;
403
698
  cleanup(ctx: MutationCtx, args: CleanupInput): Promise<{
699
+ before: number;
700
+ deleted: number;
701
+ hasMore: boolean;
702
+ }>;
703
+ dataCoverage(ctx: QueryCtx | MutationCtx | ActionCtx, args: DataCoverageInput): Promise<{
704
+ datasets: Array<{
705
+ coverage: {
706
+ availableFrom: number | null;
707
+ availableThrough: number | null;
708
+ generation: number | null;
709
+ retainedBefore: number | null;
710
+ state: "complete" | "partial" | "retained" | "unavailable";
711
+ };
712
+ dataset: "overviewHour" | "overviewDay" | "overviewLocalDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
713
+ }>;
714
+ from: number;
715
+ siteId: string;
716
+ to: number;
717
+ }>;
718
+ setRetentionPolicy(ctx: MutationCtx, args: RetentionPolicyInput): Promise<null>;
719
+ disableRetentionPolicy(ctx: MutationCtx, siteId: string): Promise<null>;
720
+ retentionStatus(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
721
+ backlog: number;
722
+ jobs: Array<{
723
+ before: number;
724
+ deleted: number;
725
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
726
+ scheduledAt: number | null;
727
+ status: "pending" | "running" | "complete";
728
+ updatedAt: number;
729
+ }>;
730
+ policy: {
731
+ aggregatesDays: number;
732
+ conversionsDays: number;
733
+ eventsDays: number;
734
+ reportsDays: number;
735
+ sessionsDays: number;
736
+ updatedAt: number;
737
+ } | null;
738
+ }>;
739
+ runRetentionPolicy(ctx: MutationCtx, args: RunRetentionPolicyInput): Promise<{
740
+ before: number;
404
741
  deleted: number;
405
742
  hasMore: boolean;
406
743
  }>;
407
744
  }
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";
745
+ 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
746
  export type AnalyticsAuthorizationRequest = {
410
747
  operation: AnalyticsOperation;
411
748
  siteIds: string[];
@@ -413,6 +750,1266 @@ export type AnalyticsAuthorizationRequest = {
413
750
  };
414
751
  export type AnalyticsAuthorizationContext = Pick<GenericQueryCtx<GenericDataModel>, "auth" | "db" | "runQuery">;
415
752
  export type AnalyticsAuthorizer = (ctx: AnalyticsAuthorizationContext, request: AnalyticsAuthorizationRequest) => void | Promise<void>;
753
+ declare const hostOverviewValidator: import("convex/values").VObject<{
754
+ currency: string;
755
+ from: number;
756
+ interval: "day" | "hour";
757
+ metadata: {
758
+ breakdowns: {
759
+ topBrowsers: "eventVolume" | "pageviews" | "sessions";
760
+ topCampaigns: "eventVolume" | "pageviews" | "sessions";
761
+ topCountries: "eventVolume" | "pageviews" | "sessions";
762
+ topDevices: "eventVolume" | "pageviews" | "sessions";
763
+ topEvents: "eventVolume";
764
+ topGoals: "goalCompletionVolume";
765
+ topPages: "eventVolume" | "pageviews" | "sessions";
766
+ topSources: "eventVolume" | "pageviews" | "sessions";
767
+ };
768
+ coverage: {
769
+ availableFrom: number | null;
770
+ availableThrough: number | null;
771
+ generation: number | null;
772
+ retainedBefore: number | null;
773
+ state: "complete" | "partial" | "retained" | "unavailable";
774
+ };
775
+ engagement: "counted" | "unavailable";
776
+ features: {
777
+ botDetection: "userAgent";
778
+ errorInsights: "unsupported";
779
+ outboundLinks: "eventVolume";
780
+ sessionReplay: "unsupported";
781
+ };
782
+ range: {
783
+ boundary: "inclusive";
784
+ from: number;
785
+ timezone: string;
786
+ to: number;
787
+ };
788
+ visitors: {
789
+ basis: "bucketOccurrences" | "estimatedUnique";
790
+ exact: boolean;
791
+ legacyIncomplete: boolean;
792
+ precision: number | null;
793
+ sketchVersion: number | null;
794
+ };
795
+ };
796
+ timeSeries: {
797
+ clicks: number;
798
+ continuedSessions: number;
799
+ conversions: number;
800
+ customEvents: number;
801
+ durationMs: number;
802
+ events: number;
803
+ newVisitors: number;
804
+ outboundClicks: number;
805
+ pageviews: number;
806
+ revenueCents: number;
807
+ sessions: number;
808
+ timestamp: number;
809
+ visitors: number;
810
+ }[];
811
+ to: number;
812
+ topBrowsers: {
813
+ count: number;
814
+ revenueCents: number;
815
+ value: string;
816
+ }[];
817
+ topCampaigns: {
818
+ count: number;
819
+ revenueCents: number;
820
+ value: string;
821
+ }[];
822
+ topCountries: {
823
+ count: number;
824
+ revenueCents: number;
825
+ value: string;
826
+ }[];
827
+ topDevices: {
828
+ count: number;
829
+ revenueCents: number;
830
+ value: string;
831
+ }[];
832
+ topEvents: {
833
+ count: number;
834
+ revenueCents: number;
835
+ value: string;
836
+ }[];
837
+ topGoals: {
838
+ count: number;
839
+ revenueCents: number;
840
+ value: string;
841
+ }[];
842
+ topPages: {
843
+ count: number;
844
+ revenueCents: number;
845
+ value: string;
846
+ }[];
847
+ topSources: {
848
+ count: number;
849
+ revenueCents: number;
850
+ value: string;
851
+ }[];
852
+ totals: {
853
+ clicks: number;
854
+ continuedSessions: number;
855
+ conversions: number;
856
+ customEvents: number;
857
+ durationMs: number;
858
+ events: number;
859
+ newVisitors: number;
860
+ outboundClicks: number;
861
+ pageviews: number;
862
+ revenueCents: number;
863
+ sessions: number;
864
+ visitors: number;
865
+ };
866
+ }, {
867
+ from: import("convex/values").VFloat64<number, "required">;
868
+ to: import("convex/values").VFloat64<number, "required">;
869
+ interval: import("convex/values").VUnion<"day" | "hour", [import("convex/values").VLiteral<"hour", "required">, import("convex/values").VLiteral<"day", "required">], "required", never>;
870
+ currency: import("convex/values").VString<string, "required">;
871
+ totals: import("convex/values").VObject<{
872
+ clicks: number;
873
+ continuedSessions: number;
874
+ conversions: number;
875
+ customEvents: number;
876
+ durationMs: number;
877
+ events: number;
878
+ newVisitors: number;
879
+ outboundClicks: number;
880
+ pageviews: number;
881
+ revenueCents: number;
882
+ sessions: number;
883
+ visitors: number;
884
+ }, {
885
+ events: import("convex/values").VFloat64<number, "required">;
886
+ pageviews: import("convex/values").VFloat64<number, "required">;
887
+ clicks: import("convex/values").VFloat64<number, "required">;
888
+ customEvents: import("convex/values").VFloat64<number, "required">;
889
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
890
+ sessions: import("convex/values").VFloat64<number, "required">;
891
+ visitors: import("convex/values").VFloat64<number, "required">;
892
+ conversions: import("convex/values").VFloat64<number, "required">;
893
+ revenueCents: import("convex/values").VFloat64<number, "required">;
894
+ durationMs: import("convex/values").VFloat64<number, "required">;
895
+ continuedSessions: import("convex/values").VFloat64<number, "required">;
896
+ newVisitors: import("convex/values").VFloat64<number, "required">;
897
+ }, "required", "clicks" | "continuedSessions" | "conversions" | "customEvents" | "durationMs" | "events" | "newVisitors" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "visitors">;
898
+ timeSeries: import("convex/values").VArray<{
899
+ clicks: number;
900
+ continuedSessions: number;
901
+ conversions: number;
902
+ customEvents: number;
903
+ durationMs: number;
904
+ events: number;
905
+ newVisitors: number;
906
+ outboundClicks: number;
907
+ pageviews: number;
908
+ revenueCents: number;
909
+ sessions: number;
910
+ timestamp: number;
911
+ visitors: number;
912
+ }[], import("convex/values").VObject<{
913
+ clicks: number;
914
+ continuedSessions: number;
915
+ conversions: number;
916
+ customEvents: number;
917
+ durationMs: number;
918
+ events: number;
919
+ newVisitors: number;
920
+ outboundClicks: number;
921
+ pageviews: number;
922
+ revenueCents: number;
923
+ sessions: number;
924
+ timestamp: number;
925
+ visitors: number;
926
+ }, {
927
+ events: import("convex/values").VFloat64<number, "required">;
928
+ pageviews: import("convex/values").VFloat64<number, "required">;
929
+ clicks: import("convex/values").VFloat64<number, "required">;
930
+ customEvents: import("convex/values").VFloat64<number, "required">;
931
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
932
+ sessions: import("convex/values").VFloat64<number, "required">;
933
+ visitors: import("convex/values").VFloat64<number, "required">;
934
+ conversions: import("convex/values").VFloat64<number, "required">;
935
+ revenueCents: import("convex/values").VFloat64<number, "required">;
936
+ durationMs: import("convex/values").VFloat64<number, "required">;
937
+ continuedSessions: import("convex/values").VFloat64<number, "required">;
938
+ newVisitors: import("convex/values").VFloat64<number, "required">;
939
+ timestamp: import("convex/values").VFloat64<number, "required">;
940
+ }, "required", "clicks" | "continuedSessions" | "conversions" | "customEvents" | "durationMs" | "events" | "newVisitors" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "timestamp" | "visitors">, "required">;
941
+ topSources: import("convex/values").VArray<{
942
+ count: number;
943
+ revenueCents: number;
944
+ value: string;
945
+ }[], import("convex/values").VObject<{
946
+ count: number;
947
+ revenueCents: number;
948
+ value: string;
949
+ }, {
950
+ value: import("convex/values").VString<string, "required">;
951
+ count: import("convex/values").VFloat64<number, "required">;
952
+ revenueCents: import("convex/values").VFloat64<number, "required">;
953
+ }, "required", "count" | "revenueCents" | "value">, "required">;
954
+ topCampaigns: import("convex/values").VArray<{
955
+ count: number;
956
+ revenueCents: number;
957
+ value: string;
958
+ }[], import("convex/values").VObject<{
959
+ count: number;
960
+ revenueCents: number;
961
+ value: string;
962
+ }, {
963
+ value: import("convex/values").VString<string, "required">;
964
+ count: import("convex/values").VFloat64<number, "required">;
965
+ revenueCents: import("convex/values").VFloat64<number, "required">;
966
+ }, "required", "count" | "revenueCents" | "value">, "required">;
967
+ topPages: import("convex/values").VArray<{
968
+ count: number;
969
+ revenueCents: number;
970
+ value: string;
971
+ }[], import("convex/values").VObject<{
972
+ count: number;
973
+ revenueCents: number;
974
+ value: string;
975
+ }, {
976
+ value: import("convex/values").VString<string, "required">;
977
+ count: import("convex/values").VFloat64<number, "required">;
978
+ revenueCents: import("convex/values").VFloat64<number, "required">;
979
+ }, "required", "count" | "revenueCents" | "value">, "required">;
980
+ topCountries: import("convex/values").VArray<{
981
+ count: number;
982
+ revenueCents: number;
983
+ value: string;
984
+ }[], import("convex/values").VObject<{
985
+ count: number;
986
+ revenueCents: number;
987
+ value: string;
988
+ }, {
989
+ value: import("convex/values").VString<string, "required">;
990
+ count: import("convex/values").VFloat64<number, "required">;
991
+ revenueCents: import("convex/values").VFloat64<number, "required">;
992
+ }, "required", "count" | "revenueCents" | "value">, "required">;
993
+ topDevices: import("convex/values").VArray<{
994
+ count: number;
995
+ revenueCents: number;
996
+ value: string;
997
+ }[], import("convex/values").VObject<{
998
+ count: number;
999
+ revenueCents: number;
1000
+ value: string;
1001
+ }, {
1002
+ value: import("convex/values").VString<string, "required">;
1003
+ count: import("convex/values").VFloat64<number, "required">;
1004
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1005
+ }, "required", "count" | "revenueCents" | "value">, "required">;
1006
+ topBrowsers: import("convex/values").VArray<{
1007
+ count: number;
1008
+ revenueCents: number;
1009
+ value: string;
1010
+ }[], import("convex/values").VObject<{
1011
+ count: number;
1012
+ revenueCents: number;
1013
+ value: string;
1014
+ }, {
1015
+ value: import("convex/values").VString<string, "required">;
1016
+ count: import("convex/values").VFloat64<number, "required">;
1017
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1018
+ }, "required", "count" | "revenueCents" | "value">, "required">;
1019
+ topEvents: import("convex/values").VArray<{
1020
+ count: number;
1021
+ revenueCents: number;
1022
+ value: string;
1023
+ }[], import("convex/values").VObject<{
1024
+ count: number;
1025
+ revenueCents: number;
1026
+ value: string;
1027
+ }, {
1028
+ value: import("convex/values").VString<string, "required">;
1029
+ count: import("convex/values").VFloat64<number, "required">;
1030
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1031
+ }, "required", "count" | "revenueCents" | "value">, "required">;
1032
+ topGoals: import("convex/values").VArray<{
1033
+ count: number;
1034
+ revenueCents: number;
1035
+ value: string;
1036
+ }[], import("convex/values").VObject<{
1037
+ count: number;
1038
+ revenueCents: number;
1039
+ value: string;
1040
+ }, {
1041
+ value: import("convex/values").VString<string, "required">;
1042
+ count: import("convex/values").VFloat64<number, "required">;
1043
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1044
+ }, "required", "count" | "revenueCents" | "value">, "required">;
1045
+ metadata: import("convex/values").VObject<{
1046
+ breakdowns: {
1047
+ topBrowsers: "eventVolume" | "pageviews" | "sessions";
1048
+ topCampaigns: "eventVolume" | "pageviews" | "sessions";
1049
+ topCountries: "eventVolume" | "pageviews" | "sessions";
1050
+ topDevices: "eventVolume" | "pageviews" | "sessions";
1051
+ topEvents: "eventVolume";
1052
+ topGoals: "goalCompletionVolume";
1053
+ topPages: "eventVolume" | "pageviews" | "sessions";
1054
+ topSources: "eventVolume" | "pageviews" | "sessions";
1055
+ };
1056
+ coverage: {
1057
+ availableFrom: number | null;
1058
+ availableThrough: number | null;
1059
+ generation: number | null;
1060
+ retainedBefore: number | null;
1061
+ state: "complete" | "partial" | "retained" | "unavailable";
1062
+ };
1063
+ engagement: "counted" | "unavailable";
1064
+ features: {
1065
+ botDetection: "userAgent";
1066
+ errorInsights: "unsupported";
1067
+ outboundLinks: "eventVolume";
1068
+ sessionReplay: "unsupported";
1069
+ };
1070
+ range: {
1071
+ boundary: "inclusive";
1072
+ from: number;
1073
+ timezone: string;
1074
+ to: number;
1075
+ };
1076
+ visitors: {
1077
+ basis: "bucketOccurrences" | "estimatedUnique";
1078
+ exact: boolean;
1079
+ legacyIncomplete: boolean;
1080
+ precision: number | null;
1081
+ sketchVersion: number | null;
1082
+ };
1083
+ }, {
1084
+ visitors: import("convex/values").VObject<{
1085
+ basis: "bucketOccurrences" | "estimatedUnique";
1086
+ exact: boolean;
1087
+ legacyIncomplete: boolean;
1088
+ precision: number | null;
1089
+ sketchVersion: number | null;
1090
+ }, {
1091
+ basis: import("convex/values").VUnion<"bucketOccurrences" | "estimatedUnique", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"bucketOccurrences", "required">], "required", never>;
1092
+ exact: import("convex/values").VBoolean<boolean, "required">;
1093
+ legacyIncomplete: import("convex/values").VBoolean<boolean, "required">;
1094
+ sketchVersion: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1095
+ precision: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1096
+ }, "required", "basis" | "exact" | "legacyIncomplete" | "precision" | "sketchVersion">;
1097
+ breakdowns: import("convex/values").VObject<{
1098
+ topBrowsers: "eventVolume" | "pageviews" | "sessions";
1099
+ topCampaigns: "eventVolume" | "pageviews" | "sessions";
1100
+ topCountries: "eventVolume" | "pageviews" | "sessions";
1101
+ topDevices: "eventVolume" | "pageviews" | "sessions";
1102
+ topEvents: "eventVolume";
1103
+ topGoals: "goalCompletionVolume";
1104
+ topPages: "eventVolume" | "pageviews" | "sessions";
1105
+ topSources: "eventVolume" | "pageviews" | "sessions";
1106
+ }, {
1107
+ topSources: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1108
+ topCampaigns: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1109
+ topPages: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1110
+ topCountries: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1111
+ topDevices: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1112
+ topBrowsers: import("convex/values").VUnion<"eventVolume" | "pageviews" | "sessions", [import("convex/values").VLiteral<"pageviews", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"eventVolume", "required">], "required", never>;
1113
+ topEvents: import("convex/values").VLiteral<"eventVolume", "required">;
1114
+ topGoals: import("convex/values").VLiteral<"goalCompletionVolume", "required">;
1115
+ }, "required", "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
1116
+ engagement: import("convex/values").VUnion<"counted" | "unavailable", [import("convex/values").VLiteral<"counted", "required">, import("convex/values").VLiteral<"unavailable", "required">], "required", never>;
1117
+ coverage: import("convex/values").VObject<{
1118
+ availableFrom: number | null;
1119
+ availableThrough: number | null;
1120
+ generation: number | null;
1121
+ retainedBefore: number | null;
1122
+ state: "complete" | "partial" | "retained" | "unavailable";
1123
+ }, {
1124
+ 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>;
1125
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1126
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1127
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1128
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1129
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1130
+ range: import("convex/values").VObject<{
1131
+ boundary: "inclusive";
1132
+ from: number;
1133
+ timezone: string;
1134
+ to: number;
1135
+ }, {
1136
+ from: import("convex/values").VFloat64<number, "required">;
1137
+ to: import("convex/values").VFloat64<number, "required">;
1138
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1139
+ timezone: import("convex/values").VString<string, "required">;
1140
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1141
+ features: import("convex/values").VObject<{
1142
+ botDetection: "userAgent";
1143
+ errorInsights: "unsupported";
1144
+ outboundLinks: "eventVolume";
1145
+ sessionReplay: "unsupported";
1146
+ }, {
1147
+ sessionReplay: import("convex/values").VLiteral<"unsupported", "required">;
1148
+ errorInsights: import("convex/values").VLiteral<"unsupported", "required">;
1149
+ outboundLinks: import("convex/values").VLiteral<"eventVolume", "required">;
1150
+ botDetection: import("convex/values").VLiteral<"userAgent", "required">;
1151
+ }, "required", "botDetection" | "errorInsights" | "outboundLinks" | "sessionReplay">;
1152
+ }, "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" | "engagement" | "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">;
1153
+ }, "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.engagement" | "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.continuedSessions" | "totals.conversions" | "totals.customEvents" | "totals.durationMs" | "totals.events" | "totals.newVisitors" | "totals.outboundClicks" | "totals.pageviews" | "totals.revenueCents" | "totals.sessions" | "totals.visitors">;
1154
+ declare const hostGoalsReportValidator: import("convex/values").VObject<{
1155
+ goals: {
1156
+ _creationTime: number;
1157
+ _id: string;
1158
+ active: boolean;
1159
+ completions: number;
1160
+ createdAt: number;
1161
+ key: string;
1162
+ matchType: "custom" | "pageview";
1163
+ matchValue: string;
1164
+ name: string;
1165
+ siteId: string;
1166
+ updatedAt: number;
1167
+ valueCents: number;
1168
+ }[];
1169
+ metadata: {
1170
+ basis: "boundedLegacy" | "dailyRollup";
1171
+ coverage: {
1172
+ availableFrom: number | null;
1173
+ availableThrough: number | null;
1174
+ generation: number | null;
1175
+ retainedBefore: number | null;
1176
+ state: "complete" | "partial" | "retained" | "unavailable";
1177
+ };
1178
+ range: {
1179
+ boundary: "inclusive";
1180
+ from: number;
1181
+ timezone: string;
1182
+ to: number;
1183
+ };
1184
+ };
1185
+ truncated: boolean;
1186
+ }, {
1187
+ goals: import("convex/values").VArray<{
1188
+ _creationTime: number;
1189
+ _id: string;
1190
+ active: boolean;
1191
+ completions: number;
1192
+ createdAt: number;
1193
+ key: string;
1194
+ matchType: "custom" | "pageview";
1195
+ matchValue: string;
1196
+ name: string;
1197
+ siteId: string;
1198
+ updatedAt: number;
1199
+ valueCents: number;
1200
+ }[], import("convex/values").VObject<{
1201
+ _creationTime: number;
1202
+ _id: string;
1203
+ active: boolean;
1204
+ completions: number;
1205
+ createdAt: number;
1206
+ key: string;
1207
+ matchType: "custom" | "pageview";
1208
+ matchValue: string;
1209
+ name: string;
1210
+ siteId: string;
1211
+ updatedAt: number;
1212
+ valueCents: number;
1213
+ }, {
1214
+ _id: import("convex/values").VString<string, "required">;
1215
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1216
+ siteId: import("convex/values").VString<string, "required">;
1217
+ key: import("convex/values").VString<string, "required">;
1218
+ name: import("convex/values").VString<string, "required">;
1219
+ matchType: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1220
+ matchValue: import("convex/values").VString<string, "required">;
1221
+ valueCents: never;
1222
+ active: import("convex/values").VBoolean<boolean, "required">;
1223
+ createdAt: import("convex/values").VFloat64<number, "required">;
1224
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1225
+ completions: import("convex/values").VFloat64<number, "required">;
1226
+ }, "required", "_creationTime" | "_id" | "active" | "completions" | "createdAt" | "key" | "matchType" | "matchValue" | "name" | "siteId" | "updatedAt" | "valueCents">, "required">;
1227
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1228
+ metadata: import("convex/values").VObject<{
1229
+ basis: "boundedLegacy" | "dailyRollup";
1230
+ coverage: {
1231
+ availableFrom: number | null;
1232
+ availableThrough: number | null;
1233
+ generation: number | null;
1234
+ retainedBefore: number | null;
1235
+ state: "complete" | "partial" | "retained" | "unavailable";
1236
+ };
1237
+ range: {
1238
+ boundary: "inclusive";
1239
+ from: number;
1240
+ timezone: string;
1241
+ to: number;
1242
+ };
1243
+ }, {
1244
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1245
+ coverage: import("convex/values").VObject<{
1246
+ availableFrom: number | null;
1247
+ availableThrough: number | null;
1248
+ generation: number | null;
1249
+ retainedBefore: number | null;
1250
+ state: "complete" | "partial" | "retained" | "unavailable";
1251
+ }, {
1252
+ 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>;
1253
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1254
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1255
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1256
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1257
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1258
+ range: import("convex/values").VObject<{
1259
+ boundary: "inclusive";
1260
+ from: number;
1261
+ timezone: string;
1262
+ to: number;
1263
+ }, {
1264
+ from: import("convex/values").VFloat64<number, "required">;
1265
+ to: import("convex/values").VFloat64<number, "required">;
1266
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1267
+ timezone: import("convex/values").VString<string, "required">;
1268
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1269
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1270
+ }, "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">;
1271
+ declare const hostFunnelsReportValidator: import("convex/values").VArray<{
1272
+ _creationTime: number;
1273
+ _id: string;
1274
+ active: boolean;
1275
+ conversionWindowMs: number;
1276
+ createdAt: number;
1277
+ key: string;
1278
+ metadata: {
1279
+ basis: "boundedLegacy" | "dailyRollup";
1280
+ coverage: {
1281
+ availableFrom: number | null;
1282
+ availableThrough: number | null;
1283
+ generation: number | null;
1284
+ retainedBefore: number | null;
1285
+ state: "complete" | "partial" | "retained" | "unavailable";
1286
+ };
1287
+ range: {
1288
+ boundary: "inclusive";
1289
+ from: number;
1290
+ timezone: string;
1291
+ to: number;
1292
+ };
1293
+ };
1294
+ name: string;
1295
+ siteId: string;
1296
+ steps: {
1297
+ name: string;
1298
+ type: "custom" | "pageview";
1299
+ value: string;
1300
+ }[];
1301
+ stepsReport: {
1302
+ completions: number;
1303
+ entrants: number;
1304
+ name: string;
1305
+ step: number;
1306
+ }[];
1307
+ truncated: boolean;
1308
+ updatedAt: number;
1309
+ }[], import("convex/values").VObject<{
1310
+ _creationTime: number;
1311
+ _id: string;
1312
+ active: boolean;
1313
+ conversionWindowMs: number;
1314
+ createdAt: number;
1315
+ key: string;
1316
+ metadata: {
1317
+ basis: "boundedLegacy" | "dailyRollup";
1318
+ coverage: {
1319
+ availableFrom: number | null;
1320
+ availableThrough: number | null;
1321
+ generation: number | null;
1322
+ retainedBefore: number | null;
1323
+ state: "complete" | "partial" | "retained" | "unavailable";
1324
+ };
1325
+ range: {
1326
+ boundary: "inclusive";
1327
+ from: number;
1328
+ timezone: string;
1329
+ to: number;
1330
+ };
1331
+ };
1332
+ name: string;
1333
+ siteId: string;
1334
+ steps: {
1335
+ name: string;
1336
+ type: "custom" | "pageview";
1337
+ value: string;
1338
+ }[];
1339
+ stepsReport: {
1340
+ completions: number;
1341
+ entrants: number;
1342
+ name: string;
1343
+ step: number;
1344
+ }[];
1345
+ truncated: boolean;
1346
+ updatedAt: number;
1347
+ }, {
1348
+ _id: import("convex/values").VString<string, "required">;
1349
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1350
+ siteId: import("convex/values").VString<string, "required">;
1351
+ key: import("convex/values").VString<string, "required">;
1352
+ name: import("convex/values").VString<string, "required">;
1353
+ steps: import("convex/values").VArray<{
1354
+ name: string;
1355
+ type: "custom" | "pageview";
1356
+ value: string;
1357
+ }[], import("convex/values").VObject<{
1358
+ name: string;
1359
+ type: "custom" | "pageview";
1360
+ value: string;
1361
+ }, {
1362
+ type: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1363
+ value: import("convex/values").VString<string, "required">;
1364
+ name: import("convex/values").VString<string, "required">;
1365
+ }, "required", "name" | "type" | "value">, "required">;
1366
+ conversionWindowMs: import("convex/values").VFloat64<number, "required">;
1367
+ active: import("convex/values").VBoolean<boolean, "required">;
1368
+ createdAt: import("convex/values").VFloat64<number, "required">;
1369
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1370
+ stepsReport: import("convex/values").VArray<{
1371
+ completions: number;
1372
+ entrants: number;
1373
+ name: string;
1374
+ step: number;
1375
+ }[], import("convex/values").VObject<{
1376
+ completions: number;
1377
+ entrants: number;
1378
+ name: string;
1379
+ step: number;
1380
+ }, {
1381
+ step: import("convex/values").VFloat64<number, "required">;
1382
+ name: import("convex/values").VString<string, "required">;
1383
+ entrants: import("convex/values").VFloat64<number, "required">;
1384
+ completions: import("convex/values").VFloat64<number, "required">;
1385
+ }, "required", "completions" | "entrants" | "name" | "step">, "required">;
1386
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1387
+ metadata: import("convex/values").VObject<{
1388
+ basis: "boundedLegacy" | "dailyRollup";
1389
+ coverage: {
1390
+ availableFrom: number | null;
1391
+ availableThrough: number | null;
1392
+ generation: number | null;
1393
+ retainedBefore: number | null;
1394
+ state: "complete" | "partial" | "retained" | "unavailable";
1395
+ };
1396
+ range: {
1397
+ boundary: "inclusive";
1398
+ from: number;
1399
+ timezone: string;
1400
+ to: number;
1401
+ };
1402
+ }, {
1403
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1404
+ coverage: import("convex/values").VObject<{
1405
+ availableFrom: number | null;
1406
+ availableThrough: number | null;
1407
+ generation: number | null;
1408
+ retainedBefore: number | null;
1409
+ state: "complete" | "partial" | "retained" | "unavailable";
1410
+ }, {
1411
+ 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>;
1412
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1413
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1414
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1415
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1416
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1417
+ range: import("convex/values").VObject<{
1418
+ boundary: "inclusive";
1419
+ from: number;
1420
+ timezone: string;
1421
+ to: number;
1422
+ }, {
1423
+ from: import("convex/values").VFloat64<number, "required">;
1424
+ to: import("convex/values").VFloat64<number, "required">;
1425
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1426
+ timezone: import("convex/values").VString<string, "required">;
1427
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1428
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1429
+ }, "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">;
1430
+ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1431
+ affiliates: {
1432
+ _creationTime: number;
1433
+ _id: string;
1434
+ active: boolean;
1435
+ attributionWindowDays: number;
1436
+ commissionBps: number;
1437
+ commissionCents: number;
1438
+ conversions: number;
1439
+ createdAt: number;
1440
+ name: string;
1441
+ revenueCents: number;
1442
+ siteId: string;
1443
+ slug: string;
1444
+ uniqueVisitors: number;
1445
+ updatedAt: number;
1446
+ visits: number;
1447
+ }[];
1448
+ metadata: {
1449
+ basis: "boundedLegacy" | "dailyRollup";
1450
+ coverage: {
1451
+ availableFrom: number | null;
1452
+ availableThrough: number | null;
1453
+ generation: number | null;
1454
+ retainedBefore: number | null;
1455
+ state: "complete" | "partial" | "retained" | "unavailable";
1456
+ };
1457
+ range: {
1458
+ boundary: "inclusive";
1459
+ from: number;
1460
+ timezone: string;
1461
+ to: number;
1462
+ };
1463
+ uniqueVisitors: {
1464
+ basis: "estimatedUnique" | "exactLegacy";
1465
+ exact: boolean;
1466
+ };
1467
+ };
1468
+ truncated: boolean;
1469
+ }, {
1470
+ affiliates: import("convex/values").VArray<{
1471
+ _creationTime: number;
1472
+ _id: string;
1473
+ active: boolean;
1474
+ attributionWindowDays: number;
1475
+ commissionBps: number;
1476
+ commissionCents: number;
1477
+ conversions: number;
1478
+ createdAt: number;
1479
+ name: string;
1480
+ revenueCents: number;
1481
+ siteId: string;
1482
+ slug: string;
1483
+ uniqueVisitors: number;
1484
+ updatedAt: number;
1485
+ visits: number;
1486
+ }[], import("convex/values").VObject<{
1487
+ _creationTime: number;
1488
+ _id: string;
1489
+ active: boolean;
1490
+ attributionWindowDays: number;
1491
+ commissionBps: number;
1492
+ commissionCents: number;
1493
+ conversions: number;
1494
+ createdAt: number;
1495
+ name: string;
1496
+ revenueCents: number;
1497
+ siteId: string;
1498
+ slug: string;
1499
+ uniqueVisitors: number;
1500
+ updatedAt: number;
1501
+ visits: number;
1502
+ }, {
1503
+ _id: import("convex/values").VString<string, "required">;
1504
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1505
+ siteId: import("convex/values").VString<string, "required">;
1506
+ slug: import("convex/values").VString<string, "required">;
1507
+ name: import("convex/values").VString<string, "required">;
1508
+ commissionBps: import("convex/values").VFloat64<number, "required">;
1509
+ attributionWindowDays: import("convex/values").VFloat64<number, "required">;
1510
+ active: import("convex/values").VBoolean<boolean, "required">;
1511
+ createdAt: import("convex/values").VFloat64<number, "required">;
1512
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1513
+ visits: import("convex/values").VFloat64<number, "required">;
1514
+ uniqueVisitors: import("convex/values").VFloat64<number, "required">;
1515
+ conversions: import("convex/values").VFloat64<number, "required">;
1516
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1517
+ commissionCents: import("convex/values").VFloat64<number, "required">;
1518
+ }, "required", "_creationTime" | "_id" | "active" | "attributionWindowDays" | "commissionBps" | "commissionCents" | "conversions" | "createdAt" | "name" | "revenueCents" | "siteId" | "slug" | "uniqueVisitors" | "updatedAt" | "visits">, "required">;
1519
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1520
+ metadata: import("convex/values").VObject<{
1521
+ basis: "boundedLegacy" | "dailyRollup";
1522
+ coverage: {
1523
+ availableFrom: number | null;
1524
+ availableThrough: number | null;
1525
+ generation: number | null;
1526
+ retainedBefore: number | null;
1527
+ state: "complete" | "partial" | "retained" | "unavailable";
1528
+ };
1529
+ range: {
1530
+ boundary: "inclusive";
1531
+ from: number;
1532
+ timezone: string;
1533
+ to: number;
1534
+ };
1535
+ uniqueVisitors: {
1536
+ basis: "estimatedUnique" | "exactLegacy";
1537
+ exact: boolean;
1538
+ };
1539
+ }, {
1540
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1541
+ coverage: import("convex/values").VObject<{
1542
+ availableFrom: number | null;
1543
+ availableThrough: number | null;
1544
+ generation: number | null;
1545
+ retainedBefore: number | null;
1546
+ state: "complete" | "partial" | "retained" | "unavailable";
1547
+ }, {
1548
+ 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>;
1549
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1550
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1551
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1552
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1553
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1554
+ range: import("convex/values").VObject<{
1555
+ boundary: "inclusive";
1556
+ from: number;
1557
+ timezone: string;
1558
+ to: number;
1559
+ }, {
1560
+ from: import("convex/values").VFloat64<number, "required">;
1561
+ to: import("convex/values").VFloat64<number, "required">;
1562
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1563
+ timezone: import("convex/values").VString<string, "required">;
1564
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1565
+ uniqueVisitors: import("convex/values").VObject<{
1566
+ basis: "estimatedUnique" | "exactLegacy";
1567
+ exact: boolean;
1568
+ }, {
1569
+ basis: import("convex/values").VUnion<"estimatedUnique" | "exactLegacy", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"exactLegacy", "required">], "required", never>;
1570
+ exact: import("convex/values").VBoolean<boolean, "required">;
1571
+ }, "required", "basis" | "exact">;
1572
+ }, "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">;
1573
+ }, "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">;
1574
+ declare const hostVitalsReportValidator: import("convex/values").VObject<{
1575
+ metadata: {
1576
+ basis: "boundedLegacy" | "dailyRollup";
1577
+ coverage: {
1578
+ availableFrom: number | null;
1579
+ availableThrough: number | null;
1580
+ generation: number | null;
1581
+ retainedBefore: number | null;
1582
+ state: "complete" | "partial" | "retained" | "unavailable";
1583
+ };
1584
+ range: {
1585
+ boundary: "inclusive";
1586
+ from: number;
1587
+ timezone: string;
1588
+ to: number;
1589
+ };
1590
+ };
1591
+ metrics: {
1592
+ average: number;
1593
+ count: number;
1594
+ devices: {
1595
+ average: number;
1596
+ count: number;
1597
+ device: string;
1598
+ good: number;
1599
+ needsImprovement: number;
1600
+ p75: number;
1601
+ poor: number;
1602
+ }[];
1603
+ good: number;
1604
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1605
+ needsImprovement: number;
1606
+ p75: number;
1607
+ pages: {
1608
+ average: number;
1609
+ count: number;
1610
+ good: number;
1611
+ needsImprovement: number;
1612
+ p75: number;
1613
+ page: string;
1614
+ poor: number;
1615
+ }[];
1616
+ poor: number;
1617
+ timeSeries: {
1618
+ count: number;
1619
+ p75: number;
1620
+ timestamp: number;
1621
+ }[];
1622
+ }[];
1623
+ truncated: boolean;
1624
+ }, {
1625
+ metrics: import("convex/values").VArray<{
1626
+ average: number;
1627
+ count: number;
1628
+ devices: {
1629
+ average: number;
1630
+ count: number;
1631
+ device: string;
1632
+ good: number;
1633
+ needsImprovement: number;
1634
+ p75: number;
1635
+ poor: number;
1636
+ }[];
1637
+ good: number;
1638
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1639
+ needsImprovement: number;
1640
+ p75: number;
1641
+ pages: {
1642
+ average: number;
1643
+ count: number;
1644
+ good: number;
1645
+ needsImprovement: number;
1646
+ p75: number;
1647
+ page: string;
1648
+ poor: number;
1649
+ }[];
1650
+ poor: number;
1651
+ timeSeries: {
1652
+ count: number;
1653
+ p75: number;
1654
+ timestamp: number;
1655
+ }[];
1656
+ }[], import("convex/values").VObject<{
1657
+ average: number;
1658
+ count: number;
1659
+ devices: {
1660
+ average: number;
1661
+ count: number;
1662
+ device: string;
1663
+ good: number;
1664
+ needsImprovement: number;
1665
+ p75: number;
1666
+ poor: number;
1667
+ }[];
1668
+ good: number;
1669
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1670
+ needsImprovement: number;
1671
+ p75: number;
1672
+ pages: {
1673
+ average: number;
1674
+ count: number;
1675
+ good: number;
1676
+ needsImprovement: number;
1677
+ p75: number;
1678
+ page: string;
1679
+ poor: number;
1680
+ }[];
1681
+ poor: number;
1682
+ timeSeries: {
1683
+ count: number;
1684
+ p75: number;
1685
+ timestamp: number;
1686
+ }[];
1687
+ }, {
1688
+ count: import("convex/values").VFloat64<number, "required">;
1689
+ p75: import("convex/values").VFloat64<number, "required">;
1690
+ average: import("convex/values").VFloat64<number, "required">;
1691
+ good: import("convex/values").VFloat64<number, "required">;
1692
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1693
+ poor: import("convex/values").VFloat64<number, "required">;
1694
+ 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>;
1695
+ devices: import("convex/values").VArray<{
1696
+ average: number;
1697
+ count: number;
1698
+ device: string;
1699
+ good: number;
1700
+ needsImprovement: number;
1701
+ p75: number;
1702
+ poor: number;
1703
+ }[], import("convex/values").VObject<{
1704
+ average: number;
1705
+ count: number;
1706
+ device: string;
1707
+ good: number;
1708
+ needsImprovement: number;
1709
+ p75: number;
1710
+ poor: number;
1711
+ }, {
1712
+ count: import("convex/values").VFloat64<number, "required">;
1713
+ p75: import("convex/values").VFloat64<number, "required">;
1714
+ average: import("convex/values").VFloat64<number, "required">;
1715
+ good: import("convex/values").VFloat64<number, "required">;
1716
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1717
+ poor: import("convex/values").VFloat64<number, "required">;
1718
+ device: import("convex/values").VString<string, "required">;
1719
+ }, "required", "average" | "count" | "device" | "good" | "needsImprovement" | "p75" | "poor">, "required">;
1720
+ pages: import("convex/values").VArray<{
1721
+ average: number;
1722
+ count: number;
1723
+ good: number;
1724
+ needsImprovement: number;
1725
+ p75: number;
1726
+ page: string;
1727
+ poor: number;
1728
+ }[], import("convex/values").VObject<{
1729
+ average: number;
1730
+ count: number;
1731
+ good: number;
1732
+ needsImprovement: number;
1733
+ p75: number;
1734
+ page: string;
1735
+ poor: number;
1736
+ }, {
1737
+ count: import("convex/values").VFloat64<number, "required">;
1738
+ p75: import("convex/values").VFloat64<number, "required">;
1739
+ average: import("convex/values").VFloat64<number, "required">;
1740
+ good: import("convex/values").VFloat64<number, "required">;
1741
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1742
+ poor: import("convex/values").VFloat64<number, "required">;
1743
+ page: import("convex/values").VString<string, "required">;
1744
+ }, "required", "average" | "count" | "good" | "needsImprovement" | "p75" | "page" | "poor">, "required">;
1745
+ timeSeries: import("convex/values").VArray<{
1746
+ count: number;
1747
+ p75: number;
1748
+ timestamp: number;
1749
+ }[], import("convex/values").VObject<{
1750
+ count: number;
1751
+ p75: number;
1752
+ timestamp: number;
1753
+ }, {
1754
+ timestamp: import("convex/values").VFloat64<number, "required">;
1755
+ count: import("convex/values").VFloat64<number, "required">;
1756
+ p75: import("convex/values").VFloat64<number, "required">;
1757
+ }, "required", "count" | "p75" | "timestamp">, "required">;
1758
+ }, "required", "average" | "count" | "devices" | "good" | "metric" | "needsImprovement" | "p75" | "pages" | "poor" | "timeSeries">, "required">;
1759
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1760
+ metadata: import("convex/values").VObject<{
1761
+ basis: "boundedLegacy" | "dailyRollup";
1762
+ coverage: {
1763
+ availableFrom: number | null;
1764
+ availableThrough: number | null;
1765
+ generation: number | null;
1766
+ retainedBefore: number | null;
1767
+ state: "complete" | "partial" | "retained" | "unavailable";
1768
+ };
1769
+ range: {
1770
+ boundary: "inclusive";
1771
+ from: number;
1772
+ timezone: string;
1773
+ to: number;
1774
+ };
1775
+ }, {
1776
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1777
+ coverage: import("convex/values").VObject<{
1778
+ availableFrom: number | null;
1779
+ availableThrough: number | null;
1780
+ generation: number | null;
1781
+ retainedBefore: number | null;
1782
+ state: "complete" | "partial" | "retained" | "unavailable";
1783
+ }, {
1784
+ 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>;
1785
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1786
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1787
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1788
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1789
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1790
+ range: import("convex/values").VObject<{
1791
+ boundary: "inclusive";
1792
+ from: number;
1793
+ timezone: string;
1794
+ to: number;
1795
+ }, {
1796
+ from: import("convex/values").VFloat64<number, "required">;
1797
+ to: import("convex/values").VFloat64<number, "required">;
1798
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1799
+ timezone: import("convex/values").VString<string, "required">;
1800
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1801
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1802
+ }, "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">;
1803
+ declare const hostSiteMapValidator: import("convex/values").VObject<{
1804
+ from: number;
1805
+ metadata: {
1806
+ basis: "boundedLegacy" | "dailyRollup";
1807
+ coverage: {
1808
+ availableFrom: number | null;
1809
+ availableThrough: number | null;
1810
+ generation: number | null;
1811
+ retainedBefore: number | null;
1812
+ state: "complete" | "partial" | "retained" | "unavailable";
1813
+ };
1814
+ limits: {
1815
+ routesPerDay: number;
1816
+ rows: number;
1817
+ transitionSlots: number;
1818
+ };
1819
+ range: {
1820
+ boundary: "inclusive";
1821
+ from: number;
1822
+ timezone: string;
1823
+ to: number;
1824
+ };
1825
+ visitors: {
1826
+ basis: "estimatedUnique";
1827
+ exact: boolean;
1828
+ };
1829
+ };
1830
+ routes: {
1831
+ bounces: number;
1832
+ daily: {
1833
+ bucketStart: number;
1834
+ pageviews: number;
1835
+ }[];
1836
+ dwellMs: number;
1837
+ dwellSamples: number;
1838
+ entries: number;
1839
+ exits: number;
1840
+ pageviews: number;
1841
+ route: string;
1842
+ transitionsIn: number;
1843
+ transitionsOut: number;
1844
+ visitors: number;
1845
+ }[];
1846
+ to: number;
1847
+ transitions: {
1848
+ count: number;
1849
+ from: string;
1850
+ to: string;
1851
+ }[];
1852
+ truncated: {
1853
+ routes: boolean;
1854
+ transitions: boolean;
1855
+ };
1856
+ window: {
1857
+ from: number;
1858
+ to: number;
1859
+ } | null;
1860
+ }, {
1861
+ from: import("convex/values").VFloat64<number, "required">;
1862
+ to: import("convex/values").VFloat64<number, "required">;
1863
+ window: import("convex/values").VUnion<{
1864
+ from: number;
1865
+ to: number;
1866
+ } | null, [import("convex/values").VObject<{
1867
+ from: number;
1868
+ to: number;
1869
+ }, {
1870
+ from: import("convex/values").VFloat64<number, "required">;
1871
+ to: import("convex/values").VFloat64<number, "required">;
1872
+ }, "required", "from" | "to">, import("convex/values").VNull<null, "required">], "required", "from" | "to">;
1873
+ routes: import("convex/values").VArray<{
1874
+ bounces: number;
1875
+ daily: {
1876
+ bucketStart: number;
1877
+ pageviews: number;
1878
+ }[];
1879
+ dwellMs: number;
1880
+ dwellSamples: number;
1881
+ entries: number;
1882
+ exits: number;
1883
+ pageviews: number;
1884
+ route: string;
1885
+ transitionsIn: number;
1886
+ transitionsOut: number;
1887
+ visitors: number;
1888
+ }[], import("convex/values").VObject<{
1889
+ bounces: number;
1890
+ daily: {
1891
+ bucketStart: number;
1892
+ pageviews: number;
1893
+ }[];
1894
+ dwellMs: number;
1895
+ dwellSamples: number;
1896
+ entries: number;
1897
+ exits: number;
1898
+ pageviews: number;
1899
+ route: string;
1900
+ transitionsIn: number;
1901
+ transitionsOut: number;
1902
+ visitors: number;
1903
+ }, {
1904
+ route: import("convex/values").VString<string, "required">;
1905
+ pageviews: import("convex/values").VFloat64<number, "required">;
1906
+ visitors: import("convex/values").VFloat64<number, "required">;
1907
+ entries: import("convex/values").VFloat64<number, "required">;
1908
+ exits: import("convex/values").VFloat64<number, "required">;
1909
+ bounces: import("convex/values").VFloat64<number, "required">;
1910
+ transitionsIn: import("convex/values").VFloat64<number, "required">;
1911
+ transitionsOut: import("convex/values").VFloat64<number, "required">;
1912
+ dwellMs: import("convex/values").VFloat64<number, "required">;
1913
+ dwellSamples: import("convex/values").VFloat64<number, "required">;
1914
+ daily: import("convex/values").VArray<{
1915
+ bucketStart: number;
1916
+ pageviews: number;
1917
+ }[], import("convex/values").VObject<{
1918
+ bucketStart: number;
1919
+ pageviews: number;
1920
+ }, {
1921
+ bucketStart: import("convex/values").VFloat64<number, "required">;
1922
+ pageviews: import("convex/values").VFloat64<number, "required">;
1923
+ }, "required", "bucketStart" | "pageviews">, "required">;
1924
+ }, "required", "bounces" | "daily" | "dwellMs" | "dwellSamples" | "entries" | "exits" | "pageviews" | "route" | "transitionsIn" | "transitionsOut" | "visitors">, "required">;
1925
+ transitions: import("convex/values").VArray<{
1926
+ count: number;
1927
+ from: string;
1928
+ to: string;
1929
+ }[], import("convex/values").VObject<{
1930
+ count: number;
1931
+ from: string;
1932
+ to: string;
1933
+ }, {
1934
+ from: import("convex/values").VString<string, "required">;
1935
+ to: import("convex/values").VString<string, "required">;
1936
+ count: import("convex/values").VFloat64<number, "required">;
1937
+ }, "required", "count" | "from" | "to">, "required">;
1938
+ truncated: import("convex/values").VObject<{
1939
+ routes: boolean;
1940
+ transitions: boolean;
1941
+ }, {
1942
+ routes: import("convex/values").VBoolean<boolean, "required">;
1943
+ transitions: import("convex/values").VBoolean<boolean, "required">;
1944
+ }, "required", "routes" | "transitions">;
1945
+ metadata: import("convex/values").VObject<{
1946
+ basis: "boundedLegacy" | "dailyRollup";
1947
+ coverage: {
1948
+ availableFrom: number | null;
1949
+ availableThrough: number | null;
1950
+ generation: number | null;
1951
+ retainedBefore: number | null;
1952
+ state: "complete" | "partial" | "retained" | "unavailable";
1953
+ };
1954
+ limits: {
1955
+ routesPerDay: number;
1956
+ rows: number;
1957
+ transitionSlots: number;
1958
+ };
1959
+ range: {
1960
+ boundary: "inclusive";
1961
+ from: number;
1962
+ timezone: string;
1963
+ to: number;
1964
+ };
1965
+ visitors: {
1966
+ basis: "estimatedUnique";
1967
+ exact: boolean;
1968
+ };
1969
+ }, {
1970
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1971
+ coverage: import("convex/values").VObject<{
1972
+ availableFrom: number | null;
1973
+ availableThrough: number | null;
1974
+ generation: number | null;
1975
+ retainedBefore: number | null;
1976
+ state: "complete" | "partial" | "retained" | "unavailable";
1977
+ }, {
1978
+ 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>;
1979
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1980
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1981
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1982
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1983
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1984
+ range: import("convex/values").VObject<{
1985
+ boundary: "inclusive";
1986
+ from: number;
1987
+ timezone: string;
1988
+ to: number;
1989
+ }, {
1990
+ from: import("convex/values").VFloat64<number, "required">;
1991
+ to: import("convex/values").VFloat64<number, "required">;
1992
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1993
+ timezone: import("convex/values").VString<string, "required">;
1994
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1995
+ visitors: import("convex/values").VObject<{
1996
+ basis: "estimatedUnique";
1997
+ exact: boolean;
1998
+ }, {
1999
+ basis: import("convex/values").VLiteral<"estimatedUnique", "required">;
2000
+ exact: import("convex/values").VBoolean<boolean, "required">;
2001
+ }, "required", "basis" | "exact">;
2002
+ limits: import("convex/values").VObject<{
2003
+ routesPerDay: number;
2004
+ rows: number;
2005
+ transitionSlots: number;
2006
+ }, {
2007
+ routesPerDay: import("convex/values").VFloat64<number, "required">;
2008
+ transitionSlots: import("convex/values").VFloat64<number, "required">;
2009
+ rows: import("convex/values").VFloat64<number, "required">;
2010
+ }, "required", "routesPerDay" | "rows" | "transitionSlots">;
2011
+ }, "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">;
2012
+ }, "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
2013
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
417
2014
  authorize: AnalyticsAuthorizer;
418
2015
  }): {
@@ -474,6 +2071,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
474
2071
  latitude?: number | undefined;
475
2072
  longitude?: number | undefined;
476
2073
  os?: string | undefined;
2074
+ visitorKey?: string | undefined;
477
2075
  } | undefined;
478
2076
  events: {
479
2077
  affiliateSlug?: string | undefined;
@@ -489,7 +2087,8 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
489
2087
  sessionId: string;
490
2088
  target?: string | undefined;
491
2089
  timestamp: number;
492
- type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview";
2090
+ type: "click" | "conversion" | "custom" | "heartbeat" | "leave" | "outbound" | "pageview" | "vital";
2091
+ value?: number | undefined;
493
2092
  visitorId: string;
494
2093
  }[];
495
2094
  origin: string;
@@ -515,6 +2114,14 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
515
2114
  duplicates: number;
516
2115
  rejected: number;
517
2116
  }>>;
2117
+ linkVisitor: import("convex/server").RegisteredMutation<"public", {
2118
+ previousVisitorId: string;
2119
+ siteId: string;
2120
+ visitorId: string;
2121
+ }, Promise<{
2122
+ aliasCount: number;
2123
+ linked: boolean;
2124
+ }>>;
518
2125
  overview: import("convex/server").RegisteredQuery<"public", {
519
2126
  from: number;
520
2127
  interval?: "day" | "hour" | undefined;
@@ -524,11 +2131,53 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
524
2131
  currency: string;
525
2132
  from: number;
526
2133
  interval: "hour" | "day";
2134
+ metadata: {
2135
+ breakdowns: {
2136
+ topBrowsers: "pageviews" | "sessions" | "eventVolume";
2137
+ topCampaigns: "pageviews" | "sessions" | "eventVolume";
2138
+ topCountries: "pageviews" | "sessions" | "eventVolume";
2139
+ topDevices: "pageviews" | "sessions" | "eventVolume";
2140
+ topEvents: "eventVolume";
2141
+ topGoals: "goalCompletionVolume";
2142
+ topPages: "pageviews" | "sessions" | "eventVolume";
2143
+ topSources: "pageviews" | "sessions" | "eventVolume";
2144
+ };
2145
+ coverage: {
2146
+ availableFrom: number | null;
2147
+ availableThrough: number | null;
2148
+ generation: number | null;
2149
+ retainedBefore: number | null;
2150
+ state: "complete" | "partial" | "retained" | "unavailable";
2151
+ };
2152
+ engagement: "counted" | "unavailable";
2153
+ features: {
2154
+ botDetection: "userAgent";
2155
+ errorInsights: "unsupported";
2156
+ outboundLinks: "eventVolume";
2157
+ sessionReplay: "unsupported";
2158
+ };
2159
+ range: {
2160
+ boundary: "inclusive";
2161
+ from: number;
2162
+ timezone: string;
2163
+ to: number;
2164
+ };
2165
+ visitors: {
2166
+ basis: "estimatedUnique" | "bucketOccurrences";
2167
+ exact: boolean;
2168
+ legacyIncomplete: boolean;
2169
+ precision: number | null;
2170
+ sketchVersion: number | null;
2171
+ };
2172
+ };
527
2173
  timeSeries: Array<{
528
2174
  clicks: number;
2175
+ continuedSessions: number;
529
2176
  conversions: number;
530
2177
  customEvents: number;
2178
+ durationMs: number;
531
2179
  events: number;
2180
+ newVisitors: number;
532
2181
  outboundClicks: number;
533
2182
  pageviews: number;
534
2183
  revenueCents: number;
@@ -542,6 +2191,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
542
2191
  revenueCents: number;
543
2192
  value: string;
544
2193
  }>;
2194
+ topCampaigns: Array<{
2195
+ count: number;
2196
+ revenueCents: number;
2197
+ value: string;
2198
+ }>;
545
2199
  topCountries: Array<{
546
2200
  count: number;
547
2201
  revenueCents: number;
@@ -574,9 +2228,12 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
574
2228
  }>;
575
2229
  totals: {
576
2230
  clicks: number;
2231
+ continuedSessions: number;
577
2232
  conversions: number;
578
2233
  customEvents: number;
2234
+ durationMs: number;
579
2235
  events: number;
2236
+ newVisitors: number;
580
2237
  outboundClicks: number;
581
2238
  pageviews: number;
582
2239
  revenueCents: number;
@@ -600,9 +2257,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
600
2257
  lastSeenAt: number;
601
2258
  latitude?: number;
602
2259
  longitude?: number;
2260
+ movedAt?: number;
603
2261
  os: string;
604
2262
  pageviewCount: number;
605
2263
  path: string;
2264
+ previousPath?: string;
606
2265
  sessionId: string;
607
2266
  siteId: string;
608
2267
  source: string;
@@ -656,6 +2315,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
656
2315
  utmMedium?: string;
657
2316
  utmSource?: string;
658
2317
  visitorId: string;
2318
+ visitorKey?: string;
659
2319
  }>;
660
2320
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
661
2321
  splitCursor?: string | null;
@@ -700,7 +2360,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
700
2360
  siteId: string;
701
2361
  target?: string;
702
2362
  timestamp: number;
703
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2363
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
704
2364
  visitorId: string;
705
2365
  }>;
706
2366
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -773,7 +2433,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
773
2433
  siteId: string;
774
2434
  target?: string;
775
2435
  timestamp: number;
776
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2436
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
777
2437
  visitorId: string;
778
2438
  }[]>>;
779
2439
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -795,6 +2455,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
795
2455
  updatedAt: number;
796
2456
  valueCents: number;
797
2457
  }>;
2458
+ metadata: {
2459
+ basis: "dailyRollup" | "boundedLegacy";
2460
+ coverage: {
2461
+ availableFrom: number | null;
2462
+ availableThrough: number | null;
2463
+ generation: number | null;
2464
+ retainedBefore: number | null;
2465
+ state: "complete" | "partial" | "retained" | "unavailable";
2466
+ };
2467
+ range: {
2468
+ boundary: "inclusive";
2469
+ from: number;
2470
+ timezone: string;
2471
+ to: number;
2472
+ };
2473
+ };
798
2474
  truncated: boolean;
799
2475
  }>>;
800
2476
  funnelsReport: import("convex/server").RegisteredQuery<"public", {
@@ -808,6 +2484,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
808
2484
  conversionWindowMs: number;
809
2485
  createdAt: number;
810
2486
  key: string;
2487
+ metadata: {
2488
+ basis: "dailyRollup" | "boundedLegacy";
2489
+ coverage: {
2490
+ availableFrom: number | null;
2491
+ availableThrough: number | null;
2492
+ generation: number | null;
2493
+ retainedBefore: number | null;
2494
+ state: "complete" | "partial" | "retained" | "unavailable";
2495
+ };
2496
+ range: {
2497
+ boundary: "inclusive";
2498
+ from: number;
2499
+ timezone: string;
2500
+ to: number;
2501
+ };
2502
+ };
811
2503
  name: string;
812
2504
  siteId: string;
813
2505
  steps: Array<{
@@ -846,8 +2538,205 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
846
2538
  updatedAt: number;
847
2539
  visits: number;
848
2540
  }>;
2541
+ metadata: {
2542
+ basis: "dailyRollup" | "boundedLegacy";
2543
+ coverage: {
2544
+ availableFrom: number | null;
2545
+ availableThrough: number | null;
2546
+ generation: number | null;
2547
+ retainedBefore: number | null;
2548
+ state: "complete" | "partial" | "retained" | "unavailable";
2549
+ };
2550
+ range: {
2551
+ boundary: "inclusive";
2552
+ from: number;
2553
+ timezone: string;
2554
+ to: number;
2555
+ };
2556
+ uniqueVisitors: {
2557
+ basis: "estimatedUnique" | "exactLegacy";
2558
+ exact: boolean;
2559
+ };
2560
+ };
2561
+ truncated: boolean;
2562
+ }>>;
2563
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2564
+ from: number;
2565
+ siteId: string;
2566
+ to: number;
2567
+ }, Promise<{
2568
+ metadata: {
2569
+ basis: "dailyRollup" | "boundedLegacy";
2570
+ coverage: {
2571
+ availableFrom: number | null;
2572
+ availableThrough: number | null;
2573
+ generation: number | null;
2574
+ retainedBefore: number | null;
2575
+ state: "complete" | "partial" | "retained" | "unavailable";
2576
+ };
2577
+ range: {
2578
+ boundary: "inclusive";
2579
+ from: number;
2580
+ timezone: string;
2581
+ to: number;
2582
+ };
2583
+ };
2584
+ metrics: Array<{
2585
+ average: number;
2586
+ count: number;
2587
+ devices: Array<{
2588
+ average: number;
2589
+ count: number;
2590
+ device: string;
2591
+ good: number;
2592
+ needsImprovement: number;
2593
+ p75: number;
2594
+ poor: number;
2595
+ }>;
2596
+ good: number;
2597
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2598
+ needsImprovement: number;
2599
+ p75: number;
2600
+ pages: Array<{
2601
+ average: number;
2602
+ count: number;
2603
+ good: number;
2604
+ needsImprovement: number;
2605
+ p75: number;
2606
+ page: string;
2607
+ poor: number;
2608
+ }>;
2609
+ poor: number;
2610
+ timeSeries: Array<{
2611
+ count: number;
2612
+ p75: number;
2613
+ timestamp: number;
2614
+ }>;
2615
+ }>;
849
2616
  truncated: boolean;
850
2617
  }>>;
2618
+ siteMap: import("convex/server").RegisteredQuery<"public", {
2619
+ from: number;
2620
+ siteIds: string[];
2621
+ to: number;
2622
+ }, Promise<{
2623
+ from: number;
2624
+ metadata: {
2625
+ basis: "dailyRollup" | "boundedLegacy";
2626
+ coverage: {
2627
+ availableFrom: number | null;
2628
+ availableThrough: number | null;
2629
+ generation: number | null;
2630
+ retainedBefore: number | null;
2631
+ state: "complete" | "partial" | "retained" | "unavailable";
2632
+ };
2633
+ limits: {
2634
+ routesPerDay: number;
2635
+ rows: number;
2636
+ transitionSlots: number;
2637
+ };
2638
+ range: {
2639
+ boundary: "inclusive";
2640
+ from: number;
2641
+ timezone: string;
2642
+ to: number;
2643
+ };
2644
+ visitors: {
2645
+ basis: "estimatedUnique";
2646
+ exact: boolean;
2647
+ };
2648
+ };
2649
+ routes: Array<{
2650
+ bounces: number;
2651
+ daily: Array<{
2652
+ bucketStart: number;
2653
+ pageviews: number;
2654
+ }>;
2655
+ dwellMs: number;
2656
+ dwellSamples: number;
2657
+ entries: number;
2658
+ exits: number;
2659
+ pageviews: number;
2660
+ route: string;
2661
+ transitionsIn: number;
2662
+ transitionsOut: number;
2663
+ visitors: number;
2664
+ }>;
2665
+ to: number;
2666
+ transitions: Array<{
2667
+ count: number;
2668
+ from: string;
2669
+ to: string;
2670
+ }>;
2671
+ truncated: {
2672
+ routes: boolean;
2673
+ transitions: boolean;
2674
+ };
2675
+ window: {
2676
+ from: number;
2677
+ to: number;
2678
+ } | null;
2679
+ }>>;
2680
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
2681
+ from: number;
2682
+ siteId: string;
2683
+ to: number;
2684
+ }, Promise<{
2685
+ datasets: Array<{
2686
+ coverage: {
2687
+ availableFrom: number | null;
2688
+ availableThrough: number | null;
2689
+ generation: number | null;
2690
+ retainedBefore: number | null;
2691
+ state: "complete" | "partial" | "retained" | "unavailable";
2692
+ };
2693
+ dataset: "overviewHour" | "overviewDay" | "overviewLocalDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
2694
+ }>;
2695
+ from: number;
2696
+ siteId: string;
2697
+ to: number;
2698
+ }>>;
2699
+ retentionStatus: import("convex/server").RegisteredQuery<"public", {
2700
+ siteId: string;
2701
+ }, Promise<{
2702
+ backlog: number;
2703
+ jobs: Array<{
2704
+ before: number;
2705
+ deleted: number;
2706
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
2707
+ scheduledAt: number | null;
2708
+ status: "pending" | "running" | "complete";
2709
+ updatedAt: number;
2710
+ }>;
2711
+ policy: {
2712
+ aggregatesDays: number;
2713
+ conversionsDays: number;
2714
+ eventsDays: number;
2715
+ reportsDays: number;
2716
+ sessionsDays: number;
2717
+ updatedAt: number;
2718
+ } | null;
2719
+ }>>;
2720
+ setRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2721
+ aggregatesDays: number;
2722
+ conversionsDays: number;
2723
+ eventsDays: number;
2724
+ reportsDays: number;
2725
+ sessionsDays: number;
2726
+ siteId: string;
2727
+ }, Promise<null>>;
2728
+ disableRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2729
+ siteId: string;
2730
+ }, Promise<null>>;
2731
+ runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2732
+ batchSize?: number | undefined;
2733
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "siteMapRollups" | "vitalRollups";
2734
+ siteId: string;
2735
+ }, Promise<{
2736
+ before: number;
2737
+ deleted: number;
2738
+ hasMore: boolean;
2739
+ }>>;
851
2740
  upsertGoal: import("convex/server").RegisteredMutation<"public", {
852
2741
  active?: boolean | undefined;
853
2742
  goalId?: string | undefined;
@@ -942,16 +2831,785 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
942
2831
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
943
2832
  batchSize?: number | undefined;
944
2833
  before: number;
945
- kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2834
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
946
2835
  siteId: string;
947
2836
  }, Promise<{
2837
+ before: number;
948
2838
  deleted: number;
949
2839
  hasMore: boolean;
950
2840
  }>>;
951
2841
  };
2842
+ /**
2843
+ * Exposes the reactive read surface a federated Rastro dashboard subscribes to,
2844
+ * plus the configuration functions behind the `configure` capability, which
2845
+ * run only when the token and the host's grant both carry the configure
2846
+ * permission.
2847
+ */
2848
+ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, options: FederatedAnalyticsAuthorizerOptions): {
2849
+ manifest: import("convex/server").RegisteredQuery<"public", {}, {
2850
+ protocol: "amage-rastro-analytics";
2851
+ protocolVersion: 1;
2852
+ moduleName: "rastroFederation";
2853
+ functions: {
2854
+ manifest: "manifest";
2855
+ connectionStatus: "connectionStatus";
2856
+ listSites: "listSites";
2857
+ overview: "overview";
2858
+ liveVisitors: "liveVisitors";
2859
+ listSessions: "listSessions";
2860
+ sessionJourney: "sessionJourney";
2861
+ listConversions: "listConversions";
2862
+ visitorJourney: "visitorJourney";
2863
+ goalsReport: "goalsReport";
2864
+ funnelsReport: "funnelsReport";
2865
+ affiliatesReport: "affiliatesReport";
2866
+ dataCoverage: "dataCoverage";
2867
+ siteSettings: "siteSettings";
2868
+ updateSite: "updateSite";
2869
+ listGoals: "listGoals";
2870
+ upsertGoal: "upsertGoal";
2871
+ removeGoal: "removeGoal";
2872
+ listFunnels: "listFunnels";
2873
+ upsertFunnel: "upsertFunnel";
2874
+ removeFunnel: "removeFunnel";
2875
+ listAffiliates: "listAffiliates";
2876
+ upsertAffiliate: "upsertAffiliate";
2877
+ removeAffiliate: "removeAffiliate";
2878
+ retentionStatus: "retentionStatus";
2879
+ setRetentionPolicy: "setRetentionPolicy";
2880
+ disableRetentionPolicy: "disableRetentionPolicy";
2881
+ vitalsReport: "vitalsReport";
2882
+ siteMap: "siteMap";
2883
+ };
2884
+ capabilities: ("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
2885
+ limits: {
2886
+ maxSitesPerRequest: 10;
2887
+ maxSitesPerConnection: 10;
2888
+ maxReportRangeDays: 366;
2889
+ maxLiveVisitors: 500;
2890
+ maxJourneyEvents: 500;
2891
+ };
2892
+ }>;
2893
+ connectionStatus: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedAnalyticsConnectionStatus>>;
2894
+ listSites: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedSiteSummary[]>>;
2895
+ overview: import("convex/server").RegisteredQuery<"public", {
2896
+ from: number;
2897
+ interval?: "day" | "hour" | undefined;
2898
+ siteIds: string[];
2899
+ to: number;
2900
+ }, Promise<{
2901
+ currency: string;
2902
+ from: number;
2903
+ interval: "hour" | "day";
2904
+ metadata: {
2905
+ breakdowns: {
2906
+ topBrowsers: "pageviews" | "sessions" | "eventVolume";
2907
+ topCampaigns: "pageviews" | "sessions" | "eventVolume";
2908
+ topCountries: "pageviews" | "sessions" | "eventVolume";
2909
+ topDevices: "pageviews" | "sessions" | "eventVolume";
2910
+ topEvents: "eventVolume";
2911
+ topGoals: "goalCompletionVolume";
2912
+ topPages: "pageviews" | "sessions" | "eventVolume";
2913
+ topSources: "pageviews" | "sessions" | "eventVolume";
2914
+ };
2915
+ coverage: {
2916
+ availableFrom: number | null;
2917
+ availableThrough: number | null;
2918
+ generation: number | null;
2919
+ retainedBefore: number | null;
2920
+ state: "complete" | "partial" | "retained" | "unavailable";
2921
+ };
2922
+ engagement: "counted" | "unavailable";
2923
+ features: {
2924
+ botDetection: "userAgent";
2925
+ errorInsights: "unsupported";
2926
+ outboundLinks: "eventVolume";
2927
+ sessionReplay: "unsupported";
2928
+ };
2929
+ range: {
2930
+ boundary: "inclusive";
2931
+ from: number;
2932
+ timezone: string;
2933
+ to: number;
2934
+ };
2935
+ visitors: {
2936
+ basis: "estimatedUnique" | "bucketOccurrences";
2937
+ exact: boolean;
2938
+ legacyIncomplete: boolean;
2939
+ precision: number | null;
2940
+ sketchVersion: number | null;
2941
+ };
2942
+ };
2943
+ timeSeries: Array<{
2944
+ clicks: number;
2945
+ continuedSessions: number;
2946
+ conversions: number;
2947
+ customEvents: number;
2948
+ durationMs: number;
2949
+ events: number;
2950
+ newVisitors: number;
2951
+ outboundClicks: number;
2952
+ pageviews: number;
2953
+ revenueCents: number;
2954
+ sessions: number;
2955
+ timestamp: number;
2956
+ visitors: number;
2957
+ }>;
2958
+ to: number;
2959
+ topBrowsers: Array<{
2960
+ count: number;
2961
+ revenueCents: number;
2962
+ value: string;
2963
+ }>;
2964
+ topCampaigns: Array<{
2965
+ count: number;
2966
+ revenueCents: number;
2967
+ value: string;
2968
+ }>;
2969
+ topCountries: Array<{
2970
+ count: number;
2971
+ revenueCents: number;
2972
+ value: string;
2973
+ }>;
2974
+ topDevices: Array<{
2975
+ count: number;
2976
+ revenueCents: number;
2977
+ value: string;
2978
+ }>;
2979
+ topEvents: Array<{
2980
+ count: number;
2981
+ revenueCents: number;
2982
+ value: string;
2983
+ }>;
2984
+ topGoals: Array<{
2985
+ count: number;
2986
+ revenueCents: number;
2987
+ value: string;
2988
+ }>;
2989
+ topPages: Array<{
2990
+ count: number;
2991
+ revenueCents: number;
2992
+ value: string;
2993
+ }>;
2994
+ topSources: Array<{
2995
+ count: number;
2996
+ revenueCents: number;
2997
+ value: string;
2998
+ }>;
2999
+ totals: {
3000
+ clicks: number;
3001
+ continuedSessions: number;
3002
+ conversions: number;
3003
+ customEvents: number;
3004
+ durationMs: number;
3005
+ events: number;
3006
+ newVisitors: number;
3007
+ outboundClicks: number;
3008
+ pageviews: number;
3009
+ revenueCents: number;
3010
+ sessions: number;
3011
+ visitors: number;
3012
+ };
3013
+ }>>;
3014
+ liveVisitors: import("convex/server").RegisteredQuery<"public", {
3015
+ limit?: number | undefined;
3016
+ now: number;
3017
+ siteIds: string[];
3018
+ }, Promise<{
3019
+ _creationTime: number;
3020
+ _id: string;
3021
+ browser: string;
3022
+ city?: string;
3023
+ country?: string;
3024
+ device: string;
3025
+ eventCount: number;
3026
+ expiresAt: number;
3027
+ lastSeenAt: number;
3028
+ latitude?: number;
3029
+ longitude?: number;
3030
+ movedAt?: number;
3031
+ os: string;
3032
+ pageviewCount: number;
3033
+ path: string;
3034
+ previousPath?: string;
3035
+ sessionId: string;
3036
+ siteId: string;
3037
+ source: string;
3038
+ startedAt: number;
3039
+ visitorId: string;
3040
+ }[]>>;
3041
+ listSessions: import("convex/server").RegisteredQuery<"public", {
3042
+ from: number;
3043
+ paginationOpts: {
3044
+ id?: number;
3045
+ endCursor?: string | null;
3046
+ maximumRowsRead?: number;
3047
+ maximumBytesRead?: number;
3048
+ numItems: number;
3049
+ cursor: string | null;
3050
+ };
3051
+ siteId: string;
3052
+ to: number;
3053
+ }, Promise<{
3054
+ continueCursor: string;
3055
+ isDone: boolean;
3056
+ page: Array<{
3057
+ _creationTime: number;
3058
+ _id: string;
3059
+ affiliateAttributedAt?: number;
3060
+ affiliateExpiresAt?: number;
3061
+ affiliateId?: string;
3062
+ affiliateSlug?: string;
3063
+ browser: string;
3064
+ city?: string;
3065
+ conversionCount: number;
3066
+ country?: string;
3067
+ currency?: string;
3068
+ device: string;
3069
+ durationMs: number;
3070
+ entryPath: string;
3071
+ eventCount: number;
3072
+ exitPath: string;
3073
+ lastSeenAt: number;
3074
+ latitude?: number;
3075
+ longitude?: number;
3076
+ os: string;
3077
+ pageviewCount: number;
3078
+ referrer?: string;
3079
+ revenueCents: number;
3080
+ sessionId: string;
3081
+ siteId: string;
3082
+ source: string;
3083
+ startedAt: number;
3084
+ utmCampaign?: string;
3085
+ utmMedium?: string;
3086
+ utmSource?: string;
3087
+ visitorId: string;
3088
+ visitorKey?: string;
3089
+ }>;
3090
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3091
+ splitCursor?: string | null;
3092
+ }>>;
3093
+ sessionJourney: import("convex/server").RegisteredQuery<"public", {
3094
+ from: number;
3095
+ paginationOpts: {
3096
+ id?: number;
3097
+ endCursor?: string | null;
3098
+ maximumRowsRead?: number;
3099
+ maximumBytesRead?: number;
3100
+ numItems: number;
3101
+ cursor: string | null;
3102
+ };
3103
+ sessionId: string;
3104
+ siteId: string;
3105
+ to: number;
3106
+ }, Promise<{
3107
+ continueCursor: string;
3108
+ isDone: boolean;
3109
+ page: Array<{
3110
+ _creationTime: number;
3111
+ _id: string;
3112
+ affiliateSlug?: string;
3113
+ browser: string;
3114
+ city?: string;
3115
+ country?: string;
3116
+ currency?: string;
3117
+ device: string;
3118
+ eventId: string;
3119
+ href?: string;
3120
+ latitude?: number;
3121
+ longitude?: number;
3122
+ name?: string;
3123
+ os: string;
3124
+ path: string;
3125
+ properties?: Record<string, string | number | boolean | null>;
3126
+ referrer?: string;
3127
+ revenueCents?: number;
3128
+ sequence: number;
3129
+ sessionId: string;
3130
+ siteId: string;
3131
+ target?: string;
3132
+ timestamp: number;
3133
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
3134
+ visitorId: string;
3135
+ }>;
3136
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3137
+ splitCursor?: string | null;
3138
+ }>>;
3139
+ listConversions: import("convex/server").RegisteredQuery<"public", {
3140
+ from: number;
3141
+ paginationOpts: {
3142
+ id?: number;
3143
+ endCursor?: string | null;
3144
+ maximumRowsRead?: number;
3145
+ maximumBytesRead?: number;
3146
+ numItems: number;
3147
+ cursor: string | null;
3148
+ };
3149
+ siteId: string;
3150
+ to: number;
3151
+ }, Promise<{
3152
+ continueCursor: string;
3153
+ isDone: boolean;
3154
+ page: Array<{
3155
+ _creationTime: number;
3156
+ _id: string;
3157
+ affiliateAttributedAt?: number;
3158
+ affiliateExpiresAt?: number;
3159
+ affiliateId?: string;
3160
+ affiliateSlug?: string;
3161
+ commissionCents: number;
3162
+ currency: string;
3163
+ eventId: string;
3164
+ goalKey?: string;
3165
+ path: string;
3166
+ revenueCents: number;
3167
+ sessionId: string;
3168
+ siteId: string;
3169
+ source: "tracker" | "trusted";
3170
+ timestamp: number;
3171
+ visitorId: string;
3172
+ }>;
3173
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
3174
+ splitCursor?: string | null;
3175
+ }>>;
3176
+ visitorJourney: import("convex/server").RegisteredQuery<"public", {
3177
+ from: number;
3178
+ limit?: number | undefined;
3179
+ siteIds: string[];
3180
+ to: number;
3181
+ visitorId: string;
3182
+ }, Promise<{
3183
+ _creationTime: number;
3184
+ _id: string;
3185
+ affiliateSlug?: string;
3186
+ browser: string;
3187
+ city?: string;
3188
+ country?: string;
3189
+ currency?: string;
3190
+ device: string;
3191
+ eventId: string;
3192
+ href?: string;
3193
+ latitude?: number;
3194
+ longitude?: number;
3195
+ name?: string;
3196
+ os: string;
3197
+ path: string;
3198
+ properties?: Record<string, string | number | boolean | null>;
3199
+ referrer?: string;
3200
+ revenueCents?: number;
3201
+ sequence: number;
3202
+ sessionId: string;
3203
+ siteId: string;
3204
+ target?: string;
3205
+ timestamp: number;
3206
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "leave" | "outbound" | "vital";
3207
+ visitorId: string;
3208
+ }[]>>;
3209
+ goalsReport: import("convex/server").RegisteredQuery<"public", {
3210
+ from: number;
3211
+ siteId: string;
3212
+ to: number;
3213
+ }, Promise<{
3214
+ goals: Array<{
3215
+ _creationTime: number;
3216
+ _id: string;
3217
+ active: boolean;
3218
+ completions: number;
3219
+ createdAt: number;
3220
+ key: string;
3221
+ matchType: "pageview" | "custom";
3222
+ matchValue: string;
3223
+ name: string;
3224
+ siteId: string;
3225
+ updatedAt: number;
3226
+ valueCents: number;
3227
+ }>;
3228
+ metadata: {
3229
+ basis: "dailyRollup" | "boundedLegacy";
3230
+ coverage: {
3231
+ availableFrom: number | null;
3232
+ availableThrough: number | null;
3233
+ generation: number | null;
3234
+ retainedBefore: number | null;
3235
+ state: "complete" | "partial" | "retained" | "unavailable";
3236
+ };
3237
+ range: {
3238
+ boundary: "inclusive";
3239
+ from: number;
3240
+ timezone: string;
3241
+ to: number;
3242
+ };
3243
+ };
3244
+ truncated: boolean;
3245
+ }>>;
3246
+ funnelsReport: import("convex/server").RegisteredQuery<"public", {
3247
+ from: number;
3248
+ siteId: string;
3249
+ to: number;
3250
+ }, Promise<{
3251
+ _creationTime: number;
3252
+ _id: string;
3253
+ active: boolean;
3254
+ conversionWindowMs: number;
3255
+ createdAt: number;
3256
+ key: string;
3257
+ metadata: {
3258
+ basis: "dailyRollup" | "boundedLegacy";
3259
+ coverage: {
3260
+ availableFrom: number | null;
3261
+ availableThrough: number | null;
3262
+ generation: number | null;
3263
+ retainedBefore: number | null;
3264
+ state: "complete" | "partial" | "retained" | "unavailable";
3265
+ };
3266
+ range: {
3267
+ boundary: "inclusive";
3268
+ from: number;
3269
+ timezone: string;
3270
+ to: number;
3271
+ };
3272
+ };
3273
+ name: string;
3274
+ siteId: string;
3275
+ steps: Array<{
3276
+ name: string;
3277
+ type: "pageview" | "custom";
3278
+ value: string;
3279
+ }>;
3280
+ stepsReport: Array<{
3281
+ completions: number;
3282
+ entrants: number;
3283
+ name: string;
3284
+ step: number;
3285
+ }>;
3286
+ truncated: boolean;
3287
+ updatedAt: number;
3288
+ }[]>>;
3289
+ affiliatesReport: import("convex/server").RegisteredQuery<"public", {
3290
+ from: number;
3291
+ siteId: string;
3292
+ to: number;
3293
+ }, Promise<{
3294
+ affiliates: Array<{
3295
+ _creationTime: number;
3296
+ _id: string;
3297
+ active: boolean;
3298
+ attributionWindowDays: number;
3299
+ commissionBps: number;
3300
+ commissionCents: number;
3301
+ conversions: number;
3302
+ createdAt: number;
3303
+ name: string;
3304
+ revenueCents: number;
3305
+ siteId: string;
3306
+ slug: string;
3307
+ uniqueVisitors: number;
3308
+ updatedAt: number;
3309
+ visits: number;
3310
+ }>;
3311
+ metadata: {
3312
+ basis: "dailyRollup" | "boundedLegacy";
3313
+ coverage: {
3314
+ availableFrom: number | null;
3315
+ availableThrough: number | null;
3316
+ generation: number | null;
3317
+ retainedBefore: number | null;
3318
+ state: "complete" | "partial" | "retained" | "unavailable";
3319
+ };
3320
+ range: {
3321
+ boundary: "inclusive";
3322
+ from: number;
3323
+ timezone: string;
3324
+ to: number;
3325
+ };
3326
+ uniqueVisitors: {
3327
+ basis: "estimatedUnique" | "exactLegacy";
3328
+ exact: boolean;
3329
+ };
3330
+ };
3331
+ truncated: boolean;
3332
+ }>>;
3333
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
3334
+ from: number;
3335
+ siteId: string;
3336
+ to: number;
3337
+ }, Promise<{
3338
+ metadata: {
3339
+ basis: "dailyRollup" | "boundedLegacy";
3340
+ coverage: {
3341
+ availableFrom: number | null;
3342
+ availableThrough: number | null;
3343
+ generation: number | null;
3344
+ retainedBefore: number | null;
3345
+ state: "complete" | "partial" | "retained" | "unavailable";
3346
+ };
3347
+ range: {
3348
+ boundary: "inclusive";
3349
+ from: number;
3350
+ timezone: string;
3351
+ to: number;
3352
+ };
3353
+ };
3354
+ metrics: Array<{
3355
+ average: number;
3356
+ count: number;
3357
+ devices: Array<{
3358
+ average: number;
3359
+ count: number;
3360
+ device: string;
3361
+ good: number;
3362
+ needsImprovement: number;
3363
+ p75: number;
3364
+ poor: number;
3365
+ }>;
3366
+ good: number;
3367
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
3368
+ needsImprovement: number;
3369
+ p75: number;
3370
+ pages: Array<{
3371
+ average: number;
3372
+ count: number;
3373
+ good: number;
3374
+ needsImprovement: number;
3375
+ p75: number;
3376
+ page: string;
3377
+ poor: number;
3378
+ }>;
3379
+ poor: number;
3380
+ timeSeries: Array<{
3381
+ count: number;
3382
+ p75: number;
3383
+ timestamp: number;
3384
+ }>;
3385
+ }>;
3386
+ truncated: boolean;
3387
+ }>>;
3388
+ siteMap: import("convex/server").RegisteredQuery<"public", {
3389
+ from: number;
3390
+ siteIds: string[];
3391
+ to: number;
3392
+ }, Promise<{
3393
+ from: number;
3394
+ metadata: {
3395
+ basis: "dailyRollup" | "boundedLegacy";
3396
+ coverage: {
3397
+ availableFrom: number | null;
3398
+ availableThrough: number | null;
3399
+ generation: number | null;
3400
+ retainedBefore: number | null;
3401
+ state: "complete" | "partial" | "retained" | "unavailable";
3402
+ };
3403
+ limits: {
3404
+ routesPerDay: number;
3405
+ rows: number;
3406
+ transitionSlots: number;
3407
+ };
3408
+ range: {
3409
+ boundary: "inclusive";
3410
+ from: number;
3411
+ timezone: string;
3412
+ to: number;
3413
+ };
3414
+ visitors: {
3415
+ basis: "estimatedUnique";
3416
+ exact: boolean;
3417
+ };
3418
+ };
3419
+ routes: Array<{
3420
+ bounces: number;
3421
+ daily: Array<{
3422
+ bucketStart: number;
3423
+ pageviews: number;
3424
+ }>;
3425
+ dwellMs: number;
3426
+ dwellSamples: number;
3427
+ entries: number;
3428
+ exits: number;
3429
+ pageviews: number;
3430
+ route: string;
3431
+ transitionsIn: number;
3432
+ transitionsOut: number;
3433
+ visitors: number;
3434
+ }>;
3435
+ to: number;
3436
+ transitions: Array<{
3437
+ count: number;
3438
+ from: string;
3439
+ to: string;
3440
+ }>;
3441
+ truncated: {
3442
+ routes: boolean;
3443
+ transitions: boolean;
3444
+ };
3445
+ window: {
3446
+ from: number;
3447
+ to: number;
3448
+ } | null;
3449
+ }>>;
3450
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
3451
+ from: number;
3452
+ siteId: string;
3453
+ to: number;
3454
+ }, Promise<{
3455
+ datasets: Array<{
3456
+ coverage: {
3457
+ availableFrom: number | null;
3458
+ availableThrough: number | null;
3459
+ generation: number | null;
3460
+ retainedBefore: number | null;
3461
+ state: "complete" | "partial" | "retained" | "unavailable";
3462
+ };
3463
+ dataset: "overviewHour" | "overviewDay" | "overviewLocalDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals" | "siteMap";
3464
+ }>;
3465
+ from: number;
3466
+ siteId: string;
3467
+ to: number;
3468
+ }>>;
3469
+ siteSettings: import("convex/server").RegisteredQuery<"public", {
3470
+ siteId: string;
3471
+ }, Promise<{
3472
+ siteId: string;
3473
+ name: string;
3474
+ domains: string[];
3475
+ timezone: string | null;
3476
+ currency: string;
3477
+ cookieless: boolean;
3478
+ }>>;
3479
+ updateSite: import("convex/server").RegisteredMutation<"public", {
3480
+ domains?: string[] | undefined;
3481
+ name?: string | undefined;
3482
+ siteId: string;
3483
+ timezone?: string | null | undefined;
3484
+ }, Promise<null>>;
3485
+ listGoals: import("convex/server").RegisteredQuery<"public", {
3486
+ siteId: string;
3487
+ }, Promise<{
3488
+ _creationTime: number;
3489
+ _id: string;
3490
+ active: boolean;
3491
+ createdAt: number;
3492
+ key: string;
3493
+ matchType: "pageview" | "custom";
3494
+ matchValue: string;
3495
+ name: string;
3496
+ siteId: string;
3497
+ updatedAt: number;
3498
+ valueCents?: number;
3499
+ }[]>>;
3500
+ upsertGoal: import("convex/server").RegisteredMutation<"public", {
3501
+ active?: boolean | undefined;
3502
+ goalId?: string | undefined;
3503
+ key: string;
3504
+ matchType: "custom" | "pageview";
3505
+ matchValue: string;
3506
+ name: string;
3507
+ siteId: string;
3508
+ valueCents?: number | undefined;
3509
+ }, Promise<string>>;
3510
+ removeGoal: import("convex/server").RegisteredMutation<"public", {
3511
+ goalId: string;
3512
+ siteId: string;
3513
+ }, Promise<null>>;
3514
+ listFunnels: import("convex/server").RegisteredQuery<"public", {
3515
+ siteId: string;
3516
+ }, Promise<{
3517
+ _creationTime: number;
3518
+ _id: string;
3519
+ active: boolean;
3520
+ conversionWindowMs: number;
3521
+ createdAt: number;
3522
+ key: string;
3523
+ name: string;
3524
+ siteId: string;
3525
+ steps: Array<{
3526
+ name: string;
3527
+ type: "pageview" | "custom";
3528
+ value: string;
3529
+ }>;
3530
+ updatedAt: number;
3531
+ }[]>>;
3532
+ upsertFunnel: import("convex/server").RegisteredMutation<"public", {
3533
+ active?: boolean | undefined;
3534
+ conversionWindowMs: number;
3535
+ funnelId?: string | undefined;
3536
+ key: string;
3537
+ name: string;
3538
+ siteId: string;
3539
+ steps: {
3540
+ name: string;
3541
+ type: "custom" | "pageview";
3542
+ value: string;
3543
+ }[];
3544
+ }, Promise<string>>;
3545
+ removeFunnel: import("convex/server").RegisteredMutation<"public", {
3546
+ funnelId: string;
3547
+ siteId: string;
3548
+ }, Promise<null>>;
3549
+ listAffiliates: import("convex/server").RegisteredQuery<"public", {
3550
+ siteId: string;
3551
+ }, Promise<{
3552
+ _creationTime: number;
3553
+ _id: string;
3554
+ active: boolean;
3555
+ attributionWindowDays: number;
3556
+ commissionBps: number;
3557
+ createdAt: number;
3558
+ name: string;
3559
+ siteId: string;
3560
+ slug: string;
3561
+ updatedAt: number;
3562
+ }[]>>;
3563
+ upsertAffiliate: import("convex/server").RegisteredMutation<"public", {
3564
+ active?: boolean | undefined;
3565
+ affiliateId?: string | undefined;
3566
+ attributionWindowDays: number;
3567
+ commissionBps: number;
3568
+ name: string;
3569
+ siteId: string;
3570
+ slug: string;
3571
+ }, Promise<string>>;
3572
+ removeAffiliate: import("convex/server").RegisteredMutation<"public", {
3573
+ affiliateId: string;
3574
+ siteId: string;
3575
+ }, Promise<null>>;
3576
+ retentionStatus: import("convex/server").RegisteredQuery<"public", {
3577
+ siteId: string;
3578
+ }, Promise<{
3579
+ backlog: number;
3580
+ jobs: Array<{
3581
+ before: number;
3582
+ deleted: number;
3583
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "siteMapRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
3584
+ scheduledAt: number | null;
3585
+ status: "pending" | "running" | "complete";
3586
+ updatedAt: number;
3587
+ }>;
3588
+ policy: {
3589
+ aggregatesDays: number;
3590
+ conversionsDays: number;
3591
+ eventsDays: number;
3592
+ reportsDays: number;
3593
+ sessionsDays: number;
3594
+ updatedAt: number;
3595
+ } | null;
3596
+ }>>;
3597
+ setRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
3598
+ aggregatesDays: number;
3599
+ conversionsDays: number;
3600
+ eventsDays: number;
3601
+ reportsDays: number;
3602
+ sessionsDays: number;
3603
+ siteId: string;
3604
+ }, Promise<null>>;
3605
+ disableRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
3606
+ siteId: string;
3607
+ }, Promise<null>>;
3608
+ };
952
3609
  export declare function componentHttpPaths(prefix?: string): {
953
3610
  readonly events: `${string}/events`;
954
3611
  readonly tracker: `${string}/tracker.js`;
3612
+ readonly vitals: `${string}/vitals.js`;
955
3613
  readonly health: `${string}/health`;
956
3614
  };
957
3615
  type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;