The number I had not looked at, and the wrong version of it
I have written here that every company I own is a customer of every other one, and that the test is whether money actually moves. I had never run the arithmetic. So I built the thing that runs it.
crawlproof dashboard is a terminal dashboard over three feeds that were never in the same place: the CrawlProof tracker for who arrived, the ad network for what got delivered, and CoinPay for what the bank actually did. Five screens.
The first version told me revenue was $131 a month. It also told me, on a one day window, that merchant volume was $126,800 a month. That second number is what saved me, because it was obviously insane and I had to go find out why.
The bug was the interesting part
CoinPay's earnings block does not move when you change the window. Ask it for 7 days and ask it for 30 and you get byte identical numbers: same gross, same commission, same transaction count. The bank half of the same response does change. So the earnings figures are a lifetime balance, not a rate.
I had been dividing that lifetime total by a window it never covered and multiplying back up to a month. On a 7 day window that multiplies by more than four. A merchant we lost, who was doing real volume before he got us both banned from Stripe, was being resurrected every time the dashboard refreshed.
The fix is that revenue now comes from the day series, which is actually windowed. Here is what that does to the number.
before after
commission $131.06 $3.82
gross volume $29,591 $653
ROI -97% -99.9%
Two days in the last month had any card volume at all.
The real numbers
Cost $4,435/mo (180 day average, business accounts only)
Revenue $3.82/mo (last 31 days)
Net -$4,431/mo
ROI -99.9%
Months of cover 1.1
52 sites, 3,570 pageviews in the last month, $1.24 of spend behind every page anyone read. OpenAI takes $720 a month, DigitalOcean $603, Anthropic $337.
That is worse than the wrong number by a factor of thirty four. It is also the first honest version I have ever had.
Two rules I had to write in on purpose
Both exist because breaking either produces a friendlier number that is false.
Self dealing is not revenue. CrawlProof runs ads on my own sites, paid for by my own campaigns. One account on both sides. The ledger will happily tell you the publisher earned money, and it did, from the advertiser, who is me. So ad spend and ad earnings sit on their own line called Internal and count as neither cost nor revenue.
Groceries are not infrastructure. The bank feed is one human's accounts next to the business ones. Cost is the business scope only. A transaction row does not carry a scope, it carries an account id, and the scope lives on the account, so you have to join the two.
Saying what you do not know
The tracker reports 477,143 visitors against 3,570 pageviews. That gap is real. A visitor there is any hit not classified as a crawler, and bittorrented.com has an endpoint that machines poll constantly without announcing themselves. Divide burn by 477,143 and you get a cost per visitor of one cent, which is a wonderful number that describes nothing.
So the dashboard prints both, and prints a line next to them saying there are 133 times more visits than pageviews, prefer the per pageview figure. It says when one site is more than half the fleet. A site that did not answer is reported as missing rather than zero. A vendor list built from one page of a longer ledger says so.
That is the part worth keeping. Showing what you know is easy. The work is getting a dashboard to say what it does not know, loudly, next to the number, so nobody quotes the flattering one by accident. I know because I quoted the flattering one myself, in a draft of this post, before I checked.
Install it
npm install -g @profullstack/crawlproof
crawlproof dashboard
Docs at crawlproof.com/docs/cli. It needs a CrawlProof API token. The money screens want a CoinPay merchant session as well, and without one the other screens still work and the money panels tell you what is missing instead of showing zero.
What I actually learned
Minus 99.9 percent is not the interesting part. Two things are.
The cost is real and the revenue is a rounding error, and I could have said that in the abstract for months without ever being made to look at $4,435 sitting next to $3.82.
And I now know what a reader costs. $1.24. Every argument about what to build next is a different argument once that number exists, and it did not exist last week. It was also wrong for about six hours, which is its own lesson: a number you have not tried to break is not a measurement, it is a decoration.
Top comments (0)