@clarvivo/mcp 0.1.1 → 0.3.0

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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # `clarvivo-mcp`
1
+ # `@clarvivo/mcp`
2
2
 
3
- Install Clarvivo analytics without leaving your coding agent. The server detects the app framework, reuses or creates the right Clarvivo project, and returns the exact file and code edit. It can then verify real traffic and return compact analytics summaries.
3
+ Install Clarvivo analytics without leaving your coding agent. The server detects the app framework, reuses or creates the right Clarvivo project, and returns the exact file and code edit. It can then verify real traffic, connect payment revenue, and configure events, funnels, and alerts.
4
4
 
5
5
  ## The 60-second flow
6
6
 
@@ -20,10 +20,50 @@ The tracker observes `history.pushState`, `history.replaceState`, and `popstate`
20
20
  | `get_install_snippet` | Get framework-specific instructions for an existing API key or project. |
21
21
  | `verify_installation` | Prove the deployed snippet works from a proof-of-life event count, without reading analytics. |
22
22
  | `list_projects` | List accessible projects and their public tracking API keys. |
23
- | `get_stats` | Return a small summary for 1–90 days, capped to the top five pages and referrers. |
23
+ | `get_stats` | Return a small traffic and top-line revenue summary for 1–90 days, capped to the top five pages and referrers. |
24
+ | `get_traffic_sources` | Aggregate up to 90 days into channel shares, the top ten referrers, and the top ten UTM source rows. |
25
+ | `get_pages` | Return the top ten pages with visitors, entries, exits, bounce rate, and average time. |
26
+ | `get_audience` | Summarise devices, browsers, operating systems, countries, visitor segments, screens, and languages. |
27
+ | `export_data` | Write CSV/JSON locally, or create a self-contained printable HTML report for PDF; return metadata only. |
28
+ | `connect_revenue` | Detect Stripe, Polar, Razorpay, Paddle, Lemon Squeezy, or Dodo; connect its webhook; and return the attribution edit. |
29
+ | `verify_revenue` | Summarise webhook proof-of-life and attribution coverage without dumping payment data. |
30
+ | `add_event` | Register an event and propose the `window.clarvivo.trackEvent(...)` edit and handler placement. |
31
+ | `create_funnel` | Create an ordered funnel or reuse one with the same name, then flag unmatched steps. |
32
+ | `create_alert` | Create a traffic/conversion alert or reuse an alert of the same type. |
33
+ | `list_funnels` | List funnels and their ordered steps. |
24
34
 
25
35
  `setup_analytics` supports Next.js App Router, Next.js Pages Router, Vite (React/Vue/Svelte), Create React App, Astro, SvelteKit, Nuxt, Remix / React Router v7, Gatsby, Docusaurus, and static HTML.
26
36
 
37
+ ## Read your data
38
+
39
+ Ask for a quick overview with `get_stats`, then use `get_traffic_sources`, `get_pages`, or `get_audience` when you need a focused breakdown. These tools aggregate the full reporting window inside the MCP server, cap every returned list, and never place raw daily analytics rows into the model context. Their default window is 30 days and accepts 1–90 days.
40
+
41
+ Analytics reads require the `analytics:read` token scope. If the account is still awaiting its first payment or its access has lapsed, the tools stop at the same billing wall as the dashboard and link to the billing page.
42
+
43
+ ## Export
44
+
45
+ `export_data` writes the result to disk instead of returning file contents. CSV and JSON use Clarvivo's paid export routes; `pdf` creates a slim, self-contained `.html` report with headline metrics, channels, top pages, and sources. Open that file in a browser and use **Print → Save as PDF**, matching the dashboard workflow.
46
+
47
+ The default filename is `clarvivo-export-<project>-<date>.<ext>` in the current working directory. A custom `path` must remain inside that directory and cannot contain `..`. Existing files are protected unless `overwrite: true` is passed. Data export remains plan-gated and uses the existing `analytics:read` scope.
48
+
49
+ ## Connect payments
50
+
51
+ 1. Ask the agent: **“Connect Clarvivo revenue for this project.”**
52
+ 2. `connect_revenue` detects the payment SDK from `package.json`, connects the provider, and returns the webhook URL plus the exact events to enable.
53
+ 3. Copy the provider signing secret from its webhook settings into Clarvivo at **Dashboard → Settings → Integrations**. Do not paste the secret into the agent or tool call.
54
+ 4. Apply the returned client-to-server attribution edit. It reads `clv_vid` from browser local storage and puts it in the provider's supported metadata, custom data, or notes field. This is the step that makes revenue-by-channel work.
55
+ 5. Complete a test payment, wait for delivery, then ask: **“Verify Clarvivo revenue.”**
56
+
57
+ The checkout snippet adapts to a Next.js route handler, Express handler, or serverless function. If no supported SDK is found, the tool returns a server-only signed `POST /api/ingest/:apiKey/revenue` example using `CLARVIVO_INGEST_SECRET`; that secret must never enter browser code.
58
+
59
+ ## Track events & funnels
60
+
61
+ 1. Ask: **“Track successful signups in Clarvivo.”** `add_event` registers the event and proposes a `window.clarvivo.trackEvent(...)` call for the success handler. The tool reports the edit; your coding agent applies it.
62
+ 2. Ask: **“Create a Signup funnel with Landing, Pricing, and Success.”** `create_funnel` orders the steps, reuses an existing same-name funnel on retries, and points out steps that do not yet match a tracked page.
63
+ 3. Ask: **“Alert me when conversion drops by 20%.”** `create_alert` reuses an existing alert of that type instead of creating duplicates.
64
+
65
+ The browser SDK global is `window.clarvivo`. It exposes `trackEvent(name, properties)`, `trackConversion(value, currency)`, and `trackPurchase(...)`.
66
+
27
67
  ## Configuration
28
68
 
29
69
  Replace `clv_live_REPLACE_ME` below. Tokens are secrets; keep personal config files out of source control. The tracking API key returned by tools is intentionally public because it ships in page source.
@@ -199,6 +239,8 @@ Node.js 20 or newer is required.
199
239
 
200
240
  Every tool checks for `CLARVIVO_API_TOKEN` before doing work. If it is missing, the tool returns the token URL and a copy-pasteable environment variable name. The bearer token is never included in tool output or logs.
201
241
 
242
+ Tools also report a missing token scope by name and link directly to the API-token settings page. Payment signing secrets are dashboard-only: `connect_revenue` has no secret input and sends only `{ provider, connected: true }` to Clarvivo.
243
+
202
244
  Clarvivo has no free tier. If project creation returns `PROJECT_LIMIT_REACHED`, HTTP 402, or HTTP 403, the tool stops immediately and links to [billing](https://app.clarvivo.com/dashboard/billing). It does not retry or claim the project was created.
203
245
 
204
246
  ## Development
@@ -217,13 +259,13 @@ Set `CLARVIVO_BASE_URL=http://127.0.0.1:5000` when using a local Clarvivo server
217
259
  No submission happens automatically. Complete these after the package and public repository are ready:
218
260
 
219
261
  - [ ] **npm:** publish `clarvivo-mcp` publicly, confirm the `bin` is executable, and test a clean `npx -y @clarvivo/mcp` MCP initialize handshake. Use npm provenance/2FA and inspect `npm pack --dry-run` first.
220
- - [ ] **Official MCP Registry:** choose and add a verified `mcpName` to `package.json` (a GitHub-authenticated `io.github.<owner>/...` name or DNS-authenticated Clarvivo namespace), publish the matching npm version first, create `server.json` with stdio transport and required `CLARVIVO_API_TOKEN`, then run `mcp-publisher login`, `mcp-publisher validate`, and `mcp-publisher publish`. The registry stores metadata, not the package. Follow the [official registry quickstart](https://modelcontextprotocol.io/registry/quickstart).
262
+ - [ ] **Official MCP Registry:** verify the `io.github.cracked-collective/clarvivo` namespace, publish the matching npm version first, then run `mcp-publisher login`, `mcp-publisher validate`, and `mcp-publisher publish` against the included `server.json`. The registry stores metadata, not the package. Follow the [official registry quickstart](https://modelcontextprotocol.io/registry/quickstart).
221
263
  - [ ] **Smithery:** authenticate with the Smithery CLI and publish a local MCP bundle (`.mcpb`) under the Clarvivo namespace, or publish a hosted URL if an HTTP transport is added later: `smithery mcp publish <bundle.mcpb> -n clarvivo/clarvivo`. Smithery’s current publisher accepts hosted URLs or MCP bundles; see [Smithery CLI publishing](https://www.npmjs.com/package/@smithery/cli).
222
264
  - [ ] **mcp.so:** use the [server submission form](https://mcp.so/submit?type=server). It currently requires a public repository URL and name; the paid path is optional and advertises immediate publishing.
223
- - [ ] **PulseMCP:** use the site’s **Submit** flow and provide the public repository, npm install command, five-tool inventory, auth variable, license, and maintainer contact. Re-check the form at submission time because PulseMCP does not publish a stable submission schema.
224
- - [ ] **Glama:** click **Add Server** in the [Glama registry](https://glama.ai/mcp/servers), submit the public GitHub repository, and add `glama.json` if organization ownership/metadata verification requests it. Confirm Glama can inspect all five tools.
265
+ - [ ] **PulseMCP:** use the site’s **Submit** flow and provide the public repository, npm install command, fifteen-tool inventory, auth variable, license, and maintainer contact. Re-check the form at submission time because PulseMCP does not publish a stable submission schema.
266
+ - [ ] **Glama:** click **Add Server** in the [Glama registry](https://glama.ai/mcp/servers), submit the public GitHub repository, and add `glama.json` if organization ownership/metadata verification requests it. Confirm Glama can inspect all fifteen tools.
225
267
  - [ ] **Cursor Marketplace:** package the MCP config as an Agent Plugin or Cursor Plugin with a valid `plugin.json` / `.cursor-plugin/plugin.json`, public Git repository, README, and optional committed logo; declare the token variable in the manifest schema, then submit the repository at [cursor.com/marketplace/publish](https://cursor.com/marketplace/publish). Use the [official submission checklist](https://cursor.com/docs/reference/plugins).
226
268
  - [ ] **awesome-mcp-servers:** first ensure the Glama listing exists, then fork [punkpeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers), add one alphabetized line in the appropriate category with repository link and concise description, and open a PR following its [contribution guide](https://github.com/punkpeye/awesome-mcp-servers/blob/main/CONTRIBUTING.md).
227
269
  - [ ] **Additional discovery:** submit the same canonical metadata to `mcpservers.org`, `MCP Central`, and `mcp-marketplace.io`; keep every listing pointed at the npm package and one canonical repository so versions and security notices do not drift.
228
270
 
229
- For every listing, use the same name, description, repository, license, token variable, Node requirement, five-tool inventory, and install snippets from this README.
271
+ For every listing, use the same name, description, repository, license, token variable, Node requirement, fifteen-tool inventory, and install snippets from this README.
@@ -0,0 +1,67 @@
1
+ import type { AnalyticsRow } from "./api.js";
2
+ export declare function aggregateTrafficSources(rows: AnalyticsRow[]): {
3
+ channels: {
4
+ sharePercent?: number | undefined;
5
+ visitors: number;
6
+ channel: string;
7
+ }[];
8
+ referrers: {
9
+ referrer: string;
10
+ visitors: number;
11
+ }[];
12
+ sources: {
13
+ revenue?: number | undefined;
14
+ conversions?: number | undefined;
15
+ source: string;
16
+ medium: string;
17
+ campaign: string;
18
+ visitors: number;
19
+ }[];
20
+ };
21
+ export declare function aggregatePages(rows: AnalyticsRow[]): {
22
+ avgTimeSeconds?: number | undefined;
23
+ bouncePercent?: number | undefined;
24
+ path: string;
25
+ title: string;
26
+ views: number;
27
+ uniqueVisitors: number;
28
+ entries: number;
29
+ exits: number;
30
+ }[];
31
+ export declare function aggregateAudience(rows: AnalyticsRow[]): {
32
+ devices: {
33
+ sharePercent?: number | undefined;
34
+ name: string;
35
+ visitors: number;
36
+ }[];
37
+ browsers: {
38
+ sharePercent?: number | undefined;
39
+ name: string;
40
+ visitors: number;
41
+ }[];
42
+ operatingSystems: {
43
+ sharePercent?: number | undefined;
44
+ name: string;
45
+ visitors: number;
46
+ }[];
47
+ countries: {
48
+ country: string;
49
+ visitors: number;
50
+ }[];
51
+ visitorSegments: {
52
+ sharePercent?: number | undefined;
53
+ name: string;
54
+ visitors: number;
55
+ }[];
56
+ screenResolutions: {
57
+ sharePercent?: number | undefined;
58
+ name: string;
59
+ visitors: number;
60
+ }[];
61
+ languages: {
62
+ sharePercent?: number | undefined;
63
+ name: string;
64
+ visitors: number;
65
+ }[];
66
+ };
67
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAwC7C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE;;;;;;;;;;;;;gBAIhD,MAAM;gBACN,MAAM;kBACJ,MAAM;kBACN,MAAM;;EAkDnB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;;;UAEzC,MAAM;WACL,MAAM;WACN,MAAM;oBACG,MAAM;aACb,MAAM;WACR,MAAM;IA+BhB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCrD"}
@@ -0,0 +1,150 @@
1
+ function value(input) {
2
+ const parsed = typeof input === "number" ? input : Number(input ?? 0);
3
+ return Number.isFinite(parsed) ? parsed : 0;
4
+ }
5
+ function items(input) {
6
+ return Array.isArray(input)
7
+ ? input.filter((item) => Boolean(item) && typeof item === "object")
8
+ : [];
9
+ }
10
+ function mergeObject(rows, key) {
11
+ const result = new Map();
12
+ for (const row of rows) {
13
+ const input = row[key];
14
+ if (!input || typeof input !== "object" || Array.isArray(input))
15
+ continue;
16
+ for (const [name, count] of Object.entries(input)) {
17
+ result.set(name, (result.get(name) ?? 0) + value(count));
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ function rankedShares(totals, limit = 10) {
23
+ const total = [...totals.values()].reduce((sum, count) => sum + count, 0);
24
+ return [...totals.entries()]
25
+ .filter(([, count]) => count > 0)
26
+ .map(([name, visitors]) => ({
27
+ name,
28
+ visitors,
29
+ ...(total > 0 ? { sharePercent: Math.round((visitors / total) * 100) } : {}),
30
+ }))
31
+ .sort((a, b) => b.visitors - a.visitors || a.name.localeCompare(b.name))
32
+ .slice(0, limit);
33
+ }
34
+ export function aggregateTrafficSources(rows) {
35
+ const channels = rankedShares(mergeObject(rows, "trafficChannels"));
36
+ const referrers = new Map();
37
+ const sources = new Map();
38
+ for (const row of rows) {
39
+ for (const item of items(row.topReferrers)) {
40
+ const name = [item.source, item.referrer].find((candidate) => typeof candidate === "string");
41
+ if (!name)
42
+ continue;
43
+ referrers.set(name, (referrers.get(name) ?? 0) + value(item.visitors ?? item.visits ?? item.count));
44
+ }
45
+ for (const item of items(row.sourceBreakdown)) {
46
+ const source = typeof item.source === "string" ? item.source : "(direct)";
47
+ const medium = typeof item.medium === "string" ? item.medium : "(none)";
48
+ const campaign = typeof item.campaign === "string" ? item.campaign : "(none)";
49
+ const key = JSON.stringify([source, medium, campaign]);
50
+ const aggregate = sources.get(key) ?? {
51
+ source, medium, campaign, visitors: 0, conversions: 0, revenue: 0,
52
+ hasConversions: false, hasRevenue: false,
53
+ };
54
+ aggregate.visitors += value(item.visitors);
55
+ if (item.conversions !== undefined && item.conversions !== null) {
56
+ aggregate.conversions += value(item.conversions);
57
+ aggregate.hasConversions = true;
58
+ }
59
+ if (item.revenue !== undefined && item.revenue !== null) {
60
+ aggregate.revenue += value(item.revenue);
61
+ aggregate.hasRevenue = true;
62
+ }
63
+ sources.set(key, aggregate);
64
+ }
65
+ }
66
+ return {
67
+ channels: channels.map(({ name: channel, ...rest }) => ({ channel, ...rest })),
68
+ referrers: [...referrers.entries()]
69
+ .map(([referrer, visitors]) => ({ referrer, visitors }))
70
+ .sort((a, b) => b.visitors - a.visitors || a.referrer.localeCompare(b.referrer))
71
+ .slice(0, 10),
72
+ sources: [...sources.values()]
73
+ .sort((a, b) => b.visitors - a.visitors || a.source.localeCompare(b.source))
74
+ .slice(0, 10)
75
+ .map(({ hasConversions, hasRevenue, conversions, revenue, ...source }) => ({
76
+ ...source,
77
+ ...(hasConversions ? { conversions } : {}),
78
+ ...(hasRevenue ? { revenue } : {}),
79
+ })),
80
+ };
81
+ }
82
+ export function aggregatePages(rows) {
83
+ const pages = new Map();
84
+ for (const row of rows) {
85
+ for (const item of items(row.pageDetails)) {
86
+ const pagePath = typeof item.path === "string" ? item.path : typeof item.page === "string" ? item.page : undefined;
87
+ if (!pagePath)
88
+ continue;
89
+ const page = pages.get(pagePath) ?? {
90
+ path: pagePath,
91
+ title: typeof item.title === "string" ? item.title : pagePath,
92
+ views: 0, uniqueVisitors: 0, entries: 0, exits: 0, bounceCount: 0, totalDuration: 0,
93
+ };
94
+ if (typeof item.title === "string" && item.title !== pagePath)
95
+ page.title = item.title;
96
+ page.views += value(item.views ?? item.pageviews);
97
+ page.uniqueVisitors += value(item.uniqueVisitors);
98
+ page.entries += value(item.entries);
99
+ page.exits += value(item.exits);
100
+ page.bounceCount += value(item.bounceCount);
101
+ page.totalDuration += value(item.totalDuration);
102
+ pages.set(pagePath, page);
103
+ }
104
+ }
105
+ return [...pages.values()]
106
+ .sort((a, b) => b.views - a.views || a.path.localeCompare(b.path))
107
+ .slice(0, 10)
108
+ .map(({ bounceCount, totalDuration, ...page }) => ({
109
+ ...page,
110
+ ...(page.entries > 0 ? { bouncePercent: Math.round((bounceCount / page.entries) * 100) } : {}),
111
+ ...(page.views > 0 ? { avgTimeSeconds: Math.round((totalDuration / page.views) * 10) / 10 } : {}),
112
+ }));
113
+ }
114
+ export function aggregateAudience(rows) {
115
+ const countries = new Map();
116
+ for (const row of rows) {
117
+ for (const location of items(row.visitorLocations)) {
118
+ const country = typeof location.country === "string" ? location.country : "Unknown";
119
+ countries.set(country, (countries.get(country) ?? 0) + value(location.visits ?? location.visitors));
120
+ }
121
+ }
122
+ const technology = (key) => {
123
+ const totals = new Map();
124
+ for (const row of rows) {
125
+ const details = row.technologyDetails;
126
+ if (!details || typeof details !== "object" || Array.isArray(details))
127
+ continue;
128
+ const group = details[key];
129
+ if (!group || typeof group !== "object" || Array.isArray(group))
130
+ continue;
131
+ for (const [name, count] of Object.entries(group)) {
132
+ totals.set(name, (totals.get(name) ?? 0) + value(count));
133
+ }
134
+ }
135
+ return rankedShares(totals, 5);
136
+ };
137
+ return {
138
+ devices: rankedShares(mergeObject(rows, "deviceBreakdown")),
139
+ browsers: rankedShares(mergeObject(rows, "browserBreakdown")),
140
+ operatingSystems: rankedShares(mergeObject(rows, "osBreakdown")),
141
+ countries: [...countries.entries()]
142
+ .map(([country, visitors]) => ({ country, visitors }))
143
+ .sort((a, b) => b.visitors - a.visitors || a.country.localeCompare(b.country))
144
+ .slice(0, 10),
145
+ visitorSegments: rankedShares(mergeObject(rows, "visitorSegments")),
146
+ screenResolutions: technology("screenResolutions"),
147
+ languages: technology("languages"),
148
+ };
149
+ }
150
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAIA,SAAS,KAAK,CAAC,KAAc;IAC3B,MAAM,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAgB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;QACjF,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,WAAW,CAAC,IAAoB,EAAE,GAAW;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAa,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,MAA2B,EAAE,KAAK,GAAG,EAAE;IAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI;QACJ,QAAQ;QACR,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACvE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAoB;IAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EASnB,CAAC;IAEL,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAuB,CAAC;YACnH,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;YAC1E,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YACxE,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;gBACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;gBACjE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK;aACzC,CAAC;YACF,SAAS,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAChE,SAAS,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACjD,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC;YAClC,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBACxD,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC;YAC9B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9E,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;aACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;aAC/E,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;aAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;aAC3E,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,GAAG,MAAM;YACT,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnC,CAAC,CAAC;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,KAAK,GAAG,IAAI,GAAG,EASjB,CAAC;IACL,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACnH,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI;gBAClC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ;gBAC7D,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;aACpF,CAAC;YACF,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACvF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAChD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;SACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,GAAG,IAAI;QACP,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClG,CAAC,CAAC,CAAC;AACR,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAoB;IACpD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACpF,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,GAAsC,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;YACtC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChF,MAAM,KAAK,GAAI,OAAgB,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAa,CAAC,EAAE,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QACD,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,OAAO;QACL,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAC3D,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAC7D,gBAAgB,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAChE,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;aACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aAC7E,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACf,eAAe,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnE,iBAAiB,EAAE,UAAU,CAAC,mBAAmB,CAAC;QAClD,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC;KACnC,CAAC;AACJ,CAAC"}
package/dist/api.d.ts CHANGED
@@ -17,10 +17,54 @@ export interface AnalyticsRow {
17
17
  trafficChannels?: unknown;
18
18
  [key: string]: unknown;
19
19
  }
20
+ export type ExportFormat = "csv" | "json";
21
+ export interface ExportDownload {
22
+ data: string;
23
+ contentType: string | null;
24
+ }
20
25
  export interface RealtimeSnapshot {
21
26
  count?: number;
22
27
  [key: string]: unknown;
23
28
  }
29
+ export interface FunnelStep {
30
+ name: string;
31
+ url: string;
32
+ order: number;
33
+ [key: string]: unknown;
34
+ }
35
+ export interface ClarvivoFunnel {
36
+ id: number | string;
37
+ name: string;
38
+ steps: FunnelStep[];
39
+ [key: string]: unknown;
40
+ }
41
+ export interface ClarvivoAlert {
42
+ id: number | string;
43
+ type: string;
44
+ threshold: number | string | null;
45
+ isActive?: boolean;
46
+ [key: string]: unknown;
47
+ }
48
+ export interface RevenueSummary {
49
+ totalRevenue?: number | string;
50
+ eventCount?: number | string;
51
+ averageAmount?: number | string;
52
+ [key: string]: unknown;
53
+ }
54
+ export interface RevenueConnection {
55
+ provider: string;
56
+ connected: true;
57
+ webhookUrl: string;
58
+ secretConfigured: boolean;
59
+ }
60
+ export interface RevenueStatus {
61
+ connected: Record<string, boolean>;
62
+ secretConfigured: Record<string, boolean>;
63
+ eventsReceived: number;
64
+ lastEventAt: string | null;
65
+ lastSource: string | null;
66
+ attributedShare: number | null;
67
+ }
24
68
  export interface InstallStatus {
25
69
  installed: boolean;
26
70
  eventsReceived: number;
@@ -36,23 +80,46 @@ export interface ClarvivoApi {
36
80
  }): Promise<ClarvivoProject>;
37
81
  getInstallStatus(projectId: number | string): Promise<InstallStatus>;
38
82
  getAnalytics(projectId: number | string, days: number): Promise<AnalyticsRow[]>;
83
+ exportData(projectId: number | string, format: ExportFormat, days: number): Promise<ExportDownload>;
39
84
  getRealtime(projectId: number | string): Promise<RealtimeSnapshot>;
85
+ getRevenue(projectId: number | string): Promise<RevenueSummary>;
86
+ connectRevenue(projectId: number | string, provider: string): Promise<RevenueConnection>;
87
+ getRevenueStatus(projectId: number | string): Promise<RevenueStatus>;
88
+ createEvent(projectId: number | string, input: {
89
+ name: string;
90
+ type: string;
91
+ url?: string;
92
+ value?: number;
93
+ }): Promise<Record<string, unknown>>;
94
+ listFunnels(projectId: number | string): Promise<ClarvivoFunnel[]>;
95
+ createFunnel(projectId: number | string, input: {
96
+ name: string;
97
+ steps: FunnelStep[];
98
+ }): Promise<ClarvivoFunnel>;
99
+ listAlerts(projectId: number | string): Promise<ClarvivoAlert[]>;
100
+ createAlert(projectId: number | string, input: {
101
+ type: string;
102
+ threshold: number;
103
+ }): Promise<ClarvivoAlert>;
40
104
  }
41
105
  export declare class ClarvivoApiError extends Error {
42
106
  readonly status: number;
43
107
  readonly code?: string | undefined;
44
- constructor(message: string, status: number, code?: string | undefined);
108
+ readonly scope?: string | undefined;
109
+ constructor(message: string, status: number, code?: string | undefined, scope?: string | undefined);
45
110
  }
46
111
  export declare const DEFAULT_BASE_URL = "https://app.clarvivo.com";
47
112
  export declare function tokenSetupMessage(baseUrl?: string): string;
48
113
  export declare function planLimitMessage(baseUrl?: string): string;
49
114
  export declare function payToReadMessage(baseUrl?: string): string;
115
+ export declare function exportPlanMessage(baseUrl?: string): string;
50
116
  export declare function requireToken(env?: NodeJS.ProcessEnv): string;
51
117
  export declare class HttpClarvivoApi implements ClarvivoApi {
52
118
  private readonly fetchImpl;
53
119
  private readonly baseUrl;
54
120
  private readonly token;
55
121
  constructor(env?: NodeJS.ProcessEnv, fetchImpl?: typeof fetch);
122
+ private response;
56
123
  private request;
57
124
  listProjects(): Promise<ClarvivoProject[]>;
58
125
  createProject(input: {
@@ -61,7 +128,27 @@ export declare class HttpClarvivoApi implements ClarvivoApi {
61
128
  }): Promise<ClarvivoProject>;
62
129
  getInstallStatus(projectId: number | string): Promise<InstallStatus>;
63
130
  getAnalytics(projectId: number | string, days: number): Promise<AnalyticsRow[]>;
131
+ exportData(projectId: number | string, format: ExportFormat, days: number): Promise<ExportDownload>;
64
132
  getRealtime(projectId: number | string): Promise<RealtimeSnapshot>;
133
+ getRevenue(projectId: number | string): Promise<RevenueSummary>;
134
+ connectRevenue(projectId: number | string, provider: string): Promise<RevenueConnection>;
135
+ getRevenueStatus(projectId: number | string): Promise<RevenueStatus>;
136
+ createEvent(projectId: number | string, input: {
137
+ name: string;
138
+ type: string;
139
+ url?: string;
140
+ value?: number;
141
+ }): Promise<Record<string, unknown>>;
142
+ listFunnels(projectId: number | string): Promise<ClarvivoFunnel[]>;
143
+ createFunnel(projectId: number | string, input: {
144
+ name: string;
145
+ steps: FunnelStep[];
146
+ }): Promise<ClarvivoFunnel>;
147
+ listAlerts(projectId: number | string): Promise<ClarvivoAlert[]>;
148
+ createAlert(projectId: number | string, input: {
149
+ type: string;
150
+ threshold: number;
151
+ }): Promise<ClarvivoAlert>;
65
152
  }
66
153
  export declare function isPlanLimit(error: unknown): boolean;
67
154
  export declare function isAnalyticsLockout(error: unknown): boolean;
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js CHANGED
@@ -1,10 +1,12 @@
1
1
  export class ClarvivoApiError extends Error {
2
2
  status;
3
3
  code;
4
- constructor(message, status, code) {
4
+ scope;
5
+ constructor(message, status, code, scope) {
5
6
  super(message);
6
7
  this.status = status;
7
8
  this.code = code;
9
+ this.scope = scope;
8
10
  this.name = "ClarvivoApiError";
9
11
  }
10
12
  }
@@ -18,6 +20,9 @@ export function planLimitMessage(baseUrl = process.env.CLARVIVO_BASE_URL || DEFA
18
20
  export function payToReadMessage(baseUrl = process.env.CLARVIVO_BASE_URL || DEFAULT_BASE_URL) {
19
21
  return `Pay $1 to read your Clarvivo data. Open ${baseUrl.replace(/\/$/, "")}/dashboard/billing, then re-run get_stats.`;
20
22
  }
23
+ export function exportPlanMessage(baseUrl = process.env.CLARVIVO_BASE_URL || DEFAULT_BASE_URL) {
24
+ return `Clarvivo data exports need a paid plan. Open ${baseUrl.replace(/\/$/, "")}/dashboard/billing, upgrade, then retry export_data.`;
25
+ }
21
26
  export function requireToken(env = process.env) {
22
27
  const token = env.CLARVIVO_API_TOKEN?.trim();
23
28
  if (!token)
@@ -33,7 +38,7 @@ export class HttpClarvivoApi {
33
38
  this.baseUrl = (env.CLARVIVO_BASE_URL || DEFAULT_BASE_URL).replace(/\/$/, "");
34
39
  this.token = requireToken(env);
35
40
  }
36
- async request(pathname, init = {}) {
41
+ async response(pathname, init = {}) {
37
42
  const response = await this.fetchImpl(`${this.baseUrl}${pathname}`, {
38
43
  ...init,
39
44
  headers: {
@@ -43,6 +48,8 @@ export class HttpClarvivoApi {
43
48
  Authorization: `Bearer ${this.token}`,
44
49
  },
45
50
  });
51
+ if (response.ok)
52
+ return response;
46
53
  const text = await response.text();
47
54
  let body;
48
55
  try {
@@ -51,9 +58,18 @@ export class HttpClarvivoApi {
51
58
  catch {
52
59
  body = text;
53
60
  }
54
- if (!response.ok) {
55
- const object = body && typeof body === "object" ? body : {};
56
- throw new ClarvivoApiError(typeof object.message === "string" ? object.message : `Clarvivo API request failed (${response.status}).`, response.status, typeof object.code === "string" ? object.code : undefined);
61
+ const object = body && typeof body === "object" ? body : {};
62
+ throw new ClarvivoApiError(typeof object.message === "string" ? object.message : `Clarvivo API request failed (${response.status}).`, response.status, typeof object.code === "string" ? object.code : undefined, typeof object.scope === "string" ? object.scope : undefined);
63
+ }
64
+ async request(pathname, init = {}) {
65
+ const response = await this.response(pathname, init);
66
+ const text = await response.text();
67
+ let body;
68
+ try {
69
+ body = text ? JSON.parse(text) : undefined;
70
+ }
71
+ catch {
72
+ body = text;
57
73
  }
58
74
  return body;
59
75
  }
@@ -69,9 +85,56 @@ export class HttpClarvivoApi {
69
85
  getAnalytics(projectId, days) {
70
86
  return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/analytics?days=${days}`);
71
87
  }
88
+ async exportData(projectId, format, days) {
89
+ const end = new Date();
90
+ const start = new Date(end);
91
+ start.setUTCDate(start.getUTCDate() - days + 1);
92
+ const query = new URLSearchParams({
93
+ startDate: start.toISOString().slice(0, 10),
94
+ endDate: end.toISOString(),
95
+ });
96
+ const response = await this.response(`/api/projects/${encodeURIComponent(String(projectId))}/export/${format}?${query}`);
97
+ return { data: await response.text(), contentType: response.headers.get("content-type") };
98
+ }
72
99
  getRealtime(projectId) {
73
100
  return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/realtime/active`);
74
101
  }
102
+ getRevenue(projectId) {
103
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/revenue`);
104
+ }
105
+ connectRevenue(projectId, provider) {
106
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/revenue-connection`, {
107
+ method: "PUT",
108
+ body: JSON.stringify({ provider, connected: true }),
109
+ });
110
+ }
111
+ getRevenueStatus(projectId) {
112
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/revenue-status`);
113
+ }
114
+ createEvent(projectId, input) {
115
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/events`, {
116
+ method: "POST",
117
+ body: JSON.stringify(input),
118
+ });
119
+ }
120
+ listFunnels(projectId) {
121
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/funnels`);
122
+ }
123
+ createFunnel(projectId, input) {
124
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/funnels`, {
125
+ method: "POST",
126
+ body: JSON.stringify(input),
127
+ });
128
+ }
129
+ listAlerts(projectId) {
130
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/alerts`);
131
+ }
132
+ createAlert(projectId, input) {
133
+ return this.request(`/api/projects/${encodeURIComponent(String(projectId))}/alerts`, {
134
+ method: "POST",
135
+ body: JSON.stringify(input),
136
+ });
137
+ }
75
138
  }
76
139
  export function isPlanLimit(error) {
77
140
  return error instanceof ClarvivoApiError && (error.code === "PROJECT_LIMIT_REACHED" ||
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const revenueProviders: readonly ["stripe", "polar", "razorpay", "paddle", "lemonsqueezy", "dodo"];
2
+ export type RevenueProvider = (typeof revenueProviders)[number];
3
+ export declare function normalizeProvider(value: string): RevenueProvider | "custom";
4
+ export declare function detectRevenueProvider(root?: string): {
5
+ provider: RevenueProvider;
6
+ packageName: string;
7
+ } | undefined;
8
+ export type ServerFramework = "next-route-handler" | "next-api-route" | "express" | "serverless" | "generic";
9
+ export declare function detectServerFramework(root?: string): ServerFramework;
10
+ export declare function revenueChecklist(provider: RevenueProvider, webhookUrl: string, root?: string): string[];
11
+ export declare function signedRevenueSnippet(apiKey: string, baseUrl: string): string;
12
+ //# sourceMappingURL=payments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.d.ts","sourceRoot":"","sources":["../src/payments.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,gBAAgB,4EAA6E,CAAC;AAC3G,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAoChE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,QAAQ,CAI3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,SAAgB,GAAG;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAI1H;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;AAE7G,wBAAgB,qBAAqB,CAAC,IAAI,SAAgB,GAAG,eAAe,CAQ3E;AAmED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,SAAgB,GAAG,MAAM,EAAE,CAQ9G;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E"}