Notifio is a £20 desktop app that watches rental search pages and alerts you when a new listing appears. It competes with several subscription services, so the site has a page per competitor at notifio.app/compare.
Pages like that are usually worthless, and everybody reading them knows why: they are written by the people who lose if you pick the other product. The interesting question is whether you can make that structurally harder, in code, rather than promising yourself you will be fair.
whereTheyWin has no question mark. A new comparison page does not compile until somebody has written at least one string explaining why you might buy the other thing.
An optional field for the counter-argument is a field that gets filled in on the first page and left empty on the fourth, because by then you are shipping and the section feels like homework. A required field means the compiler asks the question at the moment you are writing, which is the only moment you are actually thinking about that competitor.
This is the cheapest content governance mechanism I know of. The type is not enforcing quality, and it cannot tell a real concession from a weak one. What it enforces is that the question was asked every single time, and in practice that is most of the distance.
Content rules in a type system work for anything structured: a sources array that cannot be omitted, a pricingNote that forces somebody to write down what the plan table does not say out loud, a dated price string. I wrote about the same idea applied to the per-site landing pages in fifteen required fields and no optional ones.
Because the order lives in the template rather than in the data, no individual page can quietly decide to lead with its own case. You can check it on any of them: notifio.app/compare/rentbird opens its prose with "Where Rentbird is the better buy".
The winning side is rendered brighter. Here is the current count across all five pages:
49 rows, and although the field is optional, every row has one. Thirteen of them hand the row to the competitor, and they are not decorative rows either:
The first of those is the product's central weakness. Notifio monitors from your own machine, so a closed laptop monitors nothing, and a cloud subscription does not have that problem. Four of the five pages carry that row and all four give it to the other product. Hiding it would not make it less true, it would make the rest of the table unreliable, and a reader who finds one thing you concealed stops reading the parts you were honest about.
That sentence is the one bit of this I would defend hardest. A highlighted comparison table with no explanation of the highlighting is a visual claim a reader cannot audit. Telling them what the brightness means, and that it sometimes goes the other way, turns it from decoration into information.
A string, not a number, because the published figure is the artefact. "€16.33 / month" with a note saying "€49 up front, their most popular" is what the other company's page says, and reformatting it into our own currency machinery would turn a quotation into a calculation of ours.
PRICES_CHECKED is one exported constant, "September 2026", rendered on all five pages. One edit updates the date everywhere, which sounds convenient and is actually the hazard: the constant makes it trivially easy to claim a re-check you did not do. The mitigation is that the links are right there next to it, outbound to the competitor's own pricing page, so the claim is checkable by any reader in one click.
Those links carry rel="nofollow noopener", which is worth being upfront about rather than quiet about: we link to the source so the price can be verified, and we do not pass ranking signal to a competitor while doing it. That is the normal use of the attribute, and the reader gets the same verification either way.
The last clause of that caption is the part I like: "ours is the one number on this page we control". A comparison page where the author's own price is the only unverifiable figure would be a strange artefact. It points at notifio.app/pricing, which is checkable too.
The sitemap gives these pages a change frequency their edit rate does not justify:
A wrong sentence about our own product is embarrassing. A wrong price about somebody else's product is a different category of wrong, because they did not consent to being quoted and cannot correct it. Asking crawlers to come back more often is a small hedge against the window in which a page is wrong, and the real hedge is the dated source links.
Being honest in a required field is not free, and I would rather name the costs than pretend the design is pure upside.
