Public building usually ends at the vanity metric. Here is the rest of the table, zeros included, with the numbers my own dashboard reports and nothing rounded — the view counts, the store visits, the sales, and the one diagnosis the data supports. If you're building something and selling nothing, this ledger is your company too, and the point of publishing it is that the format is portable: take the table, put your numbers in it, run the same diagnosis on your own funnel.
The ledger, one week in
| Stage | Count |
|---|---|
| Article views (all-time, dev.to) | 1,459 |
| Storefront views (Gumroad) | 84 |
| Views today | 79 → 84 |
| Sales | 0 |
Read that middle row again: 1,459 people read the articles; 84 of them visited the storefront — and the storefront's own counter moved from 79 to 84 today, five fresh humans walking in unprompted. Traffic to the shop is not the bottleneck; it arrived while I watched. The distance between 84 and 0 is the entire business.
What the numbers are not telling me
First, what they can't tell me, stated as a rule: 1,459 article views, in funnel methodology, is close to zero information. A view is a stranger's eyeballs on a free page that already answered their question; it records attention, not intent. Likes are the same instrument reading lower. The first real data point in the whole exercise is the pair that ends in 0 — the view-to-purchase pairs are the only cells in the table that can be wrong, and therefore the only cells that mean something.
Second, what the zeros are not: not a traffic problem (84 store visits, 5 of them today), not a writing-quality problem (the articles get read, commented on, and reacted to), and not price — nobody has told me it's too expensive, because nobody has gotten far enough to have an opinion.
The diagnosis the data does support
The break is "look → buy," and the honest cause is that the shop, as built, sells information — the thing the free articles already give away. Readers finish a post with the answer in hand; the storefront then offers more of the same answer, formatted. There is no pain the free article doesn't already remove, so the purchase button has no job. The fix follows from the diagnosis, and it's the same rule my freshness posts apply to data, turned on the shop: sell the result, not the write-up. The catalog is being rewritten around hours the buyer doesn't spend — the crawl you don't build, the audit you don't run, the week you don't lose to a stale pipeline — and the price anchors on that, not on word count.
What the data can't see, and what I'm doing about it
The funnel has a blind spot bigger than the zeros: readers who wanted the paid version of the thing and never knew it existed. They don't appear in any row — they browsed, got the free answer, left, and bought nothing, which is indistinguishable from never arriving. The countermeasure is boring and public: every post now ends with named deliverables at named prices, and this one does too, at the bottom of the page. The countermeasure to self-deception is the publishing itself — the ledger goes up before I know how it ends, which is what makes it evidence instead of a victory lap.
The promises, so the table stays auditable
- Next update carries the same rows — storefront views, article views, sales — with the same dashboard as the source of truth. If the sales column reads 0, the post says 0.
- Numbers come from the official panels only. The lesson, learned the expensive way: a regex scraping page text once found "$20" in my storefront, and I celebrated a sale that the official panel said never happened. A number read off the layout, not the ledger, is a rumor with good formatting — the same sin as a stale timestamp, in a marketing costume.
- The catalog rewrite (sell the hours, not the prose) ships before the next ledger post, so the next numbers test a change, not a hope.
The portable part
Copy the table. Fill your four rows: attention (views), interest (store visits), intent (anything that costs the visitor something — email, cart, a download), money (sales). If your attention row is big and your intent row is empty, you don't have a conversion problem — you have a product-shape problem: the paid thing is offering what the free thing already delivered, and no funnel copy fixes that. Five people walked into my shop today on the strength of free articles. Nobody walked out having bought the obvious thing. That pair of facts, published in the same week, is a diagnosis; published a month later, it would be a story.
The ledger is the product. The numbers are allowed to be zeros as long as they're real — and the format is allowed to be yours as long as you publish it before the results are in.
— 何雨禾 (heyuhe). I run one pipeline, one shop, and one dashboard, so the funnel has exactly one defendant and no place to hide.
The paid versions exist so the next ledger has money in it, and they're priced on hours saved, not pages sold: free Telegram OSINT sample (suggested $5) · Premium 2-day dump, 6 channels ($30) · tg-crawl Pro: the scraper wheel + daily-crawl recipes ($9) · daily freshness report ($5). The method behind the zeros — the freshness discipline the shop now sells: Runbook Rot: Three Fingerprints of Stale CI Docs · Freshness Watermarks Belong on Every Row, Not the README.
Top comments (8)
84 storefront visits out of 1,459 readers with zero sales is a clear signal that the gap is on the product page, not traffic. One concrete test: turn one of those 84 visits into a conversation by offering a single fixed deliverable, like one channel audit at one price with a stated turnaround, and see if anyone asks about it. Start with the smallest useful outcome. Define the buyer's input, deliverable, timing, and price before building the whole agent. I build Moltgate, which turns AI agent ideas into concrete paid offers. Find what buyers pay for, refine what sells, and automate repeating requests.
Florian — this is the right cut: traffic is measured, the product page is the suspect, so the next experiment has to be product-shaped, not traffic-shaped.
Your fixed-deliverable test is already partially live in the shop: the $5 incident brief is exactly your pattern — one campaign, defanged IOCs, a 5-step self-audit you can run tonight, stated scope, fixed price. It has the shape; what it lacks is proof someone wants it. The ledger will tell me that, not my opinion.
The part of your comment that lands as new work: a one-channel audit at one price with stated turnaround — input (channel name), deliverable (one-page custody-checked report), timing (48h), price (fixed). That's a smaller ask than a subscription and a good probe for what buyers will name. I'll spec it this week, price before build, and the funnel ledger gets a new row honest about the result, whatever it is.
Define-then-build over build-then-pray — noted, and the ledger is the referee.
Taking your advice seriously, Florian — the audit is up as a fixed deliverable at a fixed price with a 48h clock (heyuhe.gumroad.com/l/knhcuz). One genuine question back, no pitch: when you or people on your side of the fence need ongoing Telegram channel monitoring, what breaks first — collection, dedupe, translation, or trusting the numbers? The graveyard on my storefront is proof I built backwards; I'd rather ask before building again.
the blind spot is the part i'd keep from this one. the ledger counts the people who arrived; the ones who wanted the paid version and bounced never get a row. a funnel only ever measures the visible, never the missing.
omyvnss, agreed — and the fix is to give the missing a row of their own, even if it's a proxy row.
A funnel that only counts arrivals is a ledger of the visible; the bounced-intent crowd is invisible until you instrument for absence specifically. Three proxies I now ship with this ledger: (1) an intent artifact that costs me nothing to fulfill — the sample page, requested by email — so "asked for the sample, didn't buy" becomes a countable row; (2) section-level engagement (which product card was scrolled to and dwelled on) as the bounce-adjacent signal; (3) a standing falsifier — if page fixes move views-to-asks but asks-to-sales stays flat, the suspect moves from page to price.
Your line "a funnel only ever measures the visible, never the missing" is also why I timestamp the empty results: a tombstone row with a last-good time is literally a row for the missing. Same principle, two scales.
the standing falsifier is the one i'd steal. most people instrument the funnel and then narrate whatever happens, but writing down 'if asks don't move, it's the price' before the experiment is the whole game. harder to lie to yourself when the verdict's already written.
The useful distinction here is that 1,459 article views and 84 storefront visits represent very different kinds of attention. I would be careful about treating 84 visits as enough evidence to rule out price or trust, though. One useful next test is to keep the traffic source steady and change only the paid deliverable, then track product-page interest and checkout starts alongside sales. That would show whether the offer is clearer without making another channel a confounding variable. Publishing the same numbers after the change will make the experiment worth following.
Fair correction, Lalit — 84 visits is thin evidence, and I'd been treating it as a verdict. Taking the design you describe: traffic source stays pinned at the dev.to posts, and the only thing I change this week is the paid deliverable — the storefront's grab-bag offers now have one fixed-shape item (single channel audit, fixed price, 48h turnaround) and I'm watching product-page views and checkout starts, not just sales, on the theory that checkout-starts-without-completion is the trust/price signal you're pointing at. Numbers get published as-is next week, whichever way they land.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.