This $129 came from one post on X
DataPenny ties every sale to the visit that earned it, then prints the trail. Open source, on your own Cloudflare.
Revenue from Stripe, Dodo Payments, Razorpay, Lemon Squeezy, Polar, Paddle and Creem, or anything that can make an HTTP call. Runs on Cloudflare Workers and D1.
Every visitor, next to what they paid
Sources, pages, countries and devices, with the revenue each one brought in. Click any row and the whole dashboard filters to it.
- Visitors
- 18,406+21%
- Revenue
- $11,482+34%
- Conversion
- 1.74%+0.2
- Revenue per visitor
- $0.62+11%
| Source | Visitors | Revenue |
|---|---|---|
| x.com | 6,211 | $3,118 |
| google.com | 4,102 | $2,640 |
| Direct · shared link | 2,644 | $1,207 |
| news.ycombinator.com | 1,918 | $1,466 |
| chatgpt.com | 1,207 | $1,092 |
Every sale lands on a visit
One key connects your payment provider. From then on new sales, renewals and refunds flow in by themselves, and your history comes across in one go.
One buyer, three visits
The default. The latest visit with a real source gets the sale, so a typed address never hides what sent them.
Your week, hour by hour
Find your three busiest hours and the best moment to post. Then flip to sales, because people often pay at a different hour from when they browse.
Peak hours
Last 30 days, local time
Thursdays, 2 pm to 5 pm is your busiest stretch.
2.6 times a usual three hours. Post around Thu 1 pm to be there before they arrive.
How far buyers read before paying
Scroll depth and reading time for each page, with buyers set against everyone else. An idle tab doesn’t count as reading.
On /pricing, buyers get 44% further down the page and stay 2.5 times as long.
- Reading time
- Scroll depth
The source that found them, and the one that closed
Retrace how customers reached their first sale: how long they took, which source introduced them, and which one gets the credit.
Time from first visit to purchase
- 58Same visit
- 14Same day
- 511 to 3 days
- 344 to 7 days
- 261 to 2 weeks
- 172 to 4 weeks
- 12Over a month
38% of visits, with no source
Apps hide the referrer inside their built-in browsers. DataPenny recognises the browser and gives the visit to the app.
Direct is three different things
Someone who typed your address, someone who got a link in a chat, and someone back from checkout are not the same visit. AI assistants get their own channel too.
What a customer from each source is worth
Customers grouped by where they first came from, with everything they’ve paid since: renewals, upgrades and repeat orders.
| First source | Customers | Lifetime value | Bought again | Paid so far |
|---|---|---|---|---|
| Hacker News | 23 | $214 | 39% | $4,922 |
| x.com | 64 | $148 | 28% | $9,472 |
| chatgpt.com | 17 | $176 | 35% | $2,992 |
| google.com | 58 | $131 | 24% | $7,598 |
| reddit.com | 14 | $96 | 14% | $1,344 |

