Unrecorded history is unsellable
The strongest thing we can sell is not a feature. It is showing someone what they already have.
Our paid plan opens a page's archive — the timeline of everything that landed on it. Recording runs for everyone, free included; only viewing is paid. So the upgrade prompt inside the editor can be honest and specific:
Your page has collected 47 events. See all of them with Pro.
You are not being sold a possibility. You are being shown a thing that exists, with your name on it.
Except it did not exist
Archiving only ran on the webhook path. And in production, no webhook had ever fired — deliveries empty, every subscription's last_event_at still NULL.
We had also shipped visit-refresh: when a page is visited and its data is older than six hours, we re-fetch in the background. It updated the page. It wrote nothing to the archive.
So every user's archive was empty, and would stay empty. The counter in the editor read 0 for everyone, forever, under a heading that promised a timeline.
The shape of the mistake
Nothing was broken. The archive table existed, was indexed, had a correct write path, and was covered by the plan logic. The upgrade card rendered. The query ran and returned zero rows, truthfully.
Every piece worked. They were just never connected on the path that actually runs.
The fix was one function on the refresh path — identity from href ?? title, ON CONFLICT so a re-fetch updates rather than duplicates. The table went from 0 rows to 4 within minutes of deploying, all from real content nobody typed.
What we would tell ourselves
A conversion lever that depends on accumulated data has a second dependency nobody writes down: something must actually be accumulating.
If your upsell says "you have N of these," go and check N in production before you ship the copy. Ours was zero for weeks while the page confidently offered to show it.