- Eric Vegas
- 2026-09-01
- 2026-09-21
- 2026-09-25
The problem
A business owner can read their own website and see a clear story. A machine reading the same pages often cannot establish who the business is, what it does, where it operates, or whether the same facts appear consistently across the site. Nothing tells the owner which of those it is, so there is no way to know whether the problem is the content, the markup, or nothing at all.
Turn an invisible problem into a report someone can act on: name the categories, grade each one, and say specifically what is missing or disconnected.
What I built
A scanner with a paid report behind it. Enter a URL and it crawls the site, evaluates six categories of publicly observable entity signal, and produces a graded audit: problems, opportunities, root causes, repairs and the evidence for each. The free tier returns the six grades and the counts. The report itself, the entity card, the prose interpretation, the entity graph and every problem title are paid.
How It’s Built
How it works
The free tier is deliberately the grades and the totals and nothing else: how many problems, never which ones. A count proves the scan really ran without giving away the thing being sold. The gate is enforced on the server, so paid fields are never serialized to the browser at all, and the tests assert on the response payload rather than on the rendered page, because that is where a leak would actually appear. Payment is one $29 Stripe checkout with no account: an unguessable token in the URL is the entitlement, and the link is the receipt.
My role
Eric's own product, built and shipped by him: the crawler, the scoring rubric, the report, the paywall and its server-side gate, the checkout flow and the storage layer. Stripe processes the payment and Upstash Redis stores the audits. The judgement encoded in the rubric, and the decision about where the free tier stops, are the product.
The hard part
Not the scanner. The failure modes around the money. Two of them only showed up by buying the product with a real card. The store caught every Redis error and returned null, which is the same answer as "no audit with that id", so a dead database looked identical to a missing record: fulfilment gave up quietly, Stripe saw HTTP 200 and never retried, and with no account and no email there was nothing left to recover the report from. Separately, unpaid records expired after 24 hours while a Stripe session lives exactly that long, so a checkout opened late and paid a few hours later landed on a record that had already been deleted along with its token. Both were fixed on 2026-09-22: reads now throw instead of lying, the webhook answers 503 when the store is down so Stripe redelivers, and opening checkout stamps the record and buys it thirty days.
Proof
Go and open it
Artifacts
- entityauditor.com, the product itself2026-09-25
- The redaction boundary, one file, which decides what leaves the server unpaid. Its tests assert on the serialized payload rather than the rendered page.
- The product's own disclaimer, published on the landing page: the audit evaluates publicly observable website and entity signals and guarantees no ranking, indexing, citation or inclusion anywhere.2026-09-25
Claims, and what backs each one
Entity Auditor is live and anyone can run a scan against it.
https://entityauditor.com returned HTTP 200 on 2026-09-25 and serves the scan form on its landing page.
It is a paid product with live Stripe checkout, and it has taken a real payment on a real card.
Stripe is in live mode at $29 per report, keyed with a restricted key scoped to Checkout Sessions and Webhook Endpoints only. A real card has been charged. This is one transaction, recorded as one.
The paywall is enforced on the server. Paid fields are never sent to an unpaid browser.
Redaction happens at one boundary before serialization, and the test suite asserts on the response payload rather than on the rendered page, so hiding a field in the UI would fail rather than pass.
Buying it creates no account. The entitlement is an unguessable token in the URL, and it works for a year.
There is no login, no password reset and no account recovery in the product. The paid record's TTL is one year and the link is the receipt.
Results from client deployments are shared with permission on a call.
Result
One real paid transaction, on a real card, through live Stripe. That is the whole of the measured outcome and it is stated as one sale rather than rounded up into customers.
What I learned
A payment path cannot be verified by reading it. Both of those bugs were invisible in the source and obvious the moment a real card went through, which is now the last step before anything with a price on it ships. The narrower lesson: an error handler that returns the same value as "not found" has destroyed the only information the caller needed.
Technologies
- Next.js
- TypeScript
- Stripe Checkout
- Stripe webhooks
- Upstash Redis
- Vercel
Related work
If something here is close to a problem you have, the useful first message is what the thing has to do and what it has to talk to.
Get the audit — $750