Starter
$29/month
- 200k monthly events
- 1 website
- 1 team member
- 3 years of data retention
- All analytics screens
- Revenue attribution
- AI referrer breakdown
- Funnels & journeys
- API, CLI & MCP
- Social media mentions
- X / Twitter link attribution
Analytics that joins every Stripe charge back to the visit that earned it.
<script defer data-site="mf_pub_..." src="https://metricfly.app/t.js"></script>One script tag. Anywhere your site already runs.
1.5KB
Tracker size, enforced by the build
0
Cookies, storage keys, IPs stored
4
AI referrers split out, not lumped in
3days
Free, no card asked for
A defer script tag in your head. It starts recording pageviews immediately — no build step, no SDK, no configuration file.
<script defer data-site="mf_pub_..." src="https://metricfly.app/t.js"></script>
Pass the visitor ref into Stripe. That is the whole integration, and it is what turns a visit into an attributable sale.
client_reference_id: metricfly.stripeRef()
The weekly email says which channel sent visitors and which channel sent money. Usually not the same one.
ChatGPT · 337 visitors · $2,915 Google · 1,917 visitors · $4,336
Other tools count visits. This one counts the ones that paid.
Connect Stripe read-only. Every charge joins back to the session that produced it.
Their own category and their own trend, not folded into “other”.
No cookie, no storage key, no IP. That is why there is no consent banner.
Zero dependencies, async, fails silently. The build fails if it ever grows.
Drop-off and revenue per step, over real sessions.
Who is on your site right now, and where.
What we store
What we never store
Enforced by a build step, not by a policy — npm run privacy:audit fails the deploy if any of the right-hand column ever appears.
| METRICFLY | Plausible-class | Google Analytics | |
|---|---|---|---|
| Revenue per source | |||
| AI referrers split out | |||
| No consent banner | |||
| No cookies | |||
| Script size | 1.5 KB | ~1.6 KB | ~45 KB |
| Setup | 1 line | 1 line | Tag manager |
Move the slider to your traffic. 3 days free, no card.
$29/month
$59/month
Warned at 80% and 90%. Collection stops at 100%.
A banner is required for storing something on a visitor’s device or processing personal data. We do neither — the full field list is published, so your lawyer can check it in five minutes.
Someone visiting Monday and Tuesday counts twice, so there is no returning-visitor rate. That is a real cost. The alternative is a persistent identifier, which is exactly what makes a banner necessary.
Pass metricfly.stripeRef() into Stripe Checkout as client_reference_id — two words in code you already have. We join the charge back to the session that produced it.
It gets its own row, labelled unattributed. We never spread it across your sources — that would make every figure slightly fictional.
1.5 KB, deferred, no dependencies, no layout reads. The build fails if it ever grows past 5 KB.
Collection stops at 100%, and resumes when the period resets or you upgrade. Warned at 80% and 90%, and the dashboard says so in words rather than showing a flat line.
24 hours to update it, with the deadline in the banner. Long enough that a card expiring overnight costs you nothing; short enough that it is not a free month.
Export everything as JSON, or delete the account and its data, both from the billing screen. Neither needs to go through us.
Thirty days free. No card, no sales call, no consent banner to write.
Start free<script defer data-site="mf_pub_..." src="https://metricfly.app/t.js"></script>