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

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 (124) hide show
  1. package/README.md +325 -63
  2. package/agent/integration.md +651 -0
  3. package/agent/manifest.json +183 -0
  4. package/agent/manifest.schema.json +405 -0
  5. package/dist/client/federation.d.ts +205 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +179 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +1600 -8
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +210 -2
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +9 -5
  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 +161 -1
  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/cardinality.d.ts +12 -0
  22. package/dist/component/cardinality.d.ts.map +1 -0
  23. package/dist/component/cardinality.js +94 -0
  24. package/dist/component/cardinality.js.map +1 -0
  25. package/dist/component/constants.d.ts +10 -0
  26. package/dist/component/constants.d.ts.map +1 -1
  27. package/dist/component/constants.js +10 -0
  28. package/dist/component/constants.js.map +1 -1
  29. package/dist/component/convex.config.d.ts +7 -2
  30. package/dist/component/convex.config.d.ts.map +1 -1
  31. package/dist/component/convex.config.js +9 -4
  32. package/dist/component/convex.config.js.map +1 -1
  33. package/dist/component/coverage.d.ts +18 -0
  34. package/dist/component/coverage.d.ts.map +1 -0
  35. package/dist/component/coverage.js +19 -0
  36. package/dist/component/coverage.js.map +1 -0
  37. package/dist/component/diagnostics.d.ts +9 -0
  38. package/dist/component/diagnostics.d.ts.map +1 -0
  39. package/dist/component/diagnostics.js +47 -0
  40. package/dist/component/diagnostics.js.map +1 -0
  41. package/dist/component/errors.d.ts +1 -1
  42. package/dist/component/errors.d.ts.map +1 -1
  43. package/dist/component/errors.js.map +1 -1
  44. package/dist/component/eventStore.d.ts +11 -9
  45. package/dist/component/eventStore.d.ts.map +1 -1
  46. package/dist/component/eventStore.js +55 -227
  47. package/dist/component/eventStore.js.map +1 -1
  48. package/dist/component/geo.d.ts +71 -0
  49. package/dist/component/geo.d.ts.map +1 -0
  50. package/dist/component/geo.js +610 -0
  51. package/dist/component/geo.js.map +1 -0
  52. package/dist/component/http.d.ts.map +1 -1
  53. package/dist/component/http.js +168 -17
  54. package/dist/component/http.js.map +1 -1
  55. package/dist/component/ingest.d.ts.map +1 -1
  56. package/dist/component/ingest.js +272 -32
  57. package/dist/component/ingest.js.map +1 -1
  58. package/dist/component/live.d.ts.map +1 -1
  59. package/dist/component/live.js +6 -3
  60. package/dist/component/live.js.map +1 -1
  61. package/dist/component/reports.d.ts +117 -8
  62. package/dist/component/reports.d.ts.map +1 -1
  63. package/dist/component/reports.js +641 -79
  64. package/dist/component/reports.js.map +1 -1
  65. package/dist/component/retention.d.ts +75 -1
  66. package/dist/component/retention.d.ts.map +1 -1
  67. package/dist/component/retention.js +517 -54
  68. package/dist/component/retention.js.map +1 -1
  69. package/dist/component/sanitize.d.ts +4 -1
  70. package/dist/component/sanitize.d.ts.map +1 -1
  71. package/dist/component/sanitize.js +9 -4
  72. package/dist/component/sanitize.js.map +1 -1
  73. package/dist/component/schema.d.ts +202 -53
  74. package/dist/component/schema.js +113 -16
  75. package/dist/component/schema.js.map +1 -1
  76. package/dist/component/sites.d.ts.map +1 -1
  77. package/dist/component/sites.js +5 -1
  78. package/dist/component/sites.js.map +1 -1
  79. package/dist/component/validators.d.ts +29 -51
  80. package/dist/component/validators.d.ts.map +1 -1
  81. package/dist/component/validators.js +11 -12
  82. package/dist/component/validators.js.map +1 -1
  83. package/dist/tracker/generated.d.ts +4 -4
  84. package/dist/tracker/generated.d.ts.map +1 -1
  85. package/dist/tracker/generated.js +4 -4
  86. package/dist/tracker/generated.js.map +1 -1
  87. package/dist/tracker/tracker.js +7 -6
  88. package/dist/tracker/tracker.js.map +1 -1
  89. package/dist/tracker.min.js +1 -1
  90. package/docs/benchmarks/2026-08-20-realistic.md +5 -5
  91. package/docs/benchmarks/2026-08-21-formal-certification.md +333 -0
  92. package/docs/federation-setup.md +395 -0
  93. package/docs/federation.md +258 -0
  94. package/docs/upgrading.md +130 -0
  95. package/llms.txt +65 -0
  96. package/package.json +29 -7
  97. package/scripts/benchmark-ingest.mjs +81 -32
  98. package/scripts/generate-federation-keys.mjs +20 -0
  99. package/src/component/_generated/api.ts +9 -5
  100. package/src/component/_generated/component.ts +224 -1
  101. package/src/component/_generated/server.ts +4 -0
  102. package/src/component/cardinality.ts +116 -0
  103. package/src/component/constants.ts +10 -0
  104. package/src/component/convex.config.ts +11 -5
  105. package/src/component/coverage.ts +25 -0
  106. package/src/component/diagnostics.ts +64 -0
  107. package/src/component/errors.ts +2 -1
  108. package/src/component/eventStore.ts +78 -280
  109. package/src/component/geo.ts +779 -0
  110. package/src/component/http.ts +259 -22
  111. package/src/component/ingest.ts +436 -27
  112. package/src/component/live.ts +8 -3
  113. package/src/component/reports.ts +895 -87
  114. package/src/component/retention.ts +624 -88
  115. package/src/component/sanitize.ts +15 -4
  116. package/src/component/schema.ts +125 -16
  117. package/src/component/sites.ts +5 -1
  118. package/src/component/validators.ts +12 -13
  119. package/src/test.ts +0 -2
  120. package/dist/component/migrations.d.ts +0 -17
  121. package/dist/component/migrations.d.ts.map +0 -1
  122. package/dist/component/migrations.js +0 -44
  123. package/dist/component/migrations.js.map +0 -1
  124. package/src/component/migrations.ts +0 -52
@@ -1,8 +1,12 @@
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
4
  import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator } from "../component/validators.js";
5
+ import { type FederatedAnalyticsAuthorizerOptions, type FederatedAnalyticsConnectionStatus, type FederatedSiteSummary } from "./federation.js";
4
6
  export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, };
5
7
  export type { EventProperties, EventType, FunnelStep, IngestContext, TrackerEvent, } from "../component/validators.js";
8
+ export { FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_READ_PERMISSION, } from "./federation.js";
9
+ export type { FederatedAnalyticsCapability, FederatedAnalyticsAuthorizerOptions, FederatedAnalyticsConnection, FederatedAnalyticsConnectionStatus, FederatedAnalyticsErrorCode, FederatedAnalyticsIdentity, FederatedAnalyticsManifest, FederatedSiteSummary, ResolveFederatedAnalyticsConnection, } from "./federation.js";
6
10
  export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
7
11
  export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
8
12
  export type UpdateSiteInput = FunctionArgs<ComponentApi["sites"]["update"]>;
@@ -15,7 +19,7 @@ export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatc
15
19
  export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
16
20
  export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
17
21
  export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
18
- export type Overview = FunctionReturnType<ComponentApi["reports"]["overview"]>;
22
+ export type Overview = Infer<typeof hostOverviewValidator>;
19
23
  export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
20
24
  export type LiveVisitor = FunctionReturnType<ComponentApi["reports"]["liveVisitors"]>[number];
21
25
  export type ListSessionsInput = FunctionArgs<ComponentApi["reports"]["listSessions"]>;