Everyone on your site, on a spinning globe
Press M anywhere in the dashboard. Each visitor gets a pin with their page and source, and every sale plays a chime.
Entry 8The real mapSample visitors
Your phone buzzes, and it says why
- Every sale and refundEach one names the post or search behind it.
- Traffic spikesWhile the post is still taking off, with the page they land on.
- A daily digestAt a time that suits you, in up to five Telegram chats.
Mira Kowalska
Source: Organic Social · x.com · campaign pricing-thread
🇩🇪 Germany · first visit 12 days before buying
142 visitors in the last hour (usually about 11)
Top source: news.ycombinator.com
Landing on: /blog/first-1000-users
37 online right now
Visitors: 1,284 (↑12%)
Revenue: $642 (↓4%) · 11 sales
Conversion: 0.86%
Top source: x.com (412)
Top page: /pricing (308)
Ask your agent what changed this week
A read-only MCP server is built into every install, so Claude Code, Cursor and other clients answer from your own numbers. The CLI gives you the same data as JSON.
> which post earned the most this month? datapenny: get_breakdown dimension=referrer by=revenue period=30d x.com brought in $3,118 from 41 sales, more than any other source. Most of that traces to one campaign, pricing-thread ($2,240). Google is second at $2,640, but those buyers take longer to decide. > how does this week stack up against the last one? datapenny: compare_periods period=7d Visitors up 18%, revenue down 6%. The extra traffic came from Reddit, and those visitors didn't buy. x.com sales held steady.
// ~/.cursor/mcp.json { "mcpServers": { "datapenny": { "url": "https://YOUR-DATAPENNY-URL/mcp", "headers": { "Authorization": "Bearer dpr_YOUR_KEY" } } } } // Then ask in the chat: // "For visitors from Google, which landing page sells best?"
$ npx datapenny sources --by revenue --period 30d referrer Visitors Revenue x.com 6,211 $3,118 google.com 4,102 $2,640 news.ycombinator.com 1,918 $1,466 chatgpt.com 1,207 $1,092 $ npx datapenny sales -n 2 When Amount Type Source Visits To buy Visitor 2h ago $129.00 sale x.com 4 12d 3h 3f2a91c0 5h ago $49.00 sale google.com 1 40m 8s a81c02de
One tag, one key, one receipt
- Paste one script tagIt’s about 3 KB gzipped. Single-page apps and subdomains work without extra code.
- Connect your payment providerPast sales import, and payment links get tagged for you.
- Read your first receiptThe next sale shows the source that brought it, on the dashboard and on your phone.
// Inside head, on every page <script defer data-site="site_yourapp" src="https://YOUR-DATAPENNY-URL/js/script.js"></script>
// app/layout.tsx import Script from 'next/script'; <Script src="https://YOUR-DATAPENNY-URL/js/script.js" data-site="site_yourapp" strategy="afterInteractive" />
// WPCode plugin, Header section <script defer data-site="site_yourapp" src="https://YOUR-DATAPENNY-URL/js/script.js"></script>
// layout/theme.liquid, before the closing head tag <script defer data-site="site_yourapp" src="https://YOUR-DATAPENNY-URL/js/script.js"></script>
// Site settings, Custom code, Head code <script defer data-site="site_yourapp" src="https://YOUR-DATAPENNY-URL/js/script.js"></script>
// Site settings, Custom code, End of head <script defer data-site="site_yourapp" src="https://YOUR-DATAPENNY-URL/js/script.js"></script>
It runs in your Cloudflare account, not ours
No server to manage and no database to babysit. From a clone, npm run setup creates the database, sets your secrets and deploys.
In your account
- One Worker: ingest, API and dashboard
- One D1 database: visits, sales, settings
- Your dashboard password and encryption key, as secrets
- Unlimited websites and events
Never on our side
- Your visitors and your sales
- A license check or activation limit
- Telemetry from your install
- A bill that grows with your traffic
Open source
AGPL-3.0, the whole product. Read every line, change what you like, and keep your install forever.
The repository opens at launch. Everything that doesn’t cost money to run stays in the open version.
Free to run yourself. Cloud is coming.
The same product either way. Self-host it on an account you own, or join the waitlist for the version we run.
Self-hosted
Every feature, on your own Cloudflare.
$0 forever
Cloudflare’s free plan fits most small sites. Busier ones pay Cloudflare $5 a month. The repository opens at launch.
Read the install guideCloud
We run it for you. Not available yet.
$9 a month, first paid tier
Limits and the lifetime price aren’t set yet. People on the waitlist hear them first and get early access.
Join the waitlistQuestions
Where does my data live?
In your own Cloudflare account, where DataPenny runs as one Worker and one D1 database. None of our servers sit in the path, and there’s no license check or telemetry.
When can I install it?
The repository opens at launch. Join the waitlist and we’ll email you the day it does. Until then, the live demo is the real dashboard running on sample data.
Does it work with my payment provider?
Stripe, Dodo Payments, Razorpay, Lemon Squeezy, Polar, Paddle and Creem connect directly. Anything else can report its sales with one HTTP call to the Payments API.
What does it cost to run?
Self-hosting is free from us. Cloudflare’s free plan covers most small sites, roughly 25,000 pageviews a day. Busier sites need Workers Paid at $5 a month, which you pay to Cloudflare.
Do I need a cookie banner?
That depends on the mode you pick for the site. First-party cookies follow a buyer for weeks. Cookieless stores nothing in the browser, but only links sales to same-day visits. The third mode stays cookieless until your banner gets a yes. Your lawyer has the last word on which one fits.
Coming from DataFast?
Your data-fast-goal tags, window.datafast() calls and datafast_visitor_id metadata keep working, and the Payments API uses the same field names. On most sites the only change is the script tag.
Why not just use Google Analytics or Plausible?
They start from pageviews and need you to send revenue as events. DataPenny starts from the payment: connect your provider with a key and every sale, renewal and refund lands on the visit that earned it.
How sure is each match?
Most sales carry the visitor id through checkout, or come back through your thank-you page. When only timing links a sale to a visitor, DataPenny marks it estimated and replaces it if proof arrives. You can turn timing matches off.
Can Claude or Cursor read my numbers?
Yes. An MCP server with read-only keys ships inside the Worker, so Claude Code, Cursor and other clients answer from your own data. Customer names and emails are left out unless a key is allowed to read them.
Will ad blockers stop it?
Some will, as with any analytics. Routing the script and its events through your own domain keeps most of them out of the way. Payments reach DataPenny from your provider either way.
Find out what your last sale came from.
Open the demo to see it on sample data, or join the waitlist to hear when the repository and Cloud open.