@iann29/rastro 0.1.0-alpha.3 → 0.1.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/README.md +374 -62
  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 +1658 -8
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +228 -2
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +10 -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 +169 -1
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/cardinality.d.ts +12 -0
  19. package/dist/component/cardinality.d.ts.map +1 -0
  20. package/dist/component/cardinality.js +94 -0
  21. package/dist/component/cardinality.js.map +1 -0
  22. package/dist/component/constants.d.ts +11 -0
  23. package/dist/component/constants.d.ts.map +1 -1
  24. package/dist/component/constants.js +11 -0
  25. package/dist/component/constants.js.map +1 -1
  26. package/dist/component/coverage.d.ts +18 -0
  27. package/dist/component/coverage.d.ts.map +1 -0
  28. package/dist/component/coverage.js +19 -0
  29. package/dist/component/coverage.js.map +1 -0
  30. package/dist/component/errors.d.ts +1 -1
  31. package/dist/component/errors.d.ts.map +1 -1
  32. package/dist/component/errors.js.map +1 -1
  33. package/dist/component/eventStore.d.ts +1 -0
  34. package/dist/component/eventStore.d.ts.map +1 -1
  35. package/dist/component/http.d.ts.map +1 -1
  36. package/dist/component/http.js +85 -36
  37. package/dist/component/http.js.map +1 -1
  38. package/dist/component/identity.d.ts +13 -0
  39. package/dist/component/identity.d.ts.map +1 -0
  40. package/dist/component/identity.js +58 -0
  41. package/dist/component/identity.js.map +1 -0
  42. package/dist/component/ingest.d.ts +1 -0
  43. package/dist/component/ingest.d.ts.map +1 -1
  44. package/dist/component/ingest.js +258 -19
  45. package/dist/component/ingest.js.map +1 -1
  46. package/dist/component/live.d.ts.map +1 -1
  47. package/dist/component/live.js +6 -3
  48. package/dist/component/live.js.map +1 -1
  49. package/dist/component/reports.d.ts +120 -2
  50. package/dist/component/reports.d.ts.map +1 -1
  51. package/dist/component/reports.js +659 -91
  52. package/dist/component/reports.js.map +1 -1
  53. package/dist/component/retention.d.ts +75 -1
  54. package/dist/component/retention.d.ts.map +1 -1
  55. package/dist/component/retention.js +517 -54
  56. package/dist/component/retention.js.map +1 -1
  57. package/dist/component/sanitize.d.ts +4 -1
  58. package/dist/component/sanitize.d.ts.map +1 -1
  59. package/dist/component/sanitize.js +13 -5
  60. package/dist/component/sanitize.js.map +1 -1
  61. package/dist/component/schema.d.ts +224 -7
  62. package/dist/component/schema.js +113 -1
  63. package/dist/component/schema.js.map +1 -1
  64. package/dist/component/sites.d.ts.map +1 -1
  65. package/dist/component/sites.js +5 -1
  66. package/dist/component/sites.js.map +1 -1
  67. package/dist/component/useragent.d.ts +9 -0
  68. package/dist/component/useragent.d.ts.map +1 -0
  69. package/dist/component/useragent.js +152 -0
  70. package/dist/component/useragent.js.map +1 -0
  71. package/dist/component/validators.d.ts +42 -11
  72. package/dist/component/validators.d.ts.map +1 -1
  73. package/dist/component/validators.js +10 -1
  74. package/dist/component/validators.js.map +1 -1
  75. package/dist/component/visitors.d.ts +19 -0
  76. package/dist/component/visitors.d.ts.map +1 -0
  77. package/dist/component/visitors.js +86 -0
  78. package/dist/component/visitors.js.map +1 -0
  79. package/dist/tracker/generated.d.ts +4 -4
  80. package/dist/tracker/generated.d.ts.map +1 -1
  81. package/dist/tracker/generated.js +4 -4
  82. package/dist/tracker/generated.js.map +1 -1
  83. package/dist/tracker/tracker.js +23 -11
  84. package/dist/tracker/tracker.js.map +1 -1
  85. package/dist/tracker.min.js +1 -1
  86. package/docs/benchmarks/2026-08-20-realistic.md +4 -4
  87. package/docs/benchmarks/2026-08-21-formal-certification.md +333 -0
  88. package/docs/federation-setup.md +395 -0
  89. package/docs/federation.md +258 -0
  90. package/docs/upgrading.md +130 -0
  91. package/llms.txt +65 -0
  92. package/package.json +41 -11
  93. package/scripts/generate-federation-keys.mjs +20 -0
  94. package/src/component/_generated/api.ts +10 -0
  95. package/src/component/_generated/component.ts +228 -1
  96. package/src/component/cardinality.ts +116 -0
  97. package/src/component/constants.ts +11 -0
  98. package/src/component/coverage.ts +25 -0
  99. package/src/component/errors.ts +2 -1
  100. package/src/component/http.ts +129 -38
  101. package/src/component/identity.ts +74 -0
  102. package/src/component/ingest.ts +414 -13
  103. package/src/component/live.ts +8 -3
  104. package/src/component/reports.ts +910 -98
  105. package/src/component/retention.ts +624 -88
  106. package/src/component/sanitize.ts +19 -5
  107. package/src/component/schema.ts +125 -0
  108. package/src/component/sites.ts +5 -1
  109. package/src/component/useragent.ts +171 -0
  110. package/src/component/validators.ts +11 -0
  111. package/src/component/visitors.ts +105 -0
@@ -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"]>;
@@ -14,8 +18,10 @@ export type IngestInput = FunctionArgs<ComponentApi["ingest"]["ingestBatch"]>;
14
18
  export type IngestResult = FunctionReturnType<ComponentApi["ingest"]["ingestBatch"]>;
15
19
  export type TrackConversionInput = Omit<FunctionArgs<ComponentApi["ingest"]["trackConversion"]>, "affiliateSlug">;
16
20
  export type TrackConversionOutput = FunctionReturnType<ComponentApi["ingest"]["trackConversion"]>;
21
+ export type LinkVisitorInput = FunctionArgs<ComponentApi["visitors"]["link"]>;
22
+ export type LinkVisitorOutput = FunctionReturnType<ComponentApi["visitors"]["link"]>;
17
23
  export type OverviewInput = FunctionArgs<ComponentApi["reports"]["overview"]>;
18
- export type Overview = FunctionReturnType<ComponentApi["reports"]["overview"]>;
24
+ export type Overview = Infer<typeof hostOverviewValidator>;
19
25
  export type LiveVisitorsInput = FunctionArgs<ComponentApi["reports"]["liveVisitors"]>;
20
26
  export type LiveVisitor = FunctionReturnType<ComponentApi["reports"]["liveVisitors"]>[number];
21
27
  export type ListSessionsInput = FunctionArgs<ComponentApi["reports"]["listSessions"]>;
