Skip to content
Halopen

engineering

I fact-checked my own marketing. It did not go well.

Seven false claims about my own product, all written by me, none of them lies. What I found, and the check that had been quietly passing for four months without working.

Jesse Meria · · 6 min read

The pinned post on my product’s X account was advertising a free tier that no longer exists.

Not a typo. Not a rounding error. The single most-viewed thing on that account — the first thing any human being sees when they click the profile — was cheerfully offering a monthly allowance the product had retired three days earlier. It is a 14-day trial now, and it was a trial by the time anybody read that post.

I found it while doing something else entirely. I was trying to fix the account’s reach, which is a polite way of saying I was trying to fix the fact that nobody looks at it. And somewhere between “why does this reply have one view” and “let me open my own profile like a normal person would,” there it was. My own storefront, confidently selling something I had personally retired.

So I went looking for its friends. It had six.

The receipts

A pricing card, served live from my own domain, quoting last quarter’s prices. $15 a month and $144 a year. The real numbers had been $19 and $179 since May. The card was a PNG — the worst possible place for a wrong number to live, because every fact-checking script I own reads text. You cannot grep an image. It sat there for four months returning a cheerful HTTP 200 to anyone who asked.

A capability my software does not have. Four launch documents — a Hacker News post, a Reddit post, a directory submission, and the fact sheet all of them copy from — claimed there was “no per-recording time cap.” There is a ten-minute cap. It is in the source code. It is also, and this is the part where I put my head in my hands, stated correctly on my own pricing page. My marketing was contradicting my marketing, and the wrong one was the copy about to be emailed to journalists.

A dead link, verified twice. My site’s structured data pointed at an X profile that does not exist, and had for four months. Two separate sessions had checked it and written down that it was fine, because the check was curl — and X returns the same response for a live handle and a dead one. The note in my own repository reads: “returned 403 to curl, but page exists.” That sentence contains a verification and an assumption wearing the same coat.

A number that moved. A draft email to three journalists said the app idles at 84.3 megabytes — measured, not estimated, and I was rather pleased with the precision. I measured again: 145.8 megabytes. Both are honest numbers. The first was a fresh launch; the second was a process that had been running for two and a half days. Precise figures invite verification, which is exactly what makes a precise figure that drifts worse than no figure at all.

A default that wasn’t. Copy in several places said the app feeds your dictionary, your selected text and your cursor context to the transcription engine. Two of those three are off unless you turn them on — deliberately, because your clipboard might hold a password you just copied. The true version is a better story than the false one, which is usually the case and never stops being annoying.

And an absolute. “Types into any app on your Mac.” It cannot type into a field with macOS Secure Input active. Neither can anything else — the OS blocks synthetic keystrokes there for every application on the platform. Saying so costs one clause and buys more credibility than the absolute ever did.

The part that actually bothers me

Every single one of those was true when I wrote it.

I did not exaggerate. I did not round in my own favour. I wrote down what was true on a Tuesday, and then reality moved, and nobody told the copy. The old allowance was retired in favour of a trial and the pinned post was not on the retirement checklist. Prices went up and the image did not. The cap was added and four documents kept describing the version of the product that predated it.

Marketing copy does not rot because you lied. It rots because facts have expiry dates and almost nothing revalidates them. Every claim you publish is a small unmaintained service running in production with no monitoring, and the failure mode is silent, and the alerting system is a stranger noticing before you do.

The dead link is the one that keeps me up. It was not unchecked. It was checked twice and passed twice, by a test that could not physically fail. That is worse than never looking, because now there is a green light and a written record telling every future version of you not to bother.

What I do now, which is embarrassingly simple

Check it the way a stranger would, not the way that is convenient. If someone can run the command, run the command. If it is an image, open the image. curl returning 200 is not the same as a human seeing the page, and I have four months of evidence.

When the product changes, audit every surface — not just the repository. A pinned social post is a landing page nobody thinks to search. So is a PNG. So is an email draft from August. The repository is the surface you will remember; it is rarely the one a customer meets.

And if a check cannot fail, it is not a check. Before trusting one, break the thing on purpose and watch it go red. If you cannot make it fail, you have built a machine for generating false confidence, which is strictly worse than no machine.

The good news, such as it is

All seven are fixed. It took a day — less than it took to write them.

And the useful discovery is that this was findable at all. I only found the first one because I clicked my own profile the way a customer would, which I had not done in weeks, because I build the thing and therefore never arrive at it the way anyone else does.

That is the whole trick, I think. Go be a stranger to your own product for an hour.

Bring a notepad. You will need it.


This is also why Halopen’s homepage now hands you a shell command instead of a testimonial. If a claim can be checked, it should be — I would rather be verified than believed, having recently established that believing me was not a great strategy.

Pass it on

Try Halopen

Hold the function key. Speak.

Halopen is free for 14 days, no credit card. Pro is $19/mo or $179/yr — unlimited.

Questions

Answered here.

What was the actual damage?
Nothing measurable, which is mostly luck rather than a defence. Halopen gets very little traffic today, so few people saw a wrong price. The point is that none of it was findable by the checks that were supposedly running — and traffic was about to increase.
How do you stop it happening again?
Three habits. Check a claim the way a stranger would rather than the way that is convenient. When the product changes, audit every surface rather than the repository. And before trusting any automated check, break the thing on purpose and confirm the check goes red — if it cannot fail, it is not a check.

Power-user cheat sheet

Take Halopen with you.

The Halopen power-user cheat sheet by email — hotkeys, the right mode for each app, dictionary tips, voice patterns for prompting. Four short notes over two weeks can follow, only if you ask for them. Unsubscribe in one click.