Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Virling

FreeNot checked

Open-source revenue attribution: see which traffic channel brings paying customers. Stripe, Dodo Payments and Polar. One Rust binary.

GitHubEmbed

About

Open-source revenue attribution: see which traffic channel brings paying customers. Stripe, Dodo Payments and Polar. One Rust binary.

README

Virling logo

Virling

Open-source revenue attribution. See which traffic channel brings paying customers, not just visitors.
virling.com · Live demo · Docs · For agencies

Virling dashboard: revenue, revenue per visitor and the channels that bring paying customers


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 in assets/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 query and AI assistants such as Claude and ChatGPT can answer revenue questions. Hosted Virling is in the Claude directory. An agent skill is in plugins/virling/skills/virling, and claude plugin marketplace add virling/virling installs 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.

from github.com/virling/virling

Installing Virling

This server has no published package — it is built from source. Open the repository and follow its README.

▸ github.com/virling/virling

FAQ

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

Compare Virling with

Not sure what to pick?

Find your stack in 60 seconds

Author?

Embed badge for your README

Browse similar

All data MCPs