@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 +49 -7
- package/dist/analytics.d.ts +67 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +150 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api.d.ts +88 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +68 -5
- package/dist/api.js.map +1 -1
- package/dist/payments.d.ts +12 -0
- package/dist/payments.d.ts.map +1 -0
- package/dist/payments.js +131 -0
- package/dist/payments.js.map +1 -0
- package/dist/report.d.ts +3 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +38 -0
- package/dist/report.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +92 -1
- package/dist/server.js.map +1 -1
- package/dist/tools.d.ts +51 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +289 -8
- package/dist/tools.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
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
|
|
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:**
|
|
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,
|
|
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
|
|
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,
|
|
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":"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"}
|
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
|
-
|
|
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":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACjF,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACrE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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":"
|
|
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"}
|