@@ -27,11 +33,11 @@ export type ConversionsPage = FunctionReturnType<ComponentApi["reports"]["listCo
27
33
  export type VisitorJourneyInput = FunctionArgs<ComponentApi["reports"]["visitorJourney"]>;
28
34
  export type VisitorJourney = FunctionReturnType<ComponentApi["reports"]["visitorJourney"]>;
29
35
  export type GoalsReportInput = FunctionArgs<ComponentApi["reports"]["goalsReport"]>;
30
- export type GoalsReport = FunctionReturnType<ComponentApi["reports"]["goalsReport"]>;
36
+ export type GoalsReport = Infer<typeof hostGoalsReportValidator>;
31
37
  export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsReport"]>;
32
- export type FunnelsReport = FunctionReturnType<ComponentApi["reports"]["funnelsReport"]>;
38
+ export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
33
39
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
34
- export type AffiliatesReport = FunctionReturnType<ComponentApi["reports"]["affiliatesReport"]>;
40
+ export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
35
41
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
36
42
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
37
43
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -41,8 +47,66 @@ export type Funnel = FunctionReturnType<ComponentApi["funnels"]["list"]>[number]
41
47
  export type UpsertAffiliateInput = FunctionArgs<ComponentApi["affiliates"]["upsert"]>;
42
48
  export type UpsertAffiliateOutput = FunctionReturnType<ComponentApi["affiliates"]["upsert"]>;
43
49
  export type Affiliate = FunctionReturnType<ComponentApi["affiliates"]["list"]>[number];
44
- export type CleanupInput = FunctionArgs<ComponentApi["retention"]["cleanup"]>;
45
- export type CleanupOutput = FunctionReturnType<ComponentApi["retention"]["cleanup"]>;
50
+ export type CleanupInput = {
51
+ siteId: string;
52
+ kind: RetentionKind;
53
+ before: number;
54
+ batchSize?: number;
55
+ };
56
+ export type CleanupOutput = {
57
+ deleted: number;
58
+ hasMore: boolean;
59
+ before: number;
60
+ };
61
+ export type DataCoverageInput = {
62
+ siteId: string;
63
+ from: number;
64
+ to: number;
65
+ };
66
+ export type DataCoverage = {
67
+ siteId: string;
68
+ from: number;
69
+ to: number;
70
+ datasets: Array<{
71
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
72
+ coverage: CoverageStatus;
73
+ }>;
74
+ };
75
+ export type CoverageStatus = {
76
+ state: "complete" | "partial" | "retained" | "unavailable";
77
+ generation: number | null;
78
+ availableFrom: number | null;
79
+ availableThrough: number | null;
80
+ retainedBefore: number | null;
81
+ };
82
+ export type RetentionPolicyInput = {
83
+ siteId: string;
84
+ eventsDays: number;
85
+ sessionsDays: number;
86
+ conversionsDays: number;
87
+ aggregatesDays: number;
88
+ reportsDays: number;
89
+ };
90
+ export type RetentionStatus = {
91
+ policy: (Omit<RetentionPolicyInput, "siteId"> & {
92
+ updatedAt: number;
93
+ }) | null;
94
+ jobs: Array<{
95
+ kind: string;
96
+ before: number;
97
+ status: "pending" | "running" | "complete";
98
+ deleted: number;
99
+ scheduledAt: number | null;
100
+ updatedAt: number;
101
+ }>;
102
+ backlog: number;
103
+ };
104
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
105
+ export type RunRetentionPolicyInput = {
106
+ siteId: string;
107
+ kind: RetentionKind;
108
+ batchSize?: number;
109
+ };
46
110
  export declare class Rastro {
47
111
  private readonly component;
48
112
  constructor(component: ComponentApi);
@@ -84,10 +148,52 @@ export declare class Rastro {
84
148
  duplicates: number;
85
149
  rejected: number;
86
150
  }>;
151
+ linkVisitor(ctx: MutationCtx, args: LinkVisitorInput): Promise<{
152
+ aliasCount: number;
153
+ linked: boolean;
154
+ }>;
87
155
  overview(ctx: QueryCtx | MutationCtx | ActionCtx, args: OverviewInput): Promise<{
88
156
  currency: string;
89
157
  from: number;
90
158
  interval: "hour" | "day";
159
+ metadata: {
160
+ breakdowns: {
161
+ topBrowsers: "eventVolume";
162
+ topCampaigns: "eventVolume";
163
+ topCountries: "eventVolume";
164
+ topDevices: "eventVolume";
165
+ topEvents: "eventVolume";
166
+ topGoals: "goalCompletionVolume";
167
+ topPages: "eventVolume";
168
+ topSources: "eventVolume";
169
+ };
170
+ coverage: {
171
+ availableFrom: number | null;
172
+ availableThrough: number | null;
173
+ generation: number | null;
174
+ retainedBefore: number | null;
175
+ state: "complete" | "partial" | "retained" | "unavailable";
176
+ };
177
+ features: {
178
+ botDetection: "userAgent";
179
+ errorInsights: "unsupported";
180
+ outboundLinks: "eventVolume";
181
+ sessionReplay: "unsupported";
182
+ };
183
+ range: {
184
+ boundary: "inclusive";
185
+ from: number;
186
+ timezone: "UTC";
187
+ to: number;
188
+ };
189
+ visitors: {
190
+ basis: "estimatedUnique" | "bucketOccurrences";
191
+ exact: boolean;
192
+ legacyIncomplete: boolean;
193
+ precision: number | null;
194
+ sketchVersion: number | null;
195
+ };
196
+ };
91
197
  timeSeries: Array<{
92
198
  clicks: number;
93
199
  conversions: number;
@@ -106,6 +212,11 @@ export declare class Rastro {
106
212
  revenueCents: number;
107
213
  value: string;
108
214
  }>;
215
+ topCampaigns: Array<{
216
+ count: number;
217
+ revenueCents: number;
218
+ value: string;
219
+ }>;
109
220
  topCountries: Array<{
110
221
  count: number;
111
222
  revenueCents: number;
@@ -204,6 +315,7 @@ export declare class Rastro {
204
315
  utmMedium?: string;
205
316
  utmSource?: string;
206
317
  visitorId: string;
318
+ visitorKey?: string;
207
319
  }>;
208
320
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
209
321
  splitCursor?: string | null;
@@ -308,6 +420,22 @@ export declare class Rastro {
308
420
  updatedAt: number;
309
421
  valueCents: number;
310
422
  }>;
423
+ metadata: {
424
+ basis: "dailyRollup" | "boundedLegacy";
425
+ coverage: {
426
+ availableFrom: number | null;
427
+ availableThrough: number | null;
428
+ generation: number | null;
429
+ retainedBefore: number | null;
430
+ state: "complete" | "partial" | "retained" | "unavailable";
431
+ };
432
+ range: {
433
+ boundary: "inclusive";
434
+ from: number;
435
+ timezone: "UTC";
436
+ to: number;
437
+ };
438
+ };
311
439
  truncated: boolean;
312
440
  }>;
313
441
  funnelsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: FunnelsReportInput): Promise<{
@@ -317,6 +445,22 @@ export declare class Rastro {
317
445
  conversionWindowMs: number;
318
446
  createdAt: number;
319
447
  key: string;
448
+ metadata: {
449
+ basis: "dailyRollup" | "boundedLegacy";
450
+ coverage: {
451
+ availableFrom: number | null;
452
+ availableThrough: number | null;
453
+ generation: number | null;
454
+ retainedBefore: number | null;
455
+ state: "complete" | "partial" | "retained" | "unavailable";
456
+ };
457
+ range: {
458
+ boundary: "inclusive";
459
+ from: number;
460
+ timezone: "UTC";
461
+ to: number;
462
+ };
463
+ };
320
464
  name: string;
321
465
  siteId: string;
322
466
  steps: Array<{
@@ -351,6 +495,26 @@ export declare class Rastro {
351
495
  updatedAt: number;
352
496
  visits: number;
353
497
  }>;
498
+ metadata: {
499
+ basis: "dailyRollup" | "boundedLegacy";
500
+ coverage: {
501
+ availableFrom: number | null;
502
+ availableThrough: number | null;
503
+ generation: number | null;
504
+ retainedBefore: number | null;
505
+ state: "complete" | "partial" | "retained" | "unavailable";
506
+ };
507
+ range: {
508
+ boundary: "inclusive";
509
+ from: number;
510
+ timezone: "UTC";
511
+ to: number;
512
+ };
513
+ uniqueVisitors: {
514
+ basis: "estimatedUnique" | "exactLegacy";
515
+ exact: boolean;
516
+ };
517
+ };
354
518
  truncated: boolean;
355
519
  }>;
356
520
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
@@ -401,11 +565,53 @@ export declare class Rastro {
401
565
  }[]>;
402
566
  removeAffiliate(ctx: MutationCtx, siteId: string, affiliateId: string): Promise<null>;
403
567
  cleanup(ctx: MutationCtx, args: CleanupInput): Promise<{
568
+ before: number;
569
+ deleted: number;
570
+ hasMore: boolean;
571
+ }>;
572
+ dataCoverage(ctx: QueryCtx | MutationCtx | ActionCtx, args: DataCoverageInput): Promise<{
573
+ datasets: Array<{
574
+ coverage: {
575
+ availableFrom: number | null;
576
+ availableThrough: number | null;
577
+ generation: number | null;
578
+ retainedBefore: number | null;
579
+ state: "complete" | "partial" | "retained" | "unavailable";
580
+ };
581
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
582
+ }>;
583
+ from: number;
584
+ siteId: string;
585
+ to: number;
586
+ }>;
587
+ setRetentionPolicy(ctx: MutationCtx, args: RetentionPolicyInput): Promise<null>;
588
+ disableRetentionPolicy(ctx: MutationCtx, siteId: string): Promise<null>;
589
+ retentionStatus(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
590
+ backlog: number;
591
+ jobs: Array<{
592
+ before: number;
593
+ deleted: number;
594
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
595
+ scheduledAt: number | null;
596
+ status: "pending" | "running" | "complete";
597
+ updatedAt: number;
598
+ }>;
599
+ policy: {
600
+ aggregatesDays: number;
601
+ conversionsDays: number;
602
+ eventsDays: number;
603
+ reportsDays: number;
604
+ sessionsDays: number;
605
+ updatedAt: number;
606
+ } | null;
607
+ }>;
608
+ runRetentionPolicy(ctx: MutationCtx, args: RunRetentionPolicyInput): Promise<{
609
+ before: number;
404
610
  deleted: number;
405
611
  hasMore: boolean;
406
612
  }>;
407
613
  }
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";
614
+ 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" | "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
615
  export type AnalyticsAuthorizationRequest = {
410
616
  operation: AnalyticsOperation;
411
617
  siteIds: string[];
@@ -413,6 +619,803 @@ export type AnalyticsAuthorizationRequest = {
413
619
  };
414
620
  export type AnalyticsAuthorizationContext = Pick<GenericQueryCtx<GenericDataModel>, "auth" | "db" | "runQuery">;
415
621
  export type AnalyticsAuthorizer = (ctx: AnalyticsAuthorizationContext, request: AnalyticsAuthorizationRequest) => void | Promise<void>;
622
+ declare const hostOverviewValidator: import("convex/values").VObject<{
623
+ currency: string;
624
+ from: number;
625
+ interval: "day" | "hour";
626
+ metadata: {
627
+ breakdowns: {
628
+ topBrowsers: "eventVolume";
629
+ topCampaigns: "eventVolume";
630
+ topCountries: "eventVolume";
631
+ topDevices: "eventVolume";
632
+ topEvents: "eventVolume";
633
+ topGoals: "goalCompletionVolume";
634
+ topPages: "eventVolume";
635
+ topSources: "eventVolume";
636
+ };
637
+ coverage: {
638
+ availableFrom: number | null;
639
+ availableThrough: number | null;
640
+ generation: number | null;
641
+ retainedBefore: number | null;
642
+ state: "complete" | "partial" | "retained" | "unavailable";
643
+ };
644
+ features: {
645
+ botDetection: "userAgent";
646
+ errorInsights: "unsupported";
647
+ outboundLinks: "eventVolume";
648
+ sessionReplay: "unsupported";
649
+ };
650
+ range: {
651
+ boundary: "inclusive";
652
+ from: number;
653
+ timezone: "UTC";
654
+ to: number;
655
+ };
656
+ visitors: {
657
+ basis: "bucketOccurrences" | "estimatedUnique";
658
+ exact: boolean;
659
+ legacyIncomplete: boolean;
660
+ precision: number | null;
661
+ sketchVersion: number | null;
662
+ };
663
+ };
664
+ timeSeries: {
665
+ clicks: number;
666
+ conversions: number;
667
+ customEvents: number;
668
+ events: number;
669
+ outboundClicks: number;
670
+ pageviews: number;
671
+ revenueCents: number;
672
+ sessions: number;
673
+ timestamp: number;
674
+ visitors: number;
675
+ }[];
676
+ to: number;
677
+ topBrowsers: {
678
+ count: number;
679
+ revenueCents: number;
680
+ value: string;
681
+ }[];
682
+ topCampaigns: {
683
+ count: number;
684
+ revenueCents: number;
685
+ value: string;
686
+ }[];
687
+ topCountries: {
688
+ count: number;
689
+ revenueCents: number;
690
+ value: string;
691
+ }[];
692
+ topDevices: {
693
+ count: number;
694
+ revenueCents: number;
695
+ value: string;
696
+ }[];
697
+ topEvents: {
698
+ count: number;
699
+ revenueCents: number;
700
+ value: string;
701
+ }[];
702
+ topGoals: {
703
+ count: number;
704
+ revenueCents: number;
705
+ value: string;
706
+ }[];
707
+ topPages: {
708
+ count: number;
709
+ revenueCents: number;
710
+ value: string;
711
+ }[];
712
+ topSources: {
713
+ count: number;
714
+ revenueCents: number;
715
+ value: string;
716
+ }[];
717
+ totals: {
718
+ clicks: number;
719
+ conversions: number;
720
+ customEvents: number;
721
+ events: number;
722
+ outboundClicks: number;
723
+ pageviews: number;
724
+ revenueCents: number;
725
+ sessions: number;
726
+ visitors: number;
727
+ };
728
+ }, {
729
+ from: import("convex/values").VFloat64<number, "required">;
730
+ to: import("convex/values").VFloat64<number, "required">;
731
+ interval: import("convex/values").VUnion<"day" | "hour", [import("convex/values").VLiteral<"hour", "required">, import("convex/values").VLiteral<"day", "required">], "required", never>;
732
+ currency: import("convex/values").VString<string, "required">;
733
+ totals: import("convex/values").VObject<{
734
+ clicks: number;
735
+ conversions: number;
736
+ customEvents: number;
737
+ events: number;
738
+ outboundClicks: number;
739
+ pageviews: number;
740
+ revenueCents: number;
741
+ sessions: number;
742
+ visitors: number;
743
+ }, {
744
+ events: import("convex/values").VFloat64<number, "required">;
745
+ pageviews: import("convex/values").VFloat64<number, "required">;
746
+ clicks: import("convex/values").VFloat64<number, "required">;
747
+ customEvents: import("convex/values").VFloat64<number, "required">;
748
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
749
+ sessions: import("convex/values").VFloat64<number, "required">;
750
+ visitors: import("convex/values").VFloat64<number, "required">;
751
+ conversions: import("convex/values").VFloat64<number, "required">;
752
+ revenueCents: import("convex/values").VFloat64<number, "required">;
753
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "visitors">;
754
+ timeSeries: import("convex/values").VArray<{
755
+ clicks: number;
756
+ conversions: number;
757
+ customEvents: number;
758
+ events: number;
759
+ outboundClicks: number;
760
+ pageviews: number;
761
+ revenueCents: number;
762
+ sessions: number;
763
+ timestamp: number;
764
+ visitors: number;
765
+ }[], import("convex/values").VObject<{
766
+ clicks: number;
767
+ conversions: number;
768
+ customEvents: number;
769
+ events: number;
770
+ outboundClicks: number;
771
+ pageviews: number;
772
+ revenueCents: number;
773
+ sessions: number;
774
+ timestamp: number;
775
+ visitors: number;
776
+ }, {
777
+ events: import("convex/values").VFloat64<number, "required">;
778
+ pageviews: import("convex/values").VFloat64<number, "required">;
779
+ clicks: import("convex/values").VFloat64<number, "required">;
780
+ customEvents: import("convex/values").VFloat64<number, "required">;
781
+ outboundClicks: import("convex/values").VFloat64<number, "required">;
782
+ sessions: import("convex/values").VFloat64<number, "required">;
783
+ visitors: import("convex/values").VFloat64<number, "required">;
784
+ conversions: import("convex/values").VFloat64<number, "required">;
785
+ revenueCents: import("convex/values").VFloat64<number, "required">;
786
+ timestamp: import("convex/values").VFloat64<number, "required">;
787
+ }, "required", "clicks" | "conversions" | "customEvents" | "events" | "outboundClicks" | "pageviews" | "revenueCents" | "sessions" | "timestamp" | "visitors">, "required">;
788
+ topSources: import("convex/values").VArray<{
789
+ count: number;
790
+ revenueCents: number;
791
+ value: string;
792
+ }[], import("convex/values").VObject<{
793
+ count: number;
794
+ revenueCents: number;
795
+ value: string;
796
+ }, {
797
+ value: import("convex/values").VString<string, "required">;
798
+ count: import("convex/values").VFloat64<number, "required">;
799
+ revenueCents: import("convex/values").VFloat64<number, "required">;
800
+ }, "required", "count" | "revenueCents" | "value">, "required">;
801
+ topCampaigns: import("convex/values").VArray<{
802
+ count: number;
803
+ revenueCents: number;
804
+ value: string;
805
+ }[], import("convex/values").VObject<{
806
+ count: number;
807
+ revenueCents: number;
808
+ value: string;
809
+ }, {
810
+ value: import("convex/values").VString<string, "required">;
811
+ count: import("convex/values").VFloat64<number, "required">;
812
+ revenueCents: import("convex/values").VFloat64<number, "required">;
813
+ }, "required", "count" | "revenueCents" | "value">, "required">;
814
+ topPages: import("convex/values").VArray<{
815
+ count: number;
816
+ revenueCents: number;
817
+ value: string;
818
+ }[], import("convex/values").VObject<{
819
+ count: number;
820
+ revenueCents: number;
821
+ value: string;
822
+ }, {
823
+ value: import("convex/values").VString<string, "required">;
824
+ count: import("convex/values").VFloat64<number, "required">;
825
+ revenueCents: import("convex/values").VFloat64<number, "required">;
826
+ }, "required", "count" | "revenueCents" | "value">, "required">;
827
+ topCountries: import("convex/values").VArray<{
828
+ count: number;
829
+ revenueCents: number;
830
+ value: string;
831
+ }[], import("convex/values").VObject<{
832
+ count: number;
833
+ revenueCents: number;
834
+ value: string;
835
+ }, {
836
+ value: import("convex/values").VString<string, "required">;
837
+ count: import("convex/values").VFloat64<number, "required">;
838
+ revenueCents: import("convex/values").VFloat64<number, "required">;
839
+ }, "required", "count" | "revenueCents" | "value">, "required">;
840
+ topDevices: import("convex/values").VArray<{
841
+ count: number;
842
+ revenueCents: number;
843
+ value: string;
844
+ }[], import("convex/values").VObject<{
845
+ count: number;
846
+ revenueCents: number;
847
+ value: string;
848
+ }, {
849
+ value: import("convex/values").VString<string, "required">;
850
+ count: import("convex/values").VFloat64<number, "required">;
851
+ revenueCents: import("convex/values").VFloat64<number, "required">;
852
+ }, "required", "count" | "revenueCents" | "value">, "required">;
853
+ topBrowsers: import("convex/values").VArray<{
854
+ count: number;
855
+ revenueCents: number;
856
+ value: string;
857
+ }[], import("convex/values").VObject<{
858
+ count: number;
859
+ revenueCents: number;
860
+ value: string;
861
+ }, {
862
+ value: import("convex/values").VString<string, "required">;
863
+ count: import("convex/values").VFloat64<number, "required">;
864
+ revenueCents: import("convex/values").VFloat64<number, "required">;
865
+ }, "required", "count" | "revenueCents" | "value">, "required">;
866
+ topEvents: import("convex/values").VArray<{
867
+ count: number;
868
+ revenueCents: number;
869
+ value: string;
870
+ }[], import("convex/values").VObject<{
871
+ count: number;
872
+ revenueCents: number;
873
+ value: string;
874
+ }, {
875
+ value: import("convex/values").VString<string, "required">;
876
+ count: import("convex/values").VFloat64<number, "required">;
877
+ revenueCents: import("convex/values").VFloat64<number, "required">;
878
+ }, "required", "count" | "revenueCents" | "value">, "required">;
879
+ topGoals: import("convex/values").VArray<{
880
+ count: number;
881
+ revenueCents: number;
882
+ value: string;
883
+ }[], import("convex/values").VObject<{
884
+ count: number;
885
+ revenueCents: number;
886
+ value: string;
887
+ }, {
888
+ value: import("convex/values").VString<string, "required">;
889
+ count: import("convex/values").VFloat64<number, "required">;
890
+ revenueCents: import("convex/values").VFloat64<number, "required">;
891
+ }, "required", "count" | "revenueCents" | "value">, "required">;
892
+ metadata: import("convex/values").VObject<{
893
+ breakdowns: {
894
+ topBrowsers: "eventVolume";
895
+ topCampaigns: "eventVolume";
896
+ topCountries: "eventVolume";
897
+ topDevices: "eventVolume";
898
+ topEvents: "eventVolume";
899
+ topGoals: "goalCompletionVolume";
900
+ topPages: "eventVolume";
901
+ topSources: "eventVolume";
902
+ };
903
+ coverage: {
904
+ availableFrom: number | null;
905
+ availableThrough: number | null;
906
+ generation: number | null;
907
+ retainedBefore: number | null;
908
+ state: "complete" | "partial" | "retained" | "unavailable";
909
+ };
910
+ features: {
911
+ botDetection: "userAgent";
912
+ errorInsights: "unsupported";
913
+ outboundLinks: "eventVolume";
914
+ sessionReplay: "unsupported";
915
+ };
916
+ range: {
917
+ boundary: "inclusive";
918
+ from: number;
919
+ timezone: "UTC";
920
+ to: number;
921
+ };
922
+ visitors: {
923
+ basis: "bucketOccurrences" | "estimatedUnique";
924
+ exact: boolean;
925
+ legacyIncomplete: boolean;
926
+ precision: number | null;
927
+ sketchVersion: number | null;
928
+ };
929
+ }, {
930
+ visitors: import("convex/values").VObject<{
931
+ basis: "bucketOccurrences" | "estimatedUnique";
932
+ exact: boolean;
933
+ legacyIncomplete: boolean;
934
+ precision: number | null;
935
+ sketchVersion: number | null;
936
+ }, {
937
+ basis: import("convex/values").VUnion<"bucketOccurrences" | "estimatedUnique", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"bucketOccurrences", "required">], "required", never>;
938
+ exact: import("convex/values").VBoolean<boolean, "required">;
939
+ legacyIncomplete: import("convex/values").VBoolean<boolean, "required">;
940
+ sketchVersion: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
941
+ precision: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
942
+ }, "required", "basis" | "exact" | "legacyIncomplete" | "precision" | "sketchVersion">;
943
+ breakdowns: import("convex/values").VObject<{
944
+ topBrowsers: "eventVolume";
945
+ topCampaigns: "eventVolume";
946
+ topCountries: "eventVolume";
947
+ topDevices: "eventVolume";
948
+ topEvents: "eventVolume";
949
+ topGoals: "goalCompletionVolume";
950
+ topPages: "eventVolume";
951
+ topSources: "eventVolume";
952
+ }, {
953
+ topSources: import("convex/values").VLiteral<"eventVolume", "required">;
954
+ topCampaigns: import("convex/values").VLiteral<"eventVolume", "required">;
955
+ topPages: import("convex/values").VLiteral<"eventVolume", "required">;
956
+ topCountries: import("convex/values").VLiteral<"eventVolume", "required">;
957
+ topDevices: import("convex/values").VLiteral<"eventVolume", "required">;
958
+ topBrowsers: import("convex/values").VLiteral<"eventVolume", "required">;
959
+ topEvents: import("convex/values").VLiteral<"eventVolume", "required">;
960
+ topGoals: import("convex/values").VLiteral<"goalCompletionVolume", "required">;
961
+ }, "required", "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources">;
962
+ coverage: import("convex/values").VObject<{
963
+ availableFrom: number | null;
964
+ availableThrough: number | null;
965
+ generation: number | null;
966
+ retainedBefore: number | null;
967
+ state: "complete" | "partial" | "retained" | "unavailable";
968
+ }, {
969
+ 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>;
970
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
971
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
972
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
973
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
974
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
975
+ range: import("convex/values").VObject<{
976
+ boundary: "inclusive";
977
+ from: number;
978
+ timezone: "UTC";
979
+ to: number;
980
+ }, {
981
+ from: import("convex/values").VFloat64<number, "required">;
982
+ to: import("convex/values").VFloat64<number, "required">;
983
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
984
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
985
+ }, "required", "boundary" | "from" | "timezone" | "to">;
986
+ features: import("convex/values").VObject<{
987
+ botDetection: "userAgent";
988
+ errorInsights: "unsupported";
989
+ outboundLinks: "eventVolume";
990
+ sessionReplay: "unsupported";
991
+ }, {
992
+ sessionReplay: import("convex/values").VLiteral<"unsupported", "required">;
993
+ errorInsights: import("convex/values").VLiteral<"unsupported", "required">;
994
+ outboundLinks: import("convex/values").VLiteral<"eventVolume", "required">;
995
+ botDetection: import("convex/values").VLiteral<"userAgent", "required">;
996
+ }, "required", "botDetection" | "errorInsights" | "outboundLinks" | "sessionReplay">;
997
+ }, "required", "breakdowns" | "breakdowns.topBrowsers" | "breakdowns.topCampaigns" | "breakdowns.topCountries" | "breakdowns.topDevices" | "breakdowns.topEvents" | "breakdowns.topGoals" | "breakdowns.topPages" | "breakdowns.topSources" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "features" | "features.botDetection" | "features.errorInsights" | "features.outboundLinks" | "features.sessionReplay" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "visitors" | "visitors.basis" | "visitors.exact" | "visitors.legacyIncomplete" | "visitors.precision" | "visitors.sketchVersion">;
998
+ }, "required", "currency" | "from" | "interval" | "metadata" | "metadata.breakdowns" | "metadata.breakdowns.topBrowsers" | "metadata.breakdowns.topCampaigns" | "metadata.breakdowns.topCountries" | "metadata.breakdowns.topDevices" | "metadata.breakdowns.topEvents" | "metadata.breakdowns.topGoals" | "metadata.breakdowns.topPages" | "metadata.breakdowns.topSources" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.features" | "metadata.features.botDetection" | "metadata.features.errorInsights" | "metadata.features.outboundLinks" | "metadata.features.sessionReplay" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.visitors" | "metadata.visitors.basis" | "metadata.visitors.exact" | "metadata.visitors.legacyIncomplete" | "metadata.visitors.precision" | "metadata.visitors.sketchVersion" | "timeSeries" | "to" | "topBrowsers" | "topCampaigns" | "topCountries" | "topDevices" | "topEvents" | "topGoals" | "topPages" | "topSources" | "totals" | "totals.clicks" | "totals.conversions" | "totals.customEvents" | "totals.events" | "totals.outboundClicks" | "totals.pageviews" | "totals.revenueCents" | "totals.sessions" | "totals.visitors">;
999
+ declare const hostGoalsReportValidator: import("convex/values").VObject<{
1000
+ goals: {
1001
+ _creationTime: number;
1002
+ _id: string;
1003
+ active: boolean;
1004
+ completions: number;
1005
+ createdAt: number;
1006
+ key: string;
1007
+ matchType: "custom" | "pageview";
1008
+ matchValue: string;
1009
+ name: string;
1010
+ siteId: string;
1011
+ updatedAt: number;
1012
+ valueCents: number;
1013
+ }[];
1014
+ metadata: {
1015
+ basis: "boundedLegacy" | "dailyRollup";
1016
+ coverage: {
1017
+ availableFrom: number | null;
1018
+ availableThrough: number | null;
1019
+ generation: number | null;
1020
+ retainedBefore: number | null;
1021
+ state: "complete" | "partial" | "retained" | "unavailable";
1022
+ };
1023
+ range: {
1024
+ boundary: "inclusive";
1025
+ from: number;
1026
+ timezone: "UTC";
1027
+ to: number;
1028
+ };
1029
+ };
1030
+ truncated: boolean;
1031
+ }, {
1032
+ goals: import("convex/values").VArray<{
1033
+ _creationTime: number;
1034
+ _id: string;
1035
+ active: boolean;
1036
+ completions: number;
1037
+ createdAt: number;
1038
+ key: string;
1039
+ matchType: "custom" | "pageview";
1040
+ matchValue: string;
1041
+ name: string;
1042
+ siteId: string;
1043
+ updatedAt: number;
1044
+ valueCents: number;
1045
+ }[], import("convex/values").VObject<{
1046
+ _creationTime: number;
1047
+ _id: string;
1048
+ active: boolean;
1049
+ completions: number;
1050
+ createdAt: number;
1051
+ key: string;
1052
+ matchType: "custom" | "pageview";
1053
+ matchValue: string;
1054
+ name: string;
1055
+ siteId: string;
1056
+ updatedAt: number;
1057
+ valueCents: number;
1058
+ }, {
1059
+ _id: import("convex/values").VString<string, "required">;
1060
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1061
+ siteId: import("convex/values").VString<string, "required">;
1062
+ key: import("convex/values").VString<string, "required">;
1063
+ name: import("convex/values").VString<string, "required">;
1064
+ matchType: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1065
+ matchValue: import("convex/values").VString<string, "required">;
1066
+ valueCents: never;
1067
+ active: import("convex/values").VBoolean<boolean, "required">;
1068
+ createdAt: import("convex/values").VFloat64<number, "required">;
1069
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1070
+ completions: import("convex/values").VFloat64<number, "required">;
1071
+ }, "required", "_creationTime" | "_id" | "active" | "completions" | "createdAt" | "key" | "matchType" | "matchValue" | "name" | "siteId" | "updatedAt" | "valueCents">, "required">;
1072
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1073
+ metadata: import("convex/values").VObject<{
1074
+ basis: "boundedLegacy" | "dailyRollup";
1075
+ coverage: {
1076
+ availableFrom: number | null;
1077
+ availableThrough: number | null;
1078
+ generation: number | null;
1079
+ retainedBefore: number | null;
1080
+ state: "complete" | "partial" | "retained" | "unavailable";
1081
+ };
1082
+ range: {
1083
+ boundary: "inclusive";
1084
+ from: number;
1085
+ timezone: "UTC";
1086
+ to: number;
1087
+ };
1088
+ }, {
1089
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1090
+ coverage: import("convex/values").VObject<{
1091
+ availableFrom: number | null;
1092
+ availableThrough: number | null;
1093
+ generation: number | null;
1094
+ retainedBefore: number | null;
1095
+ state: "complete" | "partial" | "retained" | "unavailable";
1096
+ }, {
1097
+ 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>;
1098
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1099
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1100
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1101
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1102
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1103
+ range: import("convex/values").VObject<{
1104
+ boundary: "inclusive";
1105
+ from: number;
1106
+ timezone: "UTC";
1107
+ to: number;
1108
+ }, {
1109
+ from: import("convex/values").VFloat64<number, "required">;
1110
+ to: import("convex/values").VFloat64<number, "required">;
1111
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1112
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1113
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1114
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1115
+ }, "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">;
1116
+ declare const hostFunnelsReportValidator: import("convex/values").VArray<{
1117
+ _creationTime: number;
1118
+ _id: string;
1119
+ active: boolean;
1120
+ conversionWindowMs: number;
1121
+ createdAt: number;
1122
+ key: string;
1123
+ metadata: {
1124
+ basis: "boundedLegacy" | "dailyRollup";
1125
+ coverage: {
1126
+ availableFrom: number | null;
1127
+ availableThrough: number | null;
1128
+ generation: number | null;
1129
+ retainedBefore: number | null;
1130
+ state: "complete" | "partial" | "retained" | "unavailable";
1131
+ };
1132
+ range: {
1133
+ boundary: "inclusive";
1134
+ from: number;
1135
+ timezone: "UTC";
1136
+ to: number;
1137
+ };
1138
+ };
1139
+ name: string;
1140
+ siteId: string;
1141
+ steps: {
1142
+ name: string;
1143
+ type: "custom" | "pageview";
1144
+ value: string;
1145
+ }[];
1146
+ stepsReport: {
1147
+ completions: number;
1148
+ entrants: number;
1149
+ name: string;
1150
+ step: number;
1151
+ }[];
1152
+ truncated: boolean;
1153
+ updatedAt: number;
1154
+ }[], import("convex/values").VObject<{
1155
+ _creationTime: number;
1156
+ _id: string;
1157
+ active: boolean;
1158
+ conversionWindowMs: number;
1159
+ createdAt: number;
1160
+ key: string;
1161
+ metadata: {
1162
+ basis: "boundedLegacy" | "dailyRollup";
1163
+ coverage: {
1164
+ availableFrom: number | null;
1165
+ availableThrough: number | null;
1166
+ generation: number | null;
1167
+ retainedBefore: number | null;
1168
+ state: "complete" | "partial" | "retained" | "unavailable";
1169
+ };
1170
+ range: {
1171
+ boundary: "inclusive";
1172
+ from: number;
1173
+ timezone: "UTC";
1174
+ to: number;
1175
+ };
1176
+ };
1177
+ name: string;
1178
+ siteId: string;
1179
+ steps: {
1180
+ name: string;
1181
+ type: "custom" | "pageview";
1182
+ value: string;
1183
+ }[];
1184
+ stepsReport: {
1185
+ completions: number;
1186
+ entrants: number;
1187
+ name: string;
1188
+ step: number;
1189
+ }[];
1190
+ truncated: boolean;
1191
+ updatedAt: number;
1192
+ }, {
1193
+ _id: import("convex/values").VString<string, "required">;
1194
+ _creationTime: import("convex/values").VFloat64<number, "required">;
1195
+ siteId: import("convex/values").VString<string, "required">;
1196
+ key: import("convex/values").VString<string, "required">;
1197
+ name: import("convex/values").VString<string, "required">;
1198
+ steps: import("convex/values").VArray<{
1199
+ name: string;
1200
+ type: "custom" | "pageview";
1201
+ value: string;
1202
+ }[], import("convex/values").VObject<{
1203
+ name: string;
1204
+ type: "custom" | "pageview";
1205
+ value: string;
1206
+ }, {
1207
+ type: import("convex/values").VUnion<"custom" | "pageview", [import("convex/values").VLiteral<"pageview", "required">, import("convex/values").VLiteral<"custom", "required">], "required", never>;
1208
+ value: import("convex/values").VString<string, "required">;
1209
+ name: import("convex/values").VString<string, "required">;
1210
+ }, "required", "name" | "type" | "value">, "required">;
1211
+ conversionWindowMs: import("convex/values").VFloat64<number, "required">;
1212
+ active: import("convex/values").VBoolean<boolean, "required">;
1213
+ createdAt: import("convex/values").VFloat64<number, "required">;
1214
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1215
+ stepsReport: import("convex/values").VArray<{
1216
+ completions: number;
1217
+ entrants: number;
1218
+ name: string;
1219
+ step: number;
1220
+ }[], import("convex/values").VObject<{
1221
+ completions: number;
1222
+ entrants: number;
1223
+ name: string;
1224
+ step: number;
1225
+ }, {
1226
+ step: import("convex/values").VFloat64<number, "required">;
1227
+ name: import("convex/values").VString<string, "required">;
1228
+ entrants: import("convex/values").VFloat64<number, "required">;
1229
+ completions: import("convex/values").VFloat64<number, "required">;
1230
+ }, "required", "completions" | "entrants" | "name" | "step">, "required">;
1231
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1232
+ metadata: import("convex/values").VObject<{
1233
+ basis: "boundedLegacy" | "dailyRollup";
1234
+ coverage: {
1235
+ availableFrom: number | null;
1236
+ availableThrough: number | null;
1237
+ generation: number | null;
1238
+ retainedBefore: number | null;
1239
+ state: "complete" | "partial" | "retained" | "unavailable";
1240
+ };
1241
+ range: {
1242
+ boundary: "inclusive";
1243
+ from: number;
1244
+ timezone: "UTC";
1245
+ to: number;
1246
+ };
1247
+ }, {
1248
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1249
+ coverage: import("convex/values").VObject<{
1250
+ availableFrom: number | null;
1251
+ availableThrough: number | null;
1252
+ generation: number | null;
1253
+ retainedBefore: number | null;
1254
+ state: "complete" | "partial" | "retained" | "unavailable";
1255
+ }, {
1256
+ 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>;
1257
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1258
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1259
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1260
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1261
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1262
+ range: import("convex/values").VObject<{
1263
+ boundary: "inclusive";
1264
+ from: number;
1265
+ timezone: "UTC";
1266
+ to: number;
1267
+ }, {
1268
+ from: import("convex/values").VFloat64<number, "required">;
1269
+ to: import("convex/values").VFloat64<number, "required">;
1270
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1271
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1272
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1273
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1274
+ }, "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">;
1275
+ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1276
+ affiliates: {
1277
+ _creationTime: number;
1278
+ _id: string;
1279
+ active: boolean;
1280
+ attributionWindowDays: number;
1281
+ commissionBps: number;
1282
+ commissionCents: number;
1283
+ conversions: number;
1284
+ createdAt: number;
1285
+ name: string;
1286
+ revenueCents: number;
1287
+ siteId: string;
1288
+ slug: string;
1289
+ uniqueVisitors: number;
1290
+ updatedAt: number;
1291
+ visits: number;
1292
+ }[];
1293
+ metadata: {
1294
+ basis: "boundedLegacy" | "dailyRollup";
1295
+ coverage: {
1296
+ availableFrom: number | null;
1297
+ availableThrough: number | null;
1298
+ generation: number | null;
1299
+ retainedBefore: number | null;
1300
+ state: "complete" | "partial" | "retained" | "unavailable";
1301
+ };
1302
+ range: {
1303
+ boundary: "inclusive";
1304
+ from: number;
1305
+ timezone: "UTC";
1306
+ to: number;
1307
+ };
1308
+ uniqueVisitors: {
1309
+ basis: "estimatedUnique" | "exactLegacy";
1310
+ exact: boolean;
1311
+ };
1312
+ };
1313
+ truncated: boolean;
1314
+ }, {
1315
+ affiliates: import("convex/values").VArray<{
1316
+ _creationTime: number;
1317
+ _id: string;
1318
+ active: boolean;
1319
+ attributionWindowDays: number;
1320
+ commissionBps: number;
1321
+ commissionCents: number;
1322
+ conversions: number;
1323
+ createdAt: number;
1324
+ name: string;
1325
+ revenueCents: number;
1326
+ siteId: string;
1327
+ slug: string;
1328
+ uniqueVisitors: number;
1329
+ updatedAt: number;
1330
+ visits: number;
1331
+ }[], import("convex/values").VObject<{
1332
+ _creationTime: number;
1333
+ _id: string;
1334
+ active: boolean;
1335
+ attributionWindowDays: number;
1336
+ commissionBps: number;
1337
+ commissionCents: number;
1338
+ conversions: number;
1339
+ createdAt: number;
1340
+ name: string;
1341
+ revenueCents: number;
1342
+ siteId: string;
1343
+ slug: string;
1344
+ uniqueVisitors: number;
1345
+ updatedAt: number;
1346
+ visits: 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
+ slug: import("convex/values").VString<string, "required">;
1352
+ name: import("convex/values").VString<string, "required">;
1353
+ commissionBps: import("convex/values").VFloat64<number, "required">;
1354
+ attributionWindowDays: import("convex/values").VFloat64<number, "required">;
1355
+ active: import("convex/values").VBoolean<boolean, "required">;
1356
+ createdAt: import("convex/values").VFloat64<number, "required">;
1357
+ updatedAt: import("convex/values").VFloat64<number, "required">;
1358
+ visits: import("convex/values").VFloat64<number, "required">;
1359
+ uniqueVisitors: import("convex/values").VFloat64<number, "required">;
1360
+ conversions: import("convex/values").VFloat64<number, "required">;
1361
+ revenueCents: import("convex/values").VFloat64<number, "required">;
1362
+ commissionCents: import("convex/values").VFloat64<number, "required">;
1363
+ }, "required", "_creationTime" | "_id" | "active" | "attributionWindowDays" | "commissionBps" | "commissionCents" | "conversions" | "createdAt" | "name" | "revenueCents" | "siteId" | "slug" | "uniqueVisitors" | "updatedAt" | "visits">, "required">;
1364
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1365
+ metadata: import("convex/values").VObject<{
1366
+ basis: "boundedLegacy" | "dailyRollup";
1367
+ coverage: {
1368
+ availableFrom: number | null;
1369
+ availableThrough: number | null;
1370
+ generation: number | null;
1371
+ retainedBefore: number | null;
1372
+ state: "complete" | "partial" | "retained" | "unavailable";
1373
+ };
1374
+ range: {
1375
+ boundary: "inclusive";
1376
+ from: number;
1377
+ timezone: "UTC";
1378
+ to: number;
1379
+ };
1380
+ uniqueVisitors: {
1381
+ basis: "estimatedUnique" | "exactLegacy";
1382
+ exact: boolean;
1383
+ };
1384
+ }, {
1385
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1386
+ coverage: import("convex/values").VObject<{
1387
+ availableFrom: number | null;
1388
+ availableThrough: number | null;
1389
+ generation: number | null;
1390
+ retainedBefore: number | null;
1391
+ state: "complete" | "partial" | "retained" | "unavailable";
1392
+ }, {
1393
+ 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>;
1394
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1395
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1396
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1397
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1398
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1399
+ range: import("convex/values").VObject<{
1400
+ boundary: "inclusive";
1401
+ from: number;
1402
+ timezone: "UTC";
1403
+ to: number;
1404
+ }, {
1405
+ from: import("convex/values").VFloat64<number, "required">;
1406
+ to: import("convex/values").VFloat64<number, "required">;
1407
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1408
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1409
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1410
+ uniqueVisitors: import("convex/values").VObject<{
1411
+ basis: "estimatedUnique" | "exactLegacy";
1412
+ exact: boolean;
1413
+ }, {
1414
+ basis: import("convex/values").VUnion<"estimatedUnique" | "exactLegacy", [import("convex/values").VLiteral<"estimatedUnique", "required">, import("convex/values").VLiteral<"exactLegacy", "required">], "required", never>;
1415
+ exact: import("convex/values").VBoolean<boolean, "required">;
1416
+ }, "required", "basis" | "exact">;
1417
+ }, "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">;
1418
+ }, "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
1419
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
417
1420
  authorize: AnalyticsAuthorizer;
418
1421
  }): {
@@ -474,6 +1477,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
474
1477
  latitude?: number | undefined;
475
1478
  longitude?: number | undefined;
476
1479
  os?: string | undefined;
1480
+ visitorKey?: string | undefined;
477
1481
  } | undefined;
478
1482
  events: {
479
1483
  affiliateSlug?: string | undefined;
@@ -515,6 +1519,14 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
515
1519
  duplicates: number;
516
1520
  rejected: number;
517
1521
  }>>;
1522
+ linkVisitor: import("convex/server").RegisteredMutation<"public", {
1523
+ previousVisitorId: string;
1524
+ siteId: string;
1525
+ visitorId: string;
1526
+ }, Promise<{
1527
+ aliasCount: number;
1528
+ linked: boolean;
1529
+ }>>;
518
1530
  overview: import("convex/server").RegisteredQuery<"public", {
519
1531
  from: number;
520
1532
  interval?: "day" | "hour" | undefined;
@@ -524,6 +1536,44 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
524
1536
  currency: string;
525
1537
  from: number;
526
1538
  interval: "hour" | "day";
1539
+ metadata: {
1540
+ breakdowns: {
1541
+ topBrowsers: "eventVolume";
1542
+ topCampaigns: "eventVolume";
1543
+ topCountries: "eventVolume";
1544
+ topDevices: "eventVolume";
1545
+ topEvents: "eventVolume";
1546
+ topGoals: "goalCompletionVolume";
1547
+ topPages: "eventVolume";
1548
+ topSources: "eventVolume";
1549
+ };
1550
+ coverage: {
1551
+ availableFrom: number | null;
1552
+ availableThrough: number | null;
1553
+ generation: number | null;
1554
+ retainedBefore: number | null;
1555
+ state: "complete" | "partial" | "retained" | "unavailable";
1556
+ };
1557
+ features: {
1558
+ botDetection: "userAgent";
1559
+ errorInsights: "unsupported";
1560
+ outboundLinks: "eventVolume";
1561
+ sessionReplay: "unsupported";
1562
+ };
1563
+ range: {
1564
+ boundary: "inclusive";
1565
+ from: number;
1566
+ timezone: "UTC";
1567
+ to: number;
1568
+ };
1569
+ visitors: {
1570
+ basis: "estimatedUnique" | "bucketOccurrences";
1571
+ exact: boolean;
1572
+ legacyIncomplete: boolean;
1573
+ precision: number | null;
1574
+ sketchVersion: number | null;
1575
+ };
1576
+ };
527
1577
  timeSeries: Array<{
528
1578
  clicks: number;
529
1579
  conversions: number;
@@ -542,6 +1592,11 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
542
1592
  revenueCents: number;
543
1593
  value: string;
544
1594
  }>;
1595
+ topCampaigns: Array<{
1596
+ count: number;
1597
+ revenueCents: number;
1598
+ value: string;
1599
+ }>;
545
1600
  topCountries: Array<{
546
1601
  count: number;
547
1602
  revenueCents: number;
@@ -656,6 +1711,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
656
1711
  utmMedium?: string;
657
1712
  utmSource?: string;
658
1713
  visitorId: string;
1714
+ visitorKey?: string;
659
1715
  }>;
660
1716
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
661
1717
  splitCursor?: string | null;
@@ -795,6 +1851,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
795
1851
  updatedAt: number;
796
1852
  valueCents: number;
797
1853
  }>;
1854
+ metadata: {
1855
+ basis: "dailyRollup" | "boundedLegacy";
1856
+ coverage: {
1857
+ availableFrom: number | null;
1858
+ availableThrough: number | null;
1859
+ generation: number | null;
1860
+ retainedBefore: number | null;
1861
+ state: "complete" | "partial" | "retained" | "unavailable";
1862
+ };
1863
+ range: {
1864
+ boundary: "inclusive";
1865
+ from: number;
1866
+ timezone: "UTC";
1867
+ to: number;
1868
+ };
1869
+ };
798
1870
  truncated: boolean;
799
1871
  }>>;
800
1872
  funnelsReport: import("convex/server").RegisteredQuery<"public", {
@@ -808,6 +1880,22 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
808
1880
  conversionWindowMs: number;
809
1881
  createdAt: number;
810
1882
  key: string;
1883
+ metadata: {
1884
+ basis: "dailyRollup" | "boundedLegacy";
1885
+ coverage: {
1886
+ availableFrom: number | null;
1887
+ availableThrough: number | null;
1888
+ generation: number | null;
1889
+ retainedBefore: number | null;
1890
+ state: "complete" | "partial" | "retained" | "unavailable";
1891
+ };
1892
+ range: {
1893
+ boundary: "inclusive";
1894
+ from: number;
1895
+ timezone: "UTC";
1896
+ to: number;
1897
+ };
1898
+ };
811
1899
  name: string;
812
1900
  siteId: string;
813
1901
  steps: Array<{
@@ -846,8 +1934,88 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
846
1934
  updatedAt: number;
847
1935
  visits: number;
848
1936
  }>;
1937
+ metadata: {
1938
+ basis: "dailyRollup" | "boundedLegacy";
1939
+ coverage: {
1940
+ availableFrom: number | null;
1941
+ availableThrough: number | null;
1942
+ generation: number | null;
1943
+ retainedBefore: number | null;
1944
+ state: "complete" | "partial" | "retained" | "unavailable";
1945
+ };
1946
+ range: {
1947
+ boundary: "inclusive";
1948
+ from: number;
1949
+ timezone: "UTC";
1950
+ to: number;
1951
+ };
1952
+ uniqueVisitors: {
1953
+ basis: "estimatedUnique" | "exactLegacy";
1954
+ exact: boolean;
1955
+ };
1956
+ };
849
1957
  truncated: boolean;
850
1958
  }>>;
1959
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
1960
+ from: number;
1961
+ siteId: string;
1962
+ to: number;
1963
+ }, Promise<{
1964
+ datasets: Array<{
1965
+ coverage: {
1966
+ availableFrom: number | null;
1967
+ availableThrough: number | null;
1968
+ generation: number | null;
1969
+ retainedBefore: number | null;
1970
+ state: "complete" | "partial" | "retained" | "unavailable";
1971
+ };
1972
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
1973
+ }>;
1974
+ from: number;
1975
+ siteId: string;
1976
+ to: number;
1977
+ }>>;
1978
+ retentionStatus: import("convex/server").RegisteredQuery<"public", {
1979
+ siteId: string;
1980
+ }, Promise<{
1981
+ backlog: number;
1982
+ jobs: Array<{
1983
+ before: number;
1984
+ deleted: number;
1985
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
1986
+ scheduledAt: number | null;
1987
+ status: "pending" | "running" | "complete";
1988
+ updatedAt: number;
1989
+ }>;
1990
+ policy: {
1991
+ aggregatesDays: number;
1992
+ conversionsDays: number;
1993
+ eventsDays: number;
1994
+ reportsDays: number;
1995
+ sessionsDays: number;
1996
+ updatedAt: number;
1997
+ } | null;
1998
+ }>>;
1999
+ setRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2000
+ aggregatesDays: number;
2001
+ conversionsDays: number;
2002
+ eventsDays: number;
2003
+ reportsDays: number;
2004
+ sessionsDays: number;
2005
+ siteId: string;
2006
+ }, Promise<null>>;
2007
+ disableRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2008
+ siteId: string;
2009
+ }, Promise<null>>;
2010
+ runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2011
+ batchSize?: number | undefined;
2012
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2013
+ siteId: string;
2014
+ }, Promise<{
2015
+ before: number;
2016
+ deleted: number;
2017
+ hasMore: boolean;
2018
+ }>>;
851
2019
  upsertGoal: import("convex/server").RegisteredMutation<"public", {
852
2020
  active?: boolean | undefined;
853
2021
  goalId?: string | undefined;
@@ -942,13 +2110,495 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
942
2110
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
943
2111
  batchSize?: number | undefined;
944
2112
  before: number;
945
- kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2113
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
946
2114
  siteId: string;
947
2115
  }, Promise<{
2116
+ before: number;
948
2117
  deleted: number;
949
2118
  hasMore: boolean;
950
2119
  }>>;
951
2120
  };
2121
+ /** Exposes only the reactive read surface used by a federated Rastro dashboard. */
2122
+ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, options: FederatedAnalyticsAuthorizerOptions): {
2123
+ manifest: import("convex/server").RegisteredQuery<"public", {}, {
2124
+ protocol: "amage-rastro-analytics";
2125
+ protocolVersion: 1;
2126
+ moduleName: "rastroFederation";
2127
+ functions: {
2128
+ manifest: "manifest";
2129
+ connectionStatus: "connectionStatus";
2130
+ listSites: "listSites";
2131
+ overview: "overview";
2132
+ liveVisitors: "liveVisitors";
2133
+ listSessions: "listSessions";
2134
+ sessionJourney: "sessionJourney";
2135
+ listConversions: "listConversions";
2136
+ visitorJourney: "visitorJourney";
2137
+ goalsReport: "goalsReport";
2138
+ funnelsReport: "funnelsReport";
2139
+ affiliatesReport: "affiliatesReport";
2140
+ dataCoverage: "dataCoverage";
2141
+ };
2142
+ capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney")[];
2143
+ limits: {
2144
+ maxSitesPerRequest: 10;
2145
+ maxSitesPerConnection: 10;
2146
+ maxReportRangeDays: 366;
2147
+ maxLiveVisitors: 500;
2148
+ maxJourneyEvents: 500;
2149
+ };
2150
+ }>;
2151
+ connectionStatus: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedAnalyticsConnectionStatus>>;
2152
+ listSites: import("convex/server").RegisteredQuery<"public", {}, Promise<FederatedSiteSummary[]>>;
2153
+ overview: import("convex/server").RegisteredQuery<"public", {
2154
+ from: number;
2155
+ interval?: "day" | "hour" | undefined;
2156
+ siteIds: string[];
2157
+ to: number;
2158
+ }, Promise<{
2159
+ currency: string;
2160
+ from: number;
2161
+ interval: "hour" | "day";
2162
+ metadata: {
2163
+ breakdowns: {
2164
+ topBrowsers: "eventVolume";
2165
+ topCampaigns: "eventVolume";
2166
+ topCountries: "eventVolume";
2167
+ topDevices: "eventVolume";
2168
+ topEvents: "eventVolume";
2169
+ topGoals: "goalCompletionVolume";
2170
+ topPages: "eventVolume";
2171
+ topSources: "eventVolume";
2172
+ };
2173
+ coverage: {
2174
+ availableFrom: number | null;
2175
+ availableThrough: number | null;
2176
+ generation: number | null;
2177
+ retainedBefore: number | null;
2178
+ state: "complete" | "partial" | "retained" | "unavailable";
2179
+ };
2180
+ features: {
2181
+ botDetection: "userAgent";
2182
+ errorInsights: "unsupported";
2183
+ outboundLinks: "eventVolume";
2184
+ sessionReplay: "unsupported";
2185
+ };
2186
+ range: {
2187
+ boundary: "inclusive";
2188
+ from: number;
2189
+ timezone: "UTC";
2190
+ to: number;
2191
+ };
2192
+ visitors: {
2193
+ basis: "estimatedUnique" | "bucketOccurrences";
2194
+ exact: boolean;
2195
+ legacyIncomplete: boolean;
2196
+ precision: number | null;
2197
+ sketchVersion: number | null;
2198
+ };
2199
+ };
2200
+ timeSeries: Array<{
2201
+ clicks: number;
2202
+ conversions: number;
2203
+ customEvents: number;
2204
+ events: number;
2205
+ outboundClicks: number;
2206
+ pageviews: number;
2207
+ revenueCents: number;
2208
+ sessions: number;
2209
+ timestamp: number;
2210
+ visitors: number;
2211
+ }>;
2212
+ to: number;
2213
+ topBrowsers: Array<{
2214
+ count: number;
2215
+ revenueCents: number;
2216
+ value: string;
2217
+ }>;
2218
+ topCampaigns: Array<{
2219
+ count: number;
2220
+ revenueCents: number;
2221
+ value: string;
2222
+ }>;
2223
+ topCountries: Array<{
2224
+ count: number;
2225
+ revenueCents: number;
2226
+ value: string;
2227
+ }>;
2228
+ topDevices: Array<{
2229
+ count: number;
2230
+ revenueCents: number;
2231
+ value: string;
2232
+ }>;
2233
+ topEvents: Array<{
2234
+ count: number;
2235
+ revenueCents: number;
2236
+ value: string;
2237
+ }>;
2238
+ topGoals: Array<{
2239
+ count: number;
2240
+ revenueCents: number;
2241
+ value: string;
2242
+ }>;
2243
+ topPages: Array<{
2244
+ count: number;
2245
+ revenueCents: number;
2246
+ value: string;
2247
+ }>;
2248
+ topSources: Array<{
2249
+ count: number;
2250
+ revenueCents: number;
2251
+ value: string;
2252
+ }>;
2253
+ totals: {
2254
+ clicks: number;
2255
+ conversions: number;
2256
+ customEvents: number;
2257
+ events: number;
2258
+ outboundClicks: number;
2259
+ pageviews: number;
2260
+ revenueCents: number;
2261
+ sessions: number;
2262
+ visitors: number;
2263
+ };
2264
+ }>>;
2265
+ liveVisitors: import("convex/server").RegisteredQuery<"public", {
2266
+ limit?: number | undefined;
2267
+ now: number;
2268
+ siteIds: string[];
2269
+ }, Promise<{
2270
+ _creationTime: number;
2271
+ _id: string;
2272
+ browser: string;
2273
+ city?: string;
2274
+ country?: string;
2275
+ device: string;
2276
+ eventCount: number;
2277
+ expiresAt: number;
2278
+ lastSeenAt: number;
2279
+ latitude?: number;
2280
+ longitude?: number;
2281
+ os: string;
2282
+ pageviewCount: number;
2283
+ path: string;
2284
+ sessionId: string;
2285
+ siteId: string;
2286
+ source: string;
2287
+ startedAt: number;
2288
+ visitorId: string;
2289
+ }[]>>;
2290
+ listSessions: import("convex/server").RegisteredQuery<"public", {
2291
+ from: number;
2292
+ paginationOpts: {
2293
+ id?: number;
2294
+ endCursor?: string | null;
2295
+ maximumRowsRead?: number;
2296
+ maximumBytesRead?: number;
2297
+ numItems: number;
2298
+ cursor: string | null;
2299
+ };
2300
+ siteId: string;
2301
+ to: number;
2302
+ }, Promise<{
2303
+ continueCursor: string;
2304
+ isDone: boolean;
2305
+ page: Array<{
2306
+ _creationTime: number;
2307
+ _id: string;
2308
+ affiliateAttributedAt?: number;
2309
+ affiliateExpiresAt?: number;
2310
+ affiliateId?: string;
2311
+ affiliateSlug?: string;
2312
+ browser: string;
2313
+ city?: string;
2314
+ conversionCount: number;
2315
+ country?: string;
2316
+ currency?: string;
2317
+ device: string;
2318
+ durationMs: number;
2319
+ entryPath: string;
2320
+ eventCount: number;
2321
+ exitPath: string;
2322
+ lastSeenAt: number;
2323
+ latitude?: number;
2324
+ longitude?: number;
2325
+ os: string;
2326
+ pageviewCount: number;
2327
+ referrer?: string;
2328
+ revenueCents: number;
2329
+ sessionId: string;
2330
+ siteId: string;
2331
+ source: string;
2332
+ startedAt: number;
2333
+ utmCampaign?: string;
2334
+ utmMedium?: string;
2335
+ utmSource?: string;
2336
+ visitorId: string;
2337
+ visitorKey?: string;
2338
+ }>;
2339
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2340
+ splitCursor?: string | null;
2341
+ }>>;
2342
+ sessionJourney: import("convex/server").RegisteredQuery<"public", {
2343
+ from: number;
2344
+ paginationOpts: {
2345
+ id?: number;
2346
+ endCursor?: string | null;
2347
+ maximumRowsRead?: number;
2348
+ maximumBytesRead?: number;
2349
+ numItems: number;
2350
+ cursor: string | null;
2351
+ };
2352
+ sessionId: string;
2353
+ siteId: string;
2354
+ to: number;
2355
+ }, Promise<{
2356
+ continueCursor: string;
2357
+ isDone: boolean;
2358
+ page: Array<{
2359
+ _creationTime: number;
2360
+ _id: string;
2361
+ affiliateSlug?: string;
2362
+ browser: string;
2363
+ city?: string;
2364
+ country?: string;
2365
+ currency?: string;
2366
+ device: string;
2367
+ eventId: string;
2368
+ href?: string;
2369
+ latitude?: number;
2370
+ longitude?: number;
2371
+ name?: string;
2372
+ os: string;
2373
+ path: string;
2374
+ properties?: Record<string, string | number | boolean | null>;
2375
+ referrer?: string;
2376
+ revenueCents?: number;
2377
+ sequence: number;
2378
+ sessionId: string;
2379
+ siteId: string;
2380
+ target?: string;
2381
+ timestamp: number;
2382
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2383
+ visitorId: string;
2384
+ }>;
2385
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2386
+ splitCursor?: string | null;
2387
+ }>>;
2388
+ listConversions: import("convex/server").RegisteredQuery<"public", {
2389
+ from: number;
2390
+ paginationOpts: {
2391
+ id?: number;
2392
+ endCursor?: string | null;
2393
+ maximumRowsRead?: number;
2394
+ maximumBytesRead?: number;
2395
+ numItems: number;
2396
+ cursor: string | null;
2397
+ };
2398
+ siteId: string;
2399
+ to: number;
2400
+ }, Promise<{
2401
+ continueCursor: string;
2402
+ isDone: boolean;
2403
+ page: Array<{
2404
+ _creationTime: number;
2405
+ _id: string;
2406
+ affiliateAttributedAt?: number;
2407
+ affiliateExpiresAt?: number;
2408
+ affiliateId?: string;
2409
+ affiliateSlug?: string;
2410
+ commissionCents: number;
2411
+ currency: string;
2412
+ eventId: string;
2413
+ goalKey?: string;
2414
+ path: string;
2415
+ revenueCents: number;
2416
+ sessionId: string;
2417
+ siteId: string;
2418
+ source: "tracker" | "trusted";
2419
+ timestamp: number;
2420
+ visitorId: string;
2421
+ }>;
2422
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
2423
+ splitCursor?: string | null;
2424
+ }>>;
2425
+ visitorJourney: import("convex/server").RegisteredQuery<"public", {
2426
+ from: number;
2427
+ limit?: number | undefined;
2428
+ siteIds: string[];
2429
+ to: number;
2430
+ visitorId: string;
2431
+ }, Promise<{
2432
+ _creationTime: number;
2433
+ _id: string;
2434
+ affiliateSlug?: string;
2435
+ browser: string;
2436
+ city?: string;
2437
+ country?: string;
2438
+ currency?: string;
2439
+ device: string;
2440
+ eventId: string;
2441
+ href?: string;
2442
+ latitude?: number;
2443
+ longitude?: number;
2444
+ name?: string;
2445
+ os: string;
2446
+ path: string;
2447
+ properties?: Record<string, string | number | boolean | null>;
2448
+ referrer?: string;
2449
+ revenueCents?: number;
2450
+ sequence: number;
2451
+ sessionId: string;
2452
+ siteId: string;
2453
+ target?: string;
2454
+ timestamp: number;
2455
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2456
+ visitorId: string;
2457
+ }[]>>;
2458
+ goalsReport: import("convex/server").RegisteredQuery<"public", {
2459
+ from: number;
2460
+ siteId: string;
2461
+ to: number;
2462
+ }, Promise<{
2463
+ goals: Array<{
2464
+ _creationTime: number;
2465
+ _id: string;
2466
+ active: boolean;
2467
+ completions: number;
2468
+ createdAt: number;
2469
+ key: string;
2470
+ matchType: "pageview" | "custom";
2471
+ matchValue: string;
2472
+ name: string;
2473
+ siteId: string;
2474
+ updatedAt: number;
2475
+ valueCents: number;
2476
+ }>;
2477
+ metadata: {
2478
+ basis: "dailyRollup" | "boundedLegacy";
2479
+ coverage: {
2480
+ availableFrom: number | null;
2481
+ availableThrough: number | null;
2482
+ generation: number | null;
2483
+ retainedBefore: number | null;
2484
+ state: "complete" | "partial" | "retained" | "unavailable";
2485
+ };
2486
+ range: {
2487
+ boundary: "inclusive";
2488
+ from: number;
2489
+ timezone: "UTC";
2490
+ to: number;
2491
+ };
2492
+ };
2493
+ truncated: boolean;
2494
+ }>>;
2495
+ funnelsReport: import("convex/server").RegisteredQuery<"public", {
2496
+ from: number;
2497
+ siteId: string;
2498
+ to: number;
2499
+ }, Promise<{
2500
+ _creationTime: number;
2501
+ _id: string;
2502
+ active: boolean;
2503
+ conversionWindowMs: number;
2504
+ createdAt: number;
2505
+ key: string;
2506
+ metadata: {
2507
+ basis: "dailyRollup" | "boundedLegacy";
2508
+ coverage: {
2509
+ availableFrom: number | null;
2510
+ availableThrough: number | null;
2511
+ generation: number | null;
2512
+ retainedBefore: number | null;
2513
+ state: "complete" | "partial" | "retained" | "unavailable";
2514
+ };
2515
+ range: {
2516
+ boundary: "inclusive";
2517
+ from: number;
2518
+ timezone: "UTC";
2519
+ to: number;
2520
+ };
2521
+ };
2522
+ name: string;
2523
+ siteId: string;
2524
+ steps: Array<{
2525
+ name: string;
2526
+ type: "pageview" | "custom";
2527
+ value: string;
2528
+ }>;
2529
+ stepsReport: Array<{
2530
+ completions: number;
2531
+ entrants: number;
2532
+ name: string;
2533
+ step: number;
2534
+ }>;
2535
+ truncated: boolean;
2536
+ updatedAt: number;
2537
+ }[]>>;
2538
+ affiliatesReport: import("convex/server").RegisteredQuery<"public", {
2539
+ from: number;
2540
+ siteId: string;
2541
+ to: number;
2542
+ }, Promise<{
2543
+ affiliates: Array<{
2544
+ _creationTime: number;
2545
+ _id: string;
2546
+ active: boolean;
2547
+ attributionWindowDays: number;
2548
+ commissionBps: number;
2549
+ commissionCents: number;
2550
+ conversions: number;
2551
+ createdAt: number;
2552
+ name: string;
2553
+ revenueCents: number;
2554
+ siteId: string;
2555
+ slug: string;
2556
+ uniqueVisitors: number;
2557
+ updatedAt: number;
2558
+ visits: number;
2559
+ }>;
2560
+ metadata: {
2561
+ basis: "dailyRollup" | "boundedLegacy";
2562
+ coverage: {
2563
+ availableFrom: number | null;
2564
+ availableThrough: number | null;
2565
+ generation: number | null;
2566
+ retainedBefore: number | null;
2567
+ state: "complete" | "partial" | "retained" | "unavailable";
2568
+ };
2569
+ range: {
2570
+ boundary: "inclusive";
2571
+ from: number;
2572
+ timezone: "UTC";
2573
+ to: number;
2574
+ };
2575
+ uniqueVisitors: {
2576
+ basis: "estimatedUnique" | "exactLegacy";
2577
+ exact: boolean;
2578
+ };
2579
+ };
2580
+ truncated: boolean;
2581
+ }>>;
2582
+ dataCoverage: import("convex/server").RegisteredQuery<"public", {
2583
+ from: number;
2584
+ siteId: string;
2585
+ to: number;
2586
+ }, Promise<{
2587
+ datasets: Array<{
2588
+ coverage: {
2589
+ availableFrom: number | null;
2590
+ availableThrough: number | null;
2591
+ generation: number | null;
2592
+ retainedBefore: number | null;
2593
+ state: "complete" | "partial" | "retained" | "unavailable";
2594
+ };
2595
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2596
+ }>;
2597
+ from: number;
2598
+ siteId: string;
2599
+ to: number;
2600
+ }>>;
2601
+ };
952
2602
  export declare function componentHttpPaths(prefix?: string): {
953
2603
  readonly events: `${string}/events`;
954
2604
  readonly tracker: `${string}/tracker.js`;