@@ -27,11 +31,11 @@ export type ConversionsPage = FunctionReturnType<ComponentApi["reports"]["listCo
27
31
  export type VisitorJourneyInput = FunctionArgs<ComponentApi["reports"]["visitorJourney"]>;
28
32
  export type VisitorJourney = FunctionReturnType<ComponentApi["reports"]["visitorJourney"]>;
29
33
  export type GoalsReportInput = FunctionArgs<ComponentApi["reports"]["goalsReport"]>;
30
- export type GoalsReport = FunctionReturnType<ComponentApi["reports"]["goalsReport"]>;
34
+ export type GoalsReport = Infer<typeof hostGoalsReportValidator>;
31
35
  export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsReport"]>;
32
- export type FunnelsReport = FunctionReturnType<ComponentApi["reports"]["funnelsReport"]>;
36
+ export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
33
37
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
34
- export type AffiliatesReport = FunctionReturnType<ComponentApi["reports"]["affiliatesReport"]>;
38
+ export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
35
39
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
36
40
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
37
41
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -41,8 +45,66 @@ export type Funnel = FunctionReturnType<ComponentApi["funnels"]["list"]>[number]
41
45
  export type UpsertAffiliateInput = FunctionArgs<ComponentApi["affiliates"]["upsert"]>;
42
46
  export type UpsertAffiliateOutput = FunctionReturnType<ComponentApi["affiliates"]["upsert"]>;
43
47
  export type Affiliate = FunctionReturnType<ComponentApi["affiliates"]["list"]>[number];
44
- export type CleanupInput = FunctionArgs<ComponentApi["retention"]["cleanup"]>;
45
- export type CleanupOutput = FunctionReturnType<ComponentApi["retention"]["cleanup"]>;
48
+ export type CleanupInput = {
49
+ siteId: string;
50
+ kind: RetentionKind;
51
+ before: number;
52
+ batchSize?: number;
53
+ };
54
+ export type CleanupOutput = {
55
+ deleted: number;
56
+ hasMore: boolean;
57
+ before: number;
58
+ };
59
+ export type DataCoverageInput = {
60
+ siteId: string;
61
+ from: number;
62
+ to: number;
63
+ };
64
+ export type DataCoverage = {
65
+ siteId: string;
66
+ from: number;
67
+ to: number;
68
+ datasets: Array<{
69
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
70
+ coverage: CoverageStatus;
71
+ }>;
72
+ };
73
+ export type CoverageStatus = {
74
+ state: "complete" | "partial" | "retained" | "unavailable";
75
+ generation: number | null;
76
+ availableFrom: number | null;
77
+ availableThrough: number | null;
78
+ retainedBefore: number | null;
79
+ };
80
+ export type RetentionPolicyInput = {
81
+ siteId: string;
82
+ eventsDays: number;
83
+ sessionsDays: number;
84
+ conversionsDays: number;
85
+ aggregatesDays: number;
86
+ reportsDays: number;
87
+ };
88
+ export type RetentionStatus = {
89
+ policy: (Omit<RetentionPolicyInput, "siteId"> & {
90
+ updatedAt: number;
91
+ }) | null;
92
+ jobs: Array<{
93
+ kind: string;
94
+ before: number;
95
+ status: "pending" | "running" | "complete";
96
+ deleted: number;
97
+ scheduledAt: number | null;
98
+ updatedAt: number;
99
+ }>;
100
+ backlog: number;
101
+ };
102
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
103
+ export type RunRetentionPolicyInput = {
104
+ siteId: string;
105
+ kind: RetentionKind;
106
+ batchSize?: number;
107
+ };
46
108
  export declare class Rastro {
47
109
  private readonly component;
48
110
  constructor(component: ComponentApi);
@@ -88,6 +150,43 @@ export declare class Rastro {
88
150
  currency: string;
89
151
  from: number;
90
152
  interval: "hour" | "day";
153
+ metadata: {
154
+ breakdowns: {
155
+ topBrowsers: "eventVolume";
156
+ topCountries: "eventVolume";
157
+ topDevices: "eventVolume";
158
+ topEvents: "eventVolume";
159
+ topGoals: "goalCompletionVolume";
160
+ topPages: "eventVolume";
161
+ topSources: "eventVolume";
162
+ };
163
+ coverage: {
164
+ availableFrom: number | null;
165
+ availableThrough: number | null;
166
+ generation: number | null;
167
+ retainedBefore: number | null;
168
+ state: "complete" | "partial" | "retained" | "unavailable";
169
+ };
170
+ features: {
171
+ botDetection: "unsupported";
172
+ errorInsights: "unsupported";
173
+ outboundLinks: "eventVolume";
174
+ sessionReplay: "unsupported";
175
+ };
176
+ range: {
177
+ boundary: "inclusive";
178
+ from: number;
179
+ timezone: "UTC";
180
+ to: number;
181
+ };
182
+ visitors: {
183
+ basis: "estimatedUnique" | "bucketOccurrences";
184
+ exact: boolean;
185
+ legacyIncomplete: boolean;
186
+ precision: number | null;
187
+ sketchVersion: number | null;
188
+ };
189
+ };
91
190
  timeSeries: Array<{
92
191
  clicks: number;
93
192
  conversions: number;
@@ -308,6 +407,22 @@ export declare class Rastro {
308
407
  updatedAt: number;
309
408
  valueCents: number;
310
409
  }>;
410
+ metadata: {
411
+ basis: "dailyRollup" | "boundedLegacy";
412
+ coverage: {
413
+ availableFrom: number | null;
414
+ availableThrough: number | null;
415
+ generation: number | null;
416
+ retainedBefore: number | null;
417
+ state: "complete" | "partial" | "retained" | "unavailable";
418
+ };
419
+ range: {
420
+ boundary: "inclusive";
421
+ from: number;
422
+ timezone: "UTC";
423
+ to: number;
424
+ };
425
+ };
311
426
  truncated: boolean;
312
427
  }>;
313
428
  funnelsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: FunnelsReportInput): Promise<{
@@ -317,6 +432,22 @@ export declare class Rastro {
317
432
  conversionWindowMs: number;
318
433
  createdAt: number;
319
434
  key: string;
435
+ metadata: {
436
+ basis: "dailyRollup" | "boundedLegacy";
437
+ coverage: {
438
+ availableFrom: number | null;
439
+ availableThrough: number | null;
440
+ generation: number | null;
441
+ retainedBefore: number | null;
442
+ state: "complete" | "partial" | "retained" | "unavailable";
443
+ };
444
+ range: {
445
+ boundary: "inclusive";
446
+ from: number;
447
+ timezone: "UTC";
448
+ to: number;
449
+ };
450
+ };
320
451
  name: string;
321
452
  siteId: string;
322
453
  steps: Array<{
@@ -351,6 +482,26 @@ export declare class Rastro {
351
482
  updatedAt: number;
352
483
  visits: number;
353
484
  }>;
485
+ metadata: {
486
+ basis: "dailyRollup" | "boundedLegacy";
487
+ coverage: {
488
+ availableFrom: number | null;
489
+ availableThrough: number | null;
490
+ generation: number | null;
491
+ retainedBefore: number | null;
492
+ state: "complete" | "partial" | "retained" | "unavailable";
493
+ };
494
+ range: {
495
+ boundary: "inclusive";
496
+ from: number;
497
+ timezone: "UTC";
498
+ to: number;
499
+ };
500
+ uniqueVisitors: {
501
+ basis: "estimatedUnique" | "exactLegacy";
502
+ exact: boolean;
503
+ };
504
+ };
354
505
  truncated: boolean;
355
506
  }>;
356
507
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
@@ -401,11 +552,53 @@ export declare class Rastro {
401
552
  }[]>;
402
553
  removeAffiliate(ctx: MutationCtx, siteId: string, affiliateId: string): Promise<null>;
403
554
  cleanup(ctx: MutationCtx, args: CleanupInput): Promise<{
555
+ before: number;
556
+ deleted: number;
557
+ hasMore: boolean;
558
+ }>;
559
+ dataCoverage(ctx: QueryCtx | MutationCtx | ActionCtx, args: DataCoverageInput): Promise<{
560
+ datasets: Array<{
561
+ coverage: {
562
+ availableFrom: number | null;
563
+ availableThrough: number | null;
564
+ generation: number | null;
565
+ retainedBefore: number | null;
566
+ state: "complete" | "partial" | "retained" | "unavailable";
567
+ };
568
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
569
+ }>;
570
+ from: number;
571
+ siteId: string;
572
+ to: number;
573
+ }>;
574
+ setRetentionPolicy(ctx: MutationCtx, args: RetentionPolicyInput): Promise<null>;
575
+ disableRetentionPolicy(ctx: MutationCtx, siteId: string): Promise<null>;
576
+ retentionStatus(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
577
+ backlog: number;
578
+ jobs: Array<{
579
+ before: number;
580
+ deleted: number;
581
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
582
+ scheduledAt: number | null;
583
+ status: "pending" | "running" | "complete";
584
+ updatedAt: number;
585
+ }>;
586
+ policy: {
587
+ aggregatesDays: number;
588
+ conversionsDays: number;
589
+ eventsDays: number;
590
+ reportsDays: number;
591
+ sessionsDays: number;
592
+ updatedAt: number;
593
+ } | null;
594
+ }>;
595
+ runRetentionPolicy(ctx: MutationCtx, args: RunRetentionPolicyInput): Promise<{
596
+ before: number;
404
597
  deleted: number;
405
598
  hasMore: boolean;
406
599
  }>;
407
600
  }
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";
601
+ export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup" | "retention.policy" | "retention.status" | "coverage.read";
409
602
  export type AnalyticsAuthorizationRequest = {
410
603
  operation: AnalyticsOperation;
411
604
  siteIds: string[];
@@ -413,6 +606,781 @@ export type AnalyticsAuthorizationRequest = {
413
606
  };
414
607
  export type AnalyticsAuthorizationContext = Pick<GenericQueryCtx<GenericDataModel>, "auth" | "db" | "runQuery">;
415
608
  export type AnalyticsAuthorizer = (ctx: AnalyticsAuthorizationContext, request: AnalyticsAuthorizationRequest) => void | Promise<void>;
609
+ declare const hostOverviewValidator: import("convex/values").VObject<{
610
+ currency: string;
611
+ from: number;
612
+ interval: "day" | "hour";
613
+ metadata: {
614
+ breakdowns: {
615
+ topBrowsers: "eventVolume";
616
+ topCountries: "eventVolume";
617
+ topDevices: "eventVolume";
618
+ topEvents: "eventVolume";
619
+ topGoals: "goalCompletionVolume";
620
+ topPages: "eventVolume";
621
+ topSources: "eventVolume";
622
+ };
623
+ coverage: {
624
+ availableFrom: number | null;
625
+ availableThrough: number | null;
626
+ generation: number | null;
627
+ retainedBefore: number | null;
628
+ state: "complete" | "partial" | "retained" | "unavailable";
629
+ };
630
+ features: {
631
+ botDetection: "unsupported";
632
+ errorInsights: "unsupported";
633
+ outboundLinks: "eventVolume";
634
+ sessionReplay: "unsupported";
635
+ };
636
+ range: {
637
+ boundary: "inclusive";
638
+ from: number;
639
+ timezone: "UTC";
640
+ to: number;
641
+ };
642
+ visitors: {
643
+ basis: "bucketOccurrences" | "estimatedUnique";
644
+ exact: boolean;
645
+ legacyIncomplete: boolean;
646
+ precision: number | null;
647
+ sketchVersion: number | null;
648
+ };
649
+ };
650
+ timeSeries: {
651
+ clicks: number;
652
+ conversions: number;
653
+ customEvents: number;
654
+ events: number;
655
+ outboundClicks: number;
656
+ pageviews: number;
657
+ revenueCents: number;
658
+ sessions: number;
659
+ timestamp: number;
660
+ visitors: number;
661
+ }[];
662
+ to: number;
663
+ topBrowsers: {
664
+ count: number;
665
+ revenueCents: number;
666
+ value: string;
667
+ }[];
668
+ topCountries: {
669
+ count: number;
670
+ revenueCents: number;
671
+ value: string;
672
+ }[];
673
+ topDevices: {
674
+ count: number;
675
+ revenueCents: number;
676
+ value: string;
677
+ }[];
678
+ topEvents: {
679
+ count: number;
680
+ revenueCents: number;
681
+ value: string;
682
+ }[];
683
+ topGoals: {
684
+ count: number;
685
+ revenueCents: number;
686
+ value: string;
687
+ }[];
688
+ topPages: {
689
+ count: number;
690
+ revenueCents: number;
691
+ value: string;
692
+ }[];
693
+ topSources: {
694
+ count: number;
695
+ revenueCents: number;
696
+ value: string;
697
+ }[];
698
+ totals: {
699
+ clicks: number;
700
+ conversions: number;
701
+ customEvents: number;
702
+ events: number;
703
+ outboundClicks: number;
704
+ pageviews: number;
705
+ revenueCents: number;
706
+ sessions: number;
707
+ visitors: number;
708
+ };
709
+ }, {
710
+ from: import("convex/values").VFloat64<number, "required">;
711
+ to: import("convex/values").VFloat64<number, "required">;
712
+ interval: import("convex/values").VUnion<"day" | "hour", [import("convex/values").VLiteral<"hour", "required">, import("convex/values").VLiteral<"day", "required">], "required", never>;
713
+ currency: import("convex/values").VString<string, "required">;
714
+ totals: import("convex/values").VObject<{
715
+ clicks: number;
716
+ conversions: number;
717
+ customEvents: number;
718
+ events: number;
719
+ outboundClicks: number;
720
+ pageviews: number;
721
+ revenueCents: number;
722
+ sessions: number;
723
+ visitors: number;
724
+ }, {
725
+ events: import("convex/values").VFloat64<number, "required">;
726
+ pageviews: import("convex/values").VFloat64<number, "required">;
727
+ clicks: import("convex/values").VFloat64<number, "required">;
728
+ customEvents: import("convex/values").VFloat64<number, "required">;
729
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
730
+ sessions: import("convex/values").VFloat64<number, "required">;
731
+ visitors: import("convex/values").VFloat64<number, "required">;
732
+ conversions: import("convex/values").VFloat64<number, "required">;
733
+ revenueCents: import("convex/values").VFloat64<number, "required">;
734
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "visitors">;
735
+ timeSeries: import("convex/values").VArray<{
736
+ clicks: number;
737
+ conversions: number;
738
+ customEvents: number;
739
+ events: number;
740
+ outboundClicks: number;
741
+ pageviews: number;
742
+ revenueCents: number;
743
+ sessions: number;
744
+ timestamp: number;
745
+ visitors: number;
746
+ }[], import("convex/values").VObject<{
747
+ clicks: number;
748
+ conversions: number;
749
+ customEvents: number;
750
+ events: number;
751
+ outboundClicks: number;
752
+ pageviews: number;
753
+ revenueCents: number;
754
+ sessions: number;
755
+ timestamp: number;
756
+ visitors: number;
757
+ }, {
758
+ events: import("convex/values").VFloat64<number, "required">;
759
+ pageviews: import("convex/values").VFloat64<number, "required">;
760
+ clicks: import("convex/values").VFloat64<number, "required">;
761
+ customEvents: import("convex/values").VFloat64<number, "required">;
762
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
763
+ sessions: import("convex/values").VFloat64<number, "required">;
764
+ visitors: import("convex/values").VFloat64<number, "required">;
765
+ conversions: import("convex/values").VFloat64<number, "required">;
766
+ revenueCents: import("convex/values").VFloat64<number, "required">;
767
+ timestamp: import("convex/values").VFloat64<number, "required">;
768
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "timestamp" | "visitors">, "required">;
769
+ topSources: import("convex/values").VArray<{
770
+ count: number;
771
+ revenueCents: number;
772
+ value: string;
773
+ }[], import("convex/values").VObject<{
774
+ count: number;
775
+ revenueCents: number;
776
+ value: string;
777
+ }, {
778
+ value: import("convex/values").VString<string, "required">;
779
+ count: import("convex/values").VFloat64<number, "required">;
780
+ revenueCents: import("convex/values").VFloat64<number, "required">;
781
+ }, "required", "count" | "revenueCents" | "value">, "required">;
782
+ topPages: import("convex/values").VArray<{
783
+ count: number;
784
+ revenueCents: number;
785
+ value: string;
786
+ }[], import("convex/values").VObject<{
787
+ count: number;
788
+ revenueCents: number;
789
+ value: string;
790
+ }, {
791
+ value: import("convex/values").VString<string, "required">;
792
+ count: import("convex/values").VFloat64<number, "required">;
793
+ revenueCents: import("convex/values").VFloat64<number, "required">;
794
+ }, "required", "count" | "revenueCents" | "value">, "required">;
795
+ topCountries: import("convex/values").VArray<{
796
+ count: number;
797
+ revenueCents: number;
798
+ value: string;
799
+ }[], import("convex/values").VObject<{
800
+ count: number;
801
+ revenueCents: number;
802
+ value: string;
803
+ }, {
804
+ value: import("convex/values").VString<string, "required">;
805
+ count: import("convex/values").VFloat64<number, "required">;
806
+ revenueCents: import("convex/values").VFloat64<number, "required">;
807
+ }, "required", "count" | "revenueCents" | "value">, "required">;
808
+ topDevices: import("convex/values").VArray<{
809
+ count: number;
810
+ revenueCents: number;
811
+ value: string;
812
+ }[], import("convex/values").VObject<{
813
+ count: number;
814
+ revenueCents: number;
815
+ value: string;
816
+ }, {
817
+ value: import("convex/values").VString<string, "required">;
818
+ count: import("convex/values").VFloat64<number, "required">;
819
+ revenueCents: import("convex/values").VFloat64<number, "required">;
820
+ }, "required", "count" | "revenueCents" | "value">, "required">;
821
+ topBrowsers: import("convex/values").VArray<{
822
+ count: number;
823
+ revenueCents: number;
824
+ value: string;
825
+ }[], import("convex/values").VObject<{
826
+ count: number;
827
+ revenueCents: number;
828
+ value: string;
829
+ }, {
830
+ value: import("convex/values").VString<string, "required">;
831
+ count: import("convex/values").VFloat64<number, "required">;
832
+ revenueCents: import("convex/values").VFloat64<number, "required">;
833
+ }, "required", "count" | "revenueCents" | "value">, "required">;
834
+ topEvents: import("convex/values").VArray<{
835
+ count: number;
836
+ revenueCents: number;
837
+ value: string;
838
+ }[], import("convex/values").VObject<{
839
+ count: number;
840
+ revenueCents: number;
841
+ value: string;
842
+ }, {
843
+ value: import("convex/values").VString<string, "required">;
844
+ count: import("convex/values").VFloat64<number, "required">;
845
+ revenueCents: import("convex/values").VFloat64<number, "required">;
846
+ }, "required", "count" | "revenueCents" | "value">, "required">;
847
+ topGoals: import("convex/values").VArray<{
848
+ count: number;
849
+ revenueCents: number;
850
+ value: string;
851
+ }[], import("convex/values").VObject<{
852
+ count: number;
853
+ revenueCents: number;
854
+ value: string;
855
+ }, {
856
+ value: import("convex/values").VString<string, "required">;
857
+ count: import("convex/values").VFloat64<number, "required">;
858
+ revenueCents: import("convex/values").VFloat64<number, "required">;
859
+ }, "required", "count" | "revenueCents" | "value">, "required">;
860
+ metadata: import("convex/values").VObject<{
861
+ breakdowns: {
862
+ topBrowsers: "eventVolume";
863
+ topCountries: "eventVolume";
864
+ topDevices: "eventVolume";
865
+ topEvents: "eventVolume";
866
+ topGoals: "goalCompletionVolume";
867
+ topPages: "eventVolume";
868
+ topSources: "eventVolume";
869
+ };
870
+ coverage: {
871
+ availableFrom: number | null;
872
+ availableThrough: number | null;
873
+ generation: number | null;
874
+ retainedBefore: number | null;
875
+ state: "complete" | "partial" | "retained" | "unavailable";
876
+ };
877
+ features: {
878
+ botDetection: "unsupported";
879
+ errorInsights: "unsupported";
880
+ outboundLinks: "eventVolume";
881
+ sessionReplay: "unsupported";
882
+ };
883
+ range: {
884
+ boundary: "inclusive";
885
+ from: number;
886
+ timezone: "UTC";
887
+ to: number;
888
+ };
889
+ visitors: {
890
+ basis: "bucketOccurrences" | "estimatedUnique";
891
+ exact: boolean;
892
+ legacyIncomplete: boolean;
893
+ precision: number | null;
894
+ sketchVersion: number | null;
895
+ };
896
+ }, {
897
+ visitors: import("convex/values").VObject<{
898
+ basis: "bucketOccurrences" | "estimatedUnique";
899
+ exact: boolean;
900
+ legacyIncomplete: boolean;
901
+ precision: number | null;
902
+ sketchVersion: number | null;
903
+ }, {
904
+ basis: import("convex/values").VUnion<"bucketOccurrences" | "estimatedUnique", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"bucketOccurrences", "required">], "required", never>;
905
+ exact: import("convex/values").VBoolean<boolean, "required">;
906
+ legacyIncomplete: import("convex/values").VBoolean<boolean, "required">;
907
+ sketchVersion: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
908
+ precision: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
909
+ }, "required", "basis" | "exact" | "legacyIncomplete" | "precision" | "sketchVersion">;
910
+ breakdowns: import("convex/values").VObject<{
911
+ topBrowsers: "eventVolume";
912
+ topCountries: "eventVolume";
913
+ topDevices: "eventVolume";
914
+ topEvents: "eventVolume";
915
+ topGoals: "goalCompletionVolume";
916
+ topPages: "eventVolume";
917
+ topSources: "eventVolume";
918
+ }, {
919
+ topSources: import("convex/values").VLiteral<"eventVolume", "required">;
920
+ topPages: import("convex/values").VLiteral<"eventVolume", "required">;
921
+ topCountries: import("convex/values").VLiteral<"eventVolume", "required">;
922
+ topDevices: import("convex/values").VLiteral<"eventVolume", "required">;
923
+ topBrowsers: import("convex/values").VLiteral<"eventVolume", "required">;
924
+ topEvents: import("convex/values").VLiteral<"eventVolume", "required">;
925
+ topGoals: import("convex/values").VLiteral<"goalCompletionVolume", "required">;
926
+ }, "required", "topBrowsers" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
927
+ coverage: import("convex/values").VObject<{
928
+ availableFrom: number | null;
929
+ availableThrough: number | null;
930
+ generation: number | null;
931
+ retainedBefore: number | null;
932
+ state: "complete" | "partial" | "retained" | "unavailable";
933
+ }, {
934
+ 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>;
935
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
936
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
937
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
938
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
939
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
940
+ range: import("convex/values").VObject<{
941
+ boundary: "inclusive";
942
+ from: number;
943
+ timezone: "UTC";
944
+ to: number;
945
+ }, {
946
+ from: import("convex/values").VFloat64<number, "required">;
947
+ to: import("convex/values").VFloat64<number, "required">;
948
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
949
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
950
+ }, "required", "boundary" | "from" | "timezone" | "to">;
951
+ features: import("convex/values").VObject<{
952
+ botDetection: "unsupported";
953
+ errorInsights: "unsupported";
954
+ outboundLinks: "eventVolume";
955
+ sessionReplay: "unsupported";
956
+ }, {
957
+ sessionReplay: import("convex/values").VLiteral<"unsupported", "required">;
958
+ errorInsights: import("convex/values").VLiteral<"unsupported", "required">;
959
+ outboundLinks: import("convex/values").VLiteral<"eventVolume", "required">;
960
+ botDetection: import("convex/values").VLiteral<"unsupported", "required">;
961
+ }, "required", "botDetection" | "errorInsights" | "outboundLinks" | "sessionReplay">;
962
+ }, "required", "breakdowns" | "breakdowns.topBrowsers" | "breakdowns.topCountries" | "breakdowns.topDevices" | "breakdowns.topEvents" | "breakdowns.topGoals" | "breakdowns.topPages" | "breakdowns.topSources" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "features" | "features.botDetection" | "features.errorInsights" | "features.outboundLinks" | "features.sessionReplay" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "visitors" | "visitors.basis" | "visitors.exact" | "visitors.legacyIncomplete" | "visitors.precision" | "visitors.sketchVersion">;
963
+ }, "required", "currency" | "from" | "interval" | "metadata" | "metadata.breakdowns" | "metadata.breakdowns.topBrowsers" | "metadata.breakdowns.topCountries" | "metadata.breakdowns.topDevices" | "metadata.breakdowns.topEvents" | "metadata.breakdowns.topGoals" | "metadata.breakdowns.topPages" | "metadata.breakdowns.topSources" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.features" | "metadata.features.botDetection" | "metadata.features.errorInsights" | "metadata.features.outboundLinks" | "metadata.features.sessionReplay" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.visitors" | "metadata.visitors.basis" | "metadata.visitors.exact" | "metadata.visitors.legacyIncomplete" | "metadata.visitors.precision" | "metadata.visitors.sketchVersion" | "timeSeries" | "to" | "topBrowsers" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources" | "totals" | "totals.clicks" | "totals.conversions" | "totals.customEvents" | "totals.events" | "totals.outboundClicks" | "totals.pageviews" | "totals.revenueCents" | "totals.sessions" | "totals.visitors">;
964
+ declare const hostGoalsReportValidator: import("convex/values").VObject<{
965
+ goals: {
966
+ _creationTime: number;
967
+ _id: string;
968
+ active: boolean;
969
+ completions: number;
970
+ createdAt: number;
971
+ key: string;
972
+ matchType: "custom" | "pageview";
973
+ matchValue: string;
974
+ name: string;
975
+ siteId: string;
976
+ updatedAt: number;
977
+ valueCents: number;
978
+ }[];
979
+ metadata: {
980
+ basis: "boundedLegacy" | "dailyRollup";
981
+ coverage: {
982
+ availableFrom: number | null;
983
+ availableThrough: number | null;
984
+ generation: number | null;
985
+ retainedBefore: number | null;
986
+ state: "complete" | "partial" | "retained" | "unavailable";
987
+ };
988
+ range: {
989
+ boundary: "inclusive";
990
+ from: number;
991
+ timezone: "UTC";
992
+ to: number;
993
+ };
994
+ };
995
+ truncated: boolean;
996
+ }, {
997
+ goals: import("convex/values").VArray<{
998
+ _creationTime: number;
999
+ _id: string;
1000
+ active: boolean;
1001
+ completions: number;
1002
+ createdAt: number;
1003
+ key: string;
1004
+ matchType: "custom" | "pageview";
1005
+ matchValue: string;
1006
+ name: string;
1007
+ siteId: string;
1008
+ updatedAt: number;
1009
+ valueCents: number;
1010
+ }[], import("convex/values").VObject<{
1011
+ _creationTime: number;
1012
+ _id: string;
1013
+ active: boolean;
1014
+ completions: number;
1015
+ createdAt: number;
1016
+ key: string;
1017
+ matchType: "custom" | "pageview";
1018
+ matchValue: string;
1019
+ name: string;
1020
+ siteId: string;
1021
+ updatedAt: number;
1022
+ valueCents: number;
1023
+ }, {
1024
+ _id: import("convex/values").VString<string, "required">;
1025
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1026
+ siteId: import("convex/values").VString<string, "required">;
1027
+ key: import("convex/values").VString<string, "required">;
1028
+ name: import("convex/values").VString<string, "required">;
1029
+ matchType: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1030
+ matchValue: import("convex/values").VString<string, "required">;
1031
+ valueCents: never;
1032
+ active: import("convex/values").VBoolean<boolean, "required">;
1033
+ createdAt: import("convex/values").VFloat64<number, "required">;
1034
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1035
+ completions: import("convex/values").VFloat64<number, "required">;
1036
+ }, "required", "_creationTime" | "_id" | "active" | "completions" | "createdAt" | "key" | "matchType" | "matchValue" | "name" | "siteId" | "updatedAt" | "valueCents">, "required">;
1037
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1038
+ metadata: import("convex/values").VObject<{
1039
+ basis: "boundedLegacy" | "dailyRollup";
1040
+ coverage: {
1041
+ availableFrom: number | null;
1042
+ availableThrough: number | null;
1043
+ generation: number | null;
1044
+ retainedBefore: number | null;
1045
+ state: "complete" | "partial" | "retained" | "unavailable";
1046
+ };
1047
+ range: {
1048
+ boundary: "inclusive";
1049
+ from: number;
1050
+ timezone: "UTC";
1051
+ to: number;
1052
+ };
1053
+ }, {
1054
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1055
+ coverage: import("convex/values").VObject<{
1056
+ availableFrom: number | null;
1057
+ availableThrough: number | null;
1058
+ generation: number | null;
1059
+ retainedBefore: number | null;
1060
+ state: "complete" | "partial" | "retained" | "unavailable";
1061
+ }, {
1062
+ 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>;
1063
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1064
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1065
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1066
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1067
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1068
+ range: import("convex/values").VObject<{
1069
+ boundary: "inclusive";
1070
+ from: number;
1071
+ timezone: "UTC";
1072
+ to: number;
1073
+ }, {
1074
+ from: import("convex/values").VFloat64<number, "required">;
1075
+ to: import("convex/values").VFloat64<number, "required">;
1076
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1077
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1078
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1079
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1080
+ }, "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">;
1081
+ declare const hostFunnelsReportValidator: import("convex/values").VArray<{
1082
+ _creationTime: number;
1083
+ _id: string;
1084
+ active: boolean;
1085
+ conversionWindowMs: number;
1086
+ createdAt: number;
1087
+ key: string;
1088
+ metadata: {
1089
+ basis: "boundedLegacy" | "dailyRollup";
1090
+ coverage: {
1091
+ availableFrom: number | null;
1092
+ availableThrough: number | null;
1093
+ generation: number | null;
1094
+ retainedBefore: number | null;
1095
+ state: "complete" | "partial" | "retained" | "unavailable";
1096
+ };
1097
+ range: {
1098
+ boundary: "inclusive";
1099
+ from: number;
1100
+ timezone: "UTC";
1101
+ to: number;
1102
+ };
1103
+ };
1104
+ name: string;
1105
+ siteId: string;
1106
+ steps: {
1107
+ name: string;
1108
+ type: "custom" | "pageview";
1109
+ value: string;
1110
+ }[];
1111
+ stepsReport: {
1112
+ completions: number;
1113
+ entrants: number;
1114
+ name: string;
1115
+ step: number;
1116
+ }[];
1117
+ truncated: boolean;
1118
+ updatedAt: number;
1119
+ }[], import("convex/values").VObject<{
1120
+ _creationTime: number;
1121
+ _id: string;
1122
+ active: boolean;
1123
+ conversionWindowMs: number;
1124
+ createdAt: number;
1125
+ key: string;
1126
+ metadata: {
1127
+ basis: "boundedLegacy" | "dailyRollup";
1128
+ coverage: {
1129
+ availableFrom: number | null;
1130
+ availableThrough: number | null;
1131
+ generation: number | null;
1132
+ retainedBefore: number | null;
1133
+ state: "complete" | "partial" | "retained" | "unavailable";
1134
+ };
1135
+ range: {
1136
+ boundary: "inclusive";
1137
+ from: number;
1138
+ timezone: "UTC";
1139
+ to: number;
1140
+ };
1141
+ };
1142
+ name: string;
1143
+ siteId: string;
1144
+ steps: {
1145
+ name: string;
1146
+ type: "custom" | "pageview";
1147
+ value: string;
1148
+ }[];
1149
+ stepsReport: {
1150
+ completions: number;
1151
+ entrants: number;
1152
+ name: string;
1153
+ step: number;
1154
+ }[];
1155
+ truncated: boolean;
1156
+ updatedAt: number;
1157
+ }, {
1158
+ _id: import("convex/values").VString<string, "required">;
1159
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1160
+ siteId: import("convex/values").VString<string, "required">;
1161
+ key: import("convex/values").VString<string, "required">;
1162
+ name: import("convex/values").VString<string, "required">;
1163
+ steps: import("convex/values").VArray<{
1164
+ name: string;
1165
+ type: "custom" | "pageview";
1166
+ value: string;
1167
+ }[], import("convex/values").VObject<{
1168
+ name: string;
1169
+ type: "custom" | "pageview";
1170
+ value: string;
1171
+ }, {
1172
+ type: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1173
+ value: import("convex/values").VString<string, "required">;
1174
+ name: import("convex/values").VString<string, "required">;
1175
+ }, "required", "name" | "type" | "value">, "required">;
1176
+ conversionWindowMs: import("convex/values").VFloat64<number, "required">;
1177
+ active: import("convex/values").VBoolean<boolean, "required">;
1178
+ createdAt: import("convex/values").VFloat64<number, "required">;
1179
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1180
+ stepsReport: import("convex/values").VArray<{
1181
+ completions: number;
1182
+ entrants: number;
1183
+ name: string;
1184
+ step: number;
1185
+ }[], import("convex/values").VObject<{
1186
+ completions: number;
1187
+ entrants: number;
1188
+ name: string;
1189
+ step: number;
1190
+ }, {
1191
+ step: import("convex/values").VFloat64<number, "required">;
1192
+ name: import("convex/values").VString<string, "required">;
1193
+ entrants: import("convex/values").VFloat64<number, "required">;
1194
+ completions: import("convex/values").VFloat64<number, "required">;
1195
+ }, "required", "completions" | "entrants" | "name" | "step">, "required">;
1196
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1197
+ metadata: import("convex/values").VObject<{
1198
+ basis: "boundedLegacy" | "dailyRollup";
1199
+ coverage: {
1200
+ availableFrom: number | null;
1201
+ availableThrough: number | null;
1202
+ generation: number | null;
1203
+ retainedBefore: number | null;
1204
+ state: "complete" | "partial" | "retained" | "unavailable";
1205
+ };
1206
+ range: {
1207
+ boundary: "inclusive";
1208
+ from: number;
1209
+ timezone: "UTC";
1210
+ to: number;
1211
+ };
1212
+ }, {
1213
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1214
+ coverage: import("convex/values").VObject<{
1215
+ availableFrom: number | null;
1216
+ availableThrough: number | null;
1217
+ generation: number | null;
1218
+ retainedBefore: number | null;
1219
+ state: "complete" | "partial" | "retained" | "unavailable";
1220
+ }, {
1221
+ 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>;
1222
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1223
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1224
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1225
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1226
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1227
+ range: import("convex/values").VObject<{
1228
+ boundary: "inclusive";
1229
+ from: number;
1230
+ timezone: "UTC";
1231
+ to: number;
1232
+ }, {
1233
+ from: import("convex/values").VFloat64<number, "required">;
1234
+ to: import("convex/values").VFloat64<number, "required">;
1235
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1236
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1237
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1238
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1239
+ }, "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">;
1240
+ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1241
+ affiliates: {
1242
+ _creationTime: number;
1243
+ _id: string;
1244
+ active: boolean;
1245
+ attributionWindowDays: number;
1246
+ commissionBps: number;
1247
+ commissionCents: number;
1248
+ conversions: number;
1249
+ createdAt: number;
1250
+ name: string;
1251
+ revenueCents: number;
1252
+ siteId: string;
1253
+ slug: string;
1254
+ uniqueVisitors: number;
1255
+ updatedAt: number;
1256
+ visits: number;
1257
+ }[];
1258
+ metadata: {
1259
+ basis: "boundedLegacy" | "dailyRollup";
1260
+ coverage: {
1261
+ availableFrom: number | null;
1262
+ availableThrough: number | null;
1263
+ generation: number | null;
1264
+ retainedBefore: number | null;
1265
+ state: "complete" | "partial" | "retained" | "unavailable";
1266
+ };
1267
+ range: {
1268
+ boundary: "inclusive";
1269
+ from: number;
1270
+ timezone: "UTC";
1271
+ to: number;
1272
+ };
1273
+ uniqueVisitors: {
1274
+ basis: "estimatedUnique" | "exactLegacy";
1275
+ exact: boolean;
1276
+ };
1277
+ };
1278
+ truncated: boolean;
1279
+ }, {
1280
+ affiliates: import("convex/values").VArray<{
1281
+ _creationTime: number;
1282
+ _id: string;
1283
+ active: boolean;
1284
+ attributionWindowDays: number;
1285
+ commissionBps: number;
1286
+ commissionCents: number;
1287
+ conversions: number;
1288
+ createdAt: number;
1289
+ name: string;
1290
+ revenueCents: number;
1291
+ siteId: string;
1292
+ slug: string;
1293
+ uniqueVisitors: number;
1294
+ updatedAt: number;
1295
+ visits: number;
1296
+ }[], import("convex/values").VObject<{
1297
+ _creationTime: number;
1298
+ _id: string;
1299
+ active: boolean;
1300
+ attributionWindowDays: number;
1301
+ commissionBps: number;
1302
+ commissionCents: number;
1303
+ conversions: number;
1304
+ createdAt: number;
1305
+ name: string;
1306
+ revenueCents: number;
1307
+ siteId: string;
1308
+ slug: string;
1309
+ uniqueVisitors: number;
1310
+ updatedAt: number;
1311
+ visits: number;
1312
+ }, {
1313
+ _id: import("convex/values").VString<string, "required">;
1314
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1315
+ siteId: import("convex/values").VString<string, "required">;
1316
+ slug: import("convex/values").VString<string, "required">;
1317
+ name: import("convex/values").VString<string, "required">;
1318
+ commissionBps: import("convex/values").VFloat64<number, "required">;
1319
+ attributionWindowDays: import("convex/values").VFloat64<number, "required">;
1320
+ active: import("convex/values").VBoolean<boolean, "required">;
1321
+ createdAt: import("convex/values").VFloat64<number, "required">;
1322
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1323
+ visits: import("convex/values").VFloat64<number, "required">;
1324
+ uniqueVisitors: import("convex/values").VFloat64<number, "required">;
1325
+ conversions: import("convex/values").VFloat64<number, "required">;
1326
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1327
+ commissionCents: import("convex/values").VFloat64<number, "required">;
1328
+ }, "required", "_creationTime" | "_id" | "active" | "attributionWindowDays" | "commissionBps" | "commissionCents" | "conversions" | "createdAt" | "name" | "revenueCents" | "siteId" | "slug" | "uniqueVisitors" | "updatedAt" | "visits">, "required">;
1329
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1330
+ metadata: import("convex/values").VObject<{
1331
+ basis: "boundedLegacy" | "dailyRollup";
1332
+ coverage: {
1333
+ availableFrom: number | null;
1334
+ availableThrough: number | null;
1335
+ generation: number | null;
1336
+ retainedBefore: number | null;
1337
+ state: "complete" | "partial" | "retained" | "unavailable";
1338
+ };
1339
+ range: {
1340
+ boundary: "inclusive";
1341
+ from: number;
1342
+ timezone: "UTC";
1343
+ to: number;
1344
+ };
1345
+ uniqueVisitors: {
1346
+ basis: "estimatedUnique" | "exactLegacy";
1347
+ exact: boolean;
1348
+ };
1349
+ }, {
1350
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1351
+ coverage: import("convex/values").VObject<{
1352
+ availableFrom: number | null;
1353
+ availableThrough: number | null;
1354
+ generation: number | null;
1355
+ retainedBefore: number | null;
1356
+ state: "complete" | "partial" | "retained" | "unavailable";
1357
+ }, {
1358
+ 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>;
1359
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1360
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1361
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1362
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1363
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1364
+ range: import("convex/values").VObject<{
1365
+ boundary: "inclusive";
1366
+ from: number;
1367
+ timezone: "UTC";
1368
+ to: number;
1369
+ }, {
1370
+ from: import("convex/values").VFloat64<number, "required">;
1371
+ to: import("convex/values").VFloat64<number, "required">;
1372
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1373
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1374
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1375
+ uniqueVisitors: import("convex/values").VObject<{
1376
+ basis: "estimatedUnique" | "exactLegacy";
1377
+ exact: boolean;
1378
+ }, {
1379
+ basis: import("convex/values").VUnion<"estimatedUnique" | "exactLegacy", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"exactLegacy", "required">], "required", never>;
1380
+ exact: import("convex/values").VBoolean<boolean, "required">;
1381
+ }, "required", "basis" | "exact">;
1382
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "uniqueVisitors" | "uniqueVisitors.basis" | "uniqueVisitors.exact">;
1383
+ }, "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">;
416
1384
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
417
1385
  authorize: AnalyticsAuthorizer;
418
1386
  }): {
@@ -524,6 +1492,43 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
524
1492
  currency: string;
525
1493
  from: number;
526
1494
  interval: "hour" | "day";
1495
+ metadata: {
1496
+ breakdowns: {
1497
+ topBrowsers: "eventVolume";
1498
+ topCountries: "eventVolume";
1499
+ topDevices: "eventVolume";
1500
+ topEvents: "eventVolume";
1501
+ topGoals: "goalCompletionVolume";
1502
+ topPages: "eventVolume";
1503
+ topSources: "eventVolume";
1504
+ };
1505
+ coverage: {
1506
+ availableFrom: number | null;
1507
+ availableThrough: number | null;
1508
+ generation: number | null;
1509
+ retainedBefore: number | null;
1510
+ state: "complete" | "partial" | "retained" | "unavailable";
1511
+ };
1512
+ features: {
1513
+ botDetection: "unsupported";
1514
+ errorInsights: "unsupported";
1515
+ outboundLinks: "eventVolume";
1516
+ sessionReplay: "unsupported";
1517
+ };
1518
+ range: {
1519
+ boundary: "inclusive";
1520
+ from: number;
1521
+ timezone: "UTC";
1522
+ to: number;
1523
+ };
1524
+ visitors: {
1525
+ basis: "estimatedUnique" | "bucketOccurrences";
1526
+ exact: boolean;
1527
+ legacyIncomplete: boolean;
1528
+ precision: number | null;
1529
+ sketchVersion: number | null;
1530
+ };
1531
+ };
527
1532
  timeSeries: Array<{
528
1533
  clicks: number;
529
1534
  conversions: number;
@@ -795,6 +1800,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
795
1800
  updatedAt: number;
796
1801
  valueCents: number;
797
1802
  }>;
1803
+ metadata: {
1804
+ basis: "dailyRollup" | "boundedLegacy";
1805
+ coverage: {
1806
+ availableFrom: number | null;
1807
+ availableThrough: number | null;
1808
+ generation: number | null;
1809
+ retainedBefore: number | null;
1810
+ state: "complete" | "partial" | "retained" | "unavailable";
1811
+ };
1812
+ range: {
1813
+ boundary: "inclusive";
1814
+ from: number;
1815
+ timezone: "UTC";
1816
+ to: number;
1817
+ };
1818
+ };
798
1819
  truncated: boolean;
799
1820
  }>>;
800
1821
  funnelsReport: import("convex/server").RegisteredQuery<"public", {
@@ -808,6 +1829,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
808
1829
  conversionWindowMs: number;
809
1830
  createdAt: number;
810
1831
  key: string;
1832
+ metadata: {
1833
+ basis: "dailyRollup" | "boundedLegacy";
1834
+ coverage: {
1835
+ availableFrom: number | null;
1836
+ availableThrough: number | null;
1837
+ generation: number | null;
1838
+ retainedBefore: number | null;
1839
+ state: "complete" | "partial" | "retained" | "unavailable";
1840
+ };
1841
+ range: {
1842
+ boundary: "inclusive";
1843
+ from: number;
1844
+ timezone: "UTC";
1845
+ to: number;
1846
+ };
1847
+ };
811
1848
  name: string;
812
1849
  siteId: string;
813
1850
  steps: Array<{
@@ -846,8 +1883,88 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
846
1883
  updatedAt: number;
847
1884
  visits: number;
848
1885
  }>;
1886
+ metadata: {
1887
+ basis: "dailyRollup" | "boundedLegacy";
1888
+ coverage: {
1889
+ availableFrom: number | null;
1890
+ availableThrough: number | null;
1891
+ generation: number | null;
1892
+ retainedBefore: number | null;
1893
+ state: "complete" | "partial" | "retained" | "unavailable";
1894
+ };
1895
+ range: {
1896
+ boundary: "inclusive";
1897
+ from: number;
1898
+ timezone: "UTC";
1899
+ to: number;
1900
+ };
1901
+ uniqueVisitors: {
1902
+ basis: "estimatedUnique" | "exactLegacy";
1903
+ exact: boolean;
1904
+ };
1905
+ };
849
1906
  truncated: boolean;
850
1907
  }>>;
1908
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
1909
+ from: number;
1910
+ siteId: string;
1911
+ to: number;
1912
+ }, Promise<{
1913
+ datasets: Array<{
1914
+ coverage: {
1915
+ availableFrom: number | null;
1916
+ availableThrough: number | null;
1917
+ generation: number | null;
1918
+ retainedBefore: number | null;
1919
+ state: "complete" | "partial" | "retained" | "unavailable";
1920
+ };
1921
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
1922
+ }>;
1923
+ from: number;
1924
+ siteId: string;
1925
+ to: number;
1926
+ }>>;
1927
+ retentionStatus: import("convex/server").RegisteredQuery<"public", {
1928
+ siteId: string;
1929
+ }, Promise<{
1930
+ backlog: number;
1931
+ jobs: Array<{
1932
+ before: number;
1933
+ deleted: number;
1934
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
1935
+ scheduledAt: number | null;
1936
+ status: "pending" | "running" | "complete";
1937
+ updatedAt: number;
1938
+ }>;
1939
+ policy: {
1940
+ aggregatesDays: number;
1941
+ conversionsDays: number;
1942
+ eventsDays: number;
1943
+ reportsDays: number;
1944
+ sessionsDays: number;
1945
+ updatedAt: number;
1946
+ } | null;
1947
+ }>>;
1948
+ setRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
1949
+ aggregatesDays: number;
1950
+ conversionsDays: number;
1951
+ eventsDays: number;
1952
+ reportsDays: number;
1953
+ sessionsDays: number;
1954
+ siteId: string;
1955
+ }, Promise<null>>;
1956
+ disableRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
1957
+ siteId: string;
1958
+ }, Promise<null>>;
1959
+ runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
1960
+ batchSize?: number | undefined;
1961
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
1962
+ siteId: string;
1963
+ }, Promise<{
1964
+ before: number;
1965
+ deleted: number;
1966
+ hasMore: boolean;
1967
+ }>>;
851
1968
  upsertGoal: import("convex/server").RegisteredMutation<"public", {
852
1969
  active?: boolean | undefined;
853
1970
  goalId?: string | undefined;
@@ -942,13 +2059,488 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
942
2059
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
943
2060
  batchSize?: number | undefined;
944
2061
  before: number;
945
- kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2062
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
946
2063
  siteId: string;
947
2064
  }, Promise<{
2065
+ before: number;
948
2066
  deleted: number;
949
2067
  hasMore: boolean;
950
2068
  }>>;
951
2069
  };
2070
+ /** Exposes only the reactive read surface used by a federated Rastro dashboard. */
2071
+ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, options: FederatedAnalyticsAuthorizerOptions): {
2072
+ manifest: import("convex/server").RegisteredQuery<"public", {}, {
2073
+ protocol: "amage-rastro-analytics";
2074
+ protocolVersion: 1;
2075
+ moduleName: "rastroFederation";
2076
+ functions: {
2077
+ manifest: "manifest";
2078
+ connectionStatus: "connectionStatus";
2079
+ listSites: "listSites";
2080
+ overview: "overview";
2081
+ liveVisitors: "liveVisitors";
2082
+ listSessions: "listSessions";
2083
+ sessionJourney: "sessionJourney";
2084
+ listConversions: "listConversions";
2085
+ visitorJourney: "visitorJourney";
2086
+ goalsReport: "goalsReport";
2087
+ funnelsReport: "funnelsReport";
2088
+ affiliatesReport: "affiliatesReport";
2089
+ dataCoverage: "dataCoverage";
2090
+ };
2091
+ capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney")[];
2092
+ limits: {
2093
+ maxSitesPerRequest: 10;
2094
+ maxSitesPerConnection: 10;
2095
+ maxReportRangeDays: 366;
2096
+ maxLiveVisitors: 500;
2097
+ maxJourneyEvents: 500;
2098
+ };
2099
+ }>;
2100
+ connectionStatus: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedAnalyticsConnectionStatus>>;
2101
+ listSites: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedSiteSummary[]>>;
2102
+ overview: import("convex/server").RegisteredQuery<"public", {
2103
+ from: number;
2104
+ interval?: "day" | "hour" | undefined;
2105
+ siteIds: string[];
2106
+ to: number;
2107
+ }, Promise<{
2108
+ currency: string;
2109
+ from: number;
2110
+ interval: "hour" | "day";
2111
+ metadata: {
2112
+ breakdowns: {
2113
+ topBrowsers: "eventVolume";
2114
+ topCountries: "eventVolume";
2115
+ topDevices: "eventVolume";
2116
+ topEvents: "eventVolume";
2117
+ topGoals: "goalCompletionVolume";
2118
+ topPages: "eventVolume";
2119
+ topSources: "eventVolume";
2120
+ };
2121
+ coverage: {
2122
+ availableFrom: number | null;
2123
+ availableThrough: number | null;
2124
+ generation: number | null;
2125
+ retainedBefore: number | null;
2126
+ state: "complete" | "partial" | "retained" | "unavailable";
2127
+ };
2128
+ features: {
2129
+ botDetection: "unsupported";
2130
+ errorInsights: "unsupported";
2131
+ outboundLinks: "eventVolume";
2132
+ sessionReplay: "unsupported";
2133
+ };
2134
+ range: {
2135
+ boundary: "inclusive";
2136
+ from: number;
2137
+ timezone: "UTC";
2138
+ to: number;
2139
+ };
2140
+ visitors: {
2141
+ basis: "estimatedUnique" | "bucketOccurrences";
2142
+ exact: boolean;
2143
+ legacyIncomplete: boolean;
2144
+ precision: number | null;
2145
+ sketchVersion: number | null;
2146
+ };
2147
+ };
2148
+ timeSeries: Array<{
2149
+ clicks: number;
2150
+ conversions: number;
2151
+ customEvents: number;
2152
+ events: number;
2153
+ outboundClicks: number;
2154
+ pageviews: number;
2155
+ revenueCents: number;
2156
+ sessions: number;
2157
+ timestamp: number;
2158
+ visitors: number;
2159
+ }>;
2160
+ to: number;
2161
+ topBrowsers: Array<{
2162
+ count: number;
2163
+ revenueCents: number;
2164
+ value: string;
2165
+ }>;
2166
+ topCountries: Array<{
2167
+ count: number;
2168
+ revenueCents: number;
2169
+ value: string;
2170
+ }>;
2171
+ topDevices: Array<{
2172
+ count: number;
2173
+ revenueCents: number;
2174
+ value: string;
2175
+ }>;
2176
+ topEvents: Array<{
2177
+ count: number;
2178
+ revenueCents: number;
2179
+ value: string;
2180
+ }>;
2181
+ topGoals: Array<{
2182
+ count: number;
2183
+ revenueCents: number;
2184
+ value: string;
2185
+ }>;
2186
+ topPages: Array<{
2187
+ count: number;
2188
+ revenueCents: number;
2189
+ value: string;
2190
+ }>;
2191
+ topSources: Array<{
2192
+ count: number;
2193
+ revenueCents: number;
2194
+ value: string;
2195
+ }>;
2196
+ totals: {
2197
+ clicks: number;
2198
+ conversions: number;
2199
+ customEvents: number;
2200
+ events: number;
2201
+ outboundClicks: number;
2202
+ pageviews: number;
2203
+ revenueCents: number;
2204
+ sessions: number;
2205
+ visitors: number;
2206
+ };
2207
+ }>>;
2208
+ liveVisitors: import("convex/server").RegisteredQuery<"public", {
2209
+ limit?: number | undefined;
2210
+ now: number;
2211
+ siteIds: string[];
2212
+ }, Promise<{
2213
+ _creationTime: number;
2214
+ _id: string;
2215
+ browser: string;
2216
+ city?: string;
2217
+ country?: string;
2218
+ device: string;
2219
+ eventCount: number;
2220
+ expiresAt: number;
2221
+ lastSeenAt: number;
2222
+ latitude?: number;
2223
+ longitude?: number;
2224
+ os: string;
2225
+ pageviewCount: number;
2226
+ path: string;
2227
+ sessionId: string;
2228
+ siteId: string;
2229
+ source: string;
2230
+ startedAt: number;
2231
+ visitorId: string;
2232
+ }[]>>;
2233
+ listSessions: import("convex/server").RegisteredQuery<"public", {
2234
+ from: number;
2235
+ paginationOpts: {
2236
+ id?: number;
2237
+ endCursor?: string | null;
2238
+ maximumRowsRead?: number;
2239
+ maximumBytesRead?: number;
2240
+ numItems: number;
2241
+ cursor: string | null;
2242
+ };
2243
+ siteId: string;
2244
+ to: number;
2245
+ }, Promise<{
2246
+ continueCursor: string;
2247
+ isDone: boolean;
2248
+ page: Array<{
2249
+ _creationTime: number;
2250
+ _id: string;
2251
+ affiliateAttributedAt?: number;
2252
+ affiliateExpiresAt?: number;
2253
+ affiliateId?: string;
2254
+ affiliateSlug?: string;
2255
+ browser: string;
2256
+ city?: string;
2257
+ conversionCount: number;
2258
+ country?: string;
2259
+ currency?: string;
2260
+ device: string;
2261
+ durationMs: number;
2262
+ entryPath: string;
2263
+ eventCount: number;
2264
+ exitPath: string;
2265
+ lastSeenAt: number;
2266
+ latitude?: number;
2267
+ longitude?: number;
2268
+ os: string;
2269
+ pageviewCount: number;
2270
+ referrer?: string;
2271
+ revenueCents: number;
2272
+ sessionId: string;
2273
+ siteId: string;
2274
+ source: string;
2275
+ startedAt: number;
2276
+ utmCampaign?: string;
2277
+ utmMedium?: string;
2278
+ utmSource?: string;
2279
+ visitorId: string;
2280
+ }>;
2281
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2282
+ splitCursor?: string | null;
2283
+ }>>;
2284
+ sessionJourney: import("convex/server").RegisteredQuery<"public", {
2285
+ from: number;
2286
+ paginationOpts: {
2287
+ id?: number;
2288
+ endCursor?: string | null;
2289
+ maximumRowsRead?: number;
2290
+ maximumBytesRead?: number;
2291
+ numItems: number;
2292
+ cursor: string | null;
2293
+ };
2294
+ sessionId: string;
2295
+ siteId: string;
2296
+ to: number;
2297
+ }, Promise<{
2298
+ continueCursor: string;
2299
+ isDone: boolean;
2300
+ page: Array<{
2301
+ _creationTime: number;
2302
+ _id: string;
2303
+ affiliateSlug?: string;
2304
+ browser: string;
2305
+ city?: string;
2306
+ country?: string;
2307
+ currency?: string;
2308
+ device: string;
2309
+ eventId: string;
2310
+ href?: string;
2311
+ latitude?: number;
2312
+ longitude?: number;
2313
+ name?: string;
2314
+ os: string;
2315
+ path: string;
2316
+ properties?: Record<string, string | number | boolean | null>;
2317
+ referrer?: string;
2318
+ revenueCents?: number;
2319
+ sequence: number;
2320
+ sessionId: string;
2321
+ siteId: string;
2322
+ target?: string;
2323
+ timestamp: number;
2324
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2325
+ visitorId: string;
2326
+ }>;
2327
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2328
+ splitCursor?: string | null;
2329
+ }>>;
2330
+ listConversions: import("convex/server").RegisteredQuery<"public", {
2331
+ from: number;
2332
+ paginationOpts: {
2333
+ id?: number;
2334
+ endCursor?: string | null;
2335
+ maximumRowsRead?: number;
2336
+ maximumBytesRead?: number;
2337
+ numItems: number;
2338
+ cursor: string | null;
2339
+ };
2340
+ siteId: string;
2341
+ to: number;
2342
+ }, Promise<{
2343
+ continueCursor: string;
2344
+ isDone: boolean;
2345
+ page: Array<{
2346
+ _creationTime: number;
2347
+ _id: string;
2348
+ affiliateAttributedAt?: number;
2349
+ affiliateExpiresAt?: number;
2350
+ affiliateId?: string;
2351
+ affiliateSlug?: string;
2352
+ commissionCents: number;
2353
+ currency: string;
2354
+ eventId: string;
2355
+ goalKey?: string;
2356
+ path: string;
2357
+ revenueCents: number;
2358
+ sessionId: string;
2359
+ siteId: string;
2360
+ source: "tracker" | "trusted";
2361
+ timestamp: number;
2362
+ visitorId: string;
2363
+ }>;
2364
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2365
+ splitCursor?: string | null;
2366
+ }>>;
2367
+ visitorJourney: import("convex/server").RegisteredQuery<"public", {
2368
+ from: number;
2369
+ limit?: number | undefined;
2370
+ siteIds: string[];
2371
+ to: number;
2372
+ visitorId: string;
2373
+ }, Promise<{
2374
+ _creationTime: number;
2375
+ _id: string;
2376
+ affiliateSlug?: string;
2377
+ browser: string;
2378
+ city?: string;
2379
+ country?: string;
2380
+ currency?: string;
2381
+ device: string;
2382
+ eventId: string;
2383
+ href?: string;
2384
+ latitude?: number;
2385
+ longitude?: number;
2386
+ name?: string;
2387
+ os: string;
2388
+ path: string;
2389
+ properties?: Record<string, string | number | boolean | null>;
2390
+ referrer?: string;
2391
+ revenueCents?: number;
2392
+ sequence: number;
2393
+ sessionId: string;
2394
+ siteId: string;
2395
+ target?: string;
2396
+ timestamp: number;
2397
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2398
+ visitorId: string;
2399
+ }[]>>;
2400
+ goalsReport: import("convex/server").RegisteredQuery<"public", {
2401
+ from: number;
2402
+ siteId: string;
2403
+ to: number;
2404
+ }, Promise<{
2405
+ goals: Array<{
2406
+ _creationTime: number;
2407
+ _id: string;
2408
+ active: boolean;
2409
+ completions: number;
2410
+ createdAt: number;
2411
+ key: string;
2412
+ matchType: "pageview" | "custom";
2413
+ matchValue: string;
2414
+ name: string;
2415
+ siteId: string;
2416
+ updatedAt: number;
2417
+ valueCents: number;
2418
+ }>;
2419
+ metadata: {
2420
+ basis: "dailyRollup" | "boundedLegacy";
2421
+ coverage: {
2422
+ availableFrom: number | null;
2423
+ availableThrough: number | null;
2424
+ generation: number | null;
2425
+ retainedBefore: number | null;
2426
+ state: "complete" | "partial" | "retained" | "unavailable";
2427
+ };
2428
+ range: {
2429
+ boundary: "inclusive";
2430
+ from: number;
2431
+ timezone: "UTC";
2432
+ to: number;
2433
+ };
2434
+ };
2435
+ truncated: boolean;
2436
+ }>>;
2437
+ funnelsReport: import("convex/server").RegisteredQuery<"public", {
2438
+ from: number;
2439
+ siteId: string;
2440
+ to: number;
2441
+ }, Promise<{
2442
+ _creationTime: number;
2443
+ _id: string;
2444
+ active: boolean;
2445
+ conversionWindowMs: number;
2446
+ createdAt: number;
2447
+ key: string;
2448
+ metadata: {
2449
+ basis: "dailyRollup" | "boundedLegacy";
2450
+ coverage: {
2451
+ availableFrom: number | null;
2452
+ availableThrough: number | null;
2453
+ generation: number | null;
2454
+ retainedBefore: number | null;
2455
+ state: "complete" | "partial" | "retained" | "unavailable";
2456
+ };
2457
+ range: {
2458
+ boundary: "inclusive";
2459
+ from: number;
2460
+ timezone: "UTC";
2461
+ to: number;
2462
+ };
2463
+ };
2464
+ name: string;
2465
+ siteId: string;
2466
+ steps: Array<{
2467
+ name: string;
2468
+ type: "pageview" | "custom";
2469
+ value: string;
2470
+ }>;
2471
+ stepsReport: Array<{
2472
+ completions: number;
2473
+ entrants: number;
2474
+ name: string;
2475
+ step: number;
2476
+ }>;
2477
+ truncated: boolean;
2478
+ updatedAt: number;
2479
+ }[]>>;
2480
+ affiliatesReport: import("convex/server").RegisteredQuery<"public", {
2481
+ from: number;
2482
+ siteId: string;
2483
+ to: number;
2484
+ }, Promise<{
2485
+ affiliates: Array<{
2486
+ _creationTime: number;
2487
+ _id: string;
2488
+ active: boolean;
2489
+ attributionWindowDays: number;
2490
+ commissionBps: number;
2491
+ commissionCents: number;
2492
+ conversions: number;
2493
+ createdAt: number;
2494
+ name: string;
2495
+ revenueCents: number;
2496
+ siteId: string;
2497
+ slug: string;
2498
+ uniqueVisitors: number;
2499
+ updatedAt: number;
2500
+ visits: number;
2501
+ }>;
2502
+ metadata: {
2503
+ basis: "dailyRollup" | "boundedLegacy";
2504
+ coverage: {
2505
+ availableFrom: number | null;
2506
+ availableThrough: number | null;
2507
+ generation: number | null;
2508
+ retainedBefore: number | null;
2509
+ state: "complete" | "partial" | "retained" | "unavailable";
2510
+ };
2511
+ range: {
2512
+ boundary: "inclusive";
2513
+ from: number;
2514
+ timezone: "UTC";
2515
+ to: number;
2516
+ };
2517
+ uniqueVisitors: {
2518
+ basis: "estimatedUnique" | "exactLegacy";
2519
+ exact: boolean;
2520
+ };
2521
+ };
2522
+ truncated: boolean;
2523
+ }>>;
2524
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
2525
+ from: number;
2526
+ siteId: string;
2527
+ to: number;
2528
+ }, Promise<{
2529
+ datasets: Array<{
2530
+ coverage: {
2531
+ availableFrom: number | null;
2532
+ availableThrough: number | null;
2533
+ generation: number | null;
2534
+ retainedBefore: number | null;
2535
+ state: "complete" | "partial" | "retained" | "unavailable";
2536
+ };
2537
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2538
+ }>;
2539
+ from: number;
2540
+ siteId: string;
2541
+ to: number;
2542
+ }>>;
2543
+ };
952
2544
  export declare function componentHttpPaths(prefix?: string): {
953
2545
  readonly events: `${string}/events`;
954
2546
  readonly tracker: `${string}/tracker.js`;