Virling
FreeNot checkedOpen-source revenue attribution: see which traffic channel brings paying customers. Stripe, Dodo Payments and Polar. One Rust binary.
About
Open-source revenue attribution: see which traffic channel brings paying customers. Stripe, Dodo Payments and Polar. One Rust binary.
README
Virling
Open-source revenue attribution. See which traffic channel brings paying customers, not just visitors.
virling.com · Live demo · Docs · For agencies
Virling joins every visit to the payment that followed. It answers the questions a founder asks every week:
- Which channel brought the most revenue this month?
- Did that launch, tweet or Reddit post make money, or just traffic?
- What is a visitor from each source worth?
- What path did my last paying customers take before they paid?
It runs as one Rust binary with embedded storage. No Postgres, no ClickHouse, no Redis.
Status: early development. Releases are on the releases page and run on your own server today. Expect breaking changes until a stable release. The hosted beta is open to everyone at beta.virling.com.
What works today
- Tracking script (
/v.js, about 1.4 KB gzipped, source inassets/v.src.js): pageviews, UTM tags, referrers, single-page-app route changes, custom goals, and a first-party visitor ID. Stripe Payment Links, Polar checkout links and Dodo payment links get the visitor ID added automatically. - Cookieless mode: a daily-rotating salted hash instead of a cookie, for sites that want no consent banner, at the cost of payment attribution.
- Event ingest into embedded DuckDB, with bot filtering, per-site rate limits and channel rules (Paid, Email, AI, Organic search, Communities, Social, Referral, Direct). Visitor IPs are never stored.
- Payment sync from Stripe, Dodo Payments, Polar and LemonSqueezy with a read-only key (LemonSqueezy keys cannot be limited): a 90-day backfill, then a poll every minute. Virling never creates, changes or refunds anything. LemonSqueezy payments count toward revenue, but linking them to visits waits on webhook support.
- Attribution: last non-direct or first touch, with a 30, 60, 90 or 365 day lookback. Renewals keep the channel of the customer's first payment. Payments without a visitor ID count as Unattributed.
- Revenue dashboard: revenue, revenue per visitor and conversion by channel, referrer, campaign, page and country, payment journeys, a Visitors page, retention by first channel, tracked short links, and AI assistant visits next to AI crawler hits.
- Reports and sharing: weekly email reports with agency branding, and an optional public dashboard.
- Read API, MCP server and CLI: read-only access with API keys or OAuth sign-in, so
virling queryand AI assistants such as Claude and ChatGPT can answer revenue questions. Hosted Virling is in the Claude directory. An agent skill is inplugins/virling/skills/virling, andclaude plugin marketplace add virling/virlinginstalls it with the MCP server as a Claude Code plugin. - WordPress plugin in
integrations/wordpress. - Magic-link sign-in and onboarding (behind
--app).
Not available yet: the hosted plan, team members, imports from other tools, other attribution models and Windows builds.
Run it
With Docker:
docker run -d --name virling -p 8080:8080 -v virling-data:/data \
-e VIRLING_BASE_URL=https://stats.example.com \
ghcr.io/virling/virling:latest serve --app
docker exec virling virling add-site yourdomain.com --owner [email protected]
The full guide, with release binaries, a reverse proxy and payment setup, is at docs.virling.com. To run from source, you need Rust 1.99 or newer:
cargo run --release -- add-site yourdomain.com --owner [email protected]
cargo run --release -- serve --app
Then add the script to your site:
<script defer src="https://YOUR-VIRLING-HOST/v.js" data-site="yourdomain.com"></script>
Track a goal from your code:
virling("goal", "signup");
Pass the visitor ID into checkout so payments can be matched back to visits:
virling.vid();
Configuration
| Variable | Default | What it does |
|---|---|---|
VIRLING_DATA |
./virling-data |
Folder for the SQLite and DuckDB files |
VIRLING_ADDR |
0.0.0.0:8080 |
Address to listen on |
VIRLING_BASE_URL |
http://localhost:8080 |
Public URL, used in emails and snippets |
VIRLING_APP |
off | Serve sign-in and the app |
VIRLING_SMTP_URL |
unset | SMTP for emails, e.g. smtps://user:[email protected]:465. Unset: emails are logged |
VIRLING_MAIL_FROM |
Virling <[email protected]> |
Sender for sign-in emails |
VIRLING_TRUST_PROXY |
off | Read the client IP from X-Forwarded-For |
VIRLING_EVENTS_PER_SECOND |
200 |
Ingest limit per site |
Development
cargo test
worker/ holds the Cloudflare Worker that serves virling.com. It reuses the landing pages in assets/ and builds with wrangler deploy.
License
AGPL-3.0. Self-host it freely. If you run a modified version as a service, share your changes.
Built by Stacklance Infotech LLP.
Installing Virling
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/virling/virlingFAQ
Is Virling MCP free?
Yes, Virling MCP is free — one-click install via Unyly at no cost.
Does Virling need an API key?
No, Virling runs without API keys or environment variables.
Is Virling hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Virling in Claude Desktop, Claude Code or Cursor?
Open Virling on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Postgres
Query your database in natural language
by Anthropicwenb1n-dev/SmartDB_MCP
Connect to multiple databases at once (MySQL, PostgreSQL, SQL Server, MariaDB, Dameng, Oracle) for operations, health analysis and SQL optimization.
by wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashPostgreSQL
Read-only database access with schema inspection.
by modelcontextprotocolRedis
Interact with Redis key-value stores.
by modelcontextprotocolSQLite
Database interaction and business intelligence capabilities.
by modelcontextprotocolmxcp
Open-source framework for building enterprise-grade MCP servers using just YAML, SQL, and Python, with built-in auth, monitoring, ETL and policy enforcement.
by raw-labsjulien040/anyquery
Query apps with SQL from a single local-first binary; also connects to PostgreSQL, MySQL and SQLite-compatible databases.
by julien040drakonkat/wizzy-mcp-tmdb
Search and retrieve movie, TV show and person information from The Movie Database (TMDB) API.
by drakonkatlongevity-genie/opengenes-mcp
Query the OpenGenes database for aging and longevity research.
by longevity-genieCompare Virling with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs

