Notifio is a desktop app that watches rental search pages and emails you the moment a new listing appears on one. Five pages on its site are about other companies' products, all of them linked from /compare: Rentbird, RentSlam, Stekkies, Visualping and Rentola.

I have written about the table on those pages before, in 49 rows in our comparison tables, 13 of them say the competitor wins. That post counted the advantage flag on each row, which is one word of judgement per row. Flags are the cheap part of conceding. The expensive part is the paragraphs, and I had never measured those.

The field that cannot be left out

The content type for these pages is deliberately strict about it:

// server/src/lib/compare/types.ts /** * Second, `whereTheyWin` is not optional and is not a straw man. Notifio runs on * the user's own machine, which is a genuine disadvantage against a cloud * service if that machine is a laptop that gets closed at night. A comparison * page that hides that loses the reader the first time they think about it, and * pages that concede a real point outrank pages that do not. */ whereTheyWin: { heading: string; body: string[] }; whereWeWin: { heading: string; body: string[] }; 

Both are required. Both are an array of paragraphs rather than a single string, so neither can be one hedged sentence. And the template renders them in declaration order, which I confirmed by reading the headings out of the live HTML rather than the source:

$ curl -s https://notifio.app/compare/rentbird | grep -o '<h2[^>]*>[^<]*' Notifio and Rentbird, side by side What Rentbird costs Where Rentbird is the better buy Where Notifio is the better buy Common questions Other comparisons 

Structurally, then, the concession wins. It sits above the rebuttal on all five pages, which is the part a reader who stops scrolling actually gets. That was the design, and it holds.

The census

Every one of these pages is an entry in one array, so this is a parse of one file rather than a crawl:

m = re.search(key + r': \{\s*heading: "((?:[^"\\]|\\.)*)",\s*body: \[(.*?)\],\s*\},', block, re.S) paras = re.findall(r'"((?:[^"\\]|\\.)*)"', m.group(2)) words = sum(len(p.split()) for p in paras) 
Page Concession Rebuttal Ratio
/compare/rentbird 3 paragraphs, 184 words 3 paragraphs, 199 words 1.08
/compare/rentslam 3 paragraphs, 132 words 4 paragraphs, 215 words 1.63
/compare/stekkies 3 paragraphs, 106 words 4 paragraphs, 204 words 1.92
/compare/rentola 2 paragraphs, 89 words 3 paragraphs, 160 words 1.80
/compare/visualping 2 paragraphs, 87 words 4 paragraphs, 282 words 3.24
  • 598 words conceding, in 13 paragraphs
  • 1,060 words answering back, in 18 paragraphs
  • 1.77 overall, and five of five pages leaning the same way

There is no page where the concession is the longer section. I did not plan that, and I did not notice it until the numbers were in a column.

The spread is more interesting than the total

The two ends of that table are the two ends of the product's competitive situation, in reverse.

Rentbird is the closest thing to a direct competitor Notifio has: a Dutch rental alert service, same job, different delivery model. That page is the most balanced of the five at 1.08, 184 words against 199.

Visualping is the least comparable product on the list. It is a general website change monitor, so most of what it does has nothing to do with renting. That page is the least balanced at 3.24.

So the ratio tracks how comparable the rival is, not how threatening it is. And it tracks it for a fairly boring reason. The Visualping concession is one clean fact, stated in one sentence:

For anything that is not a rental search, it is the better tool and it is not close.

The rebuttal is an argument about metered check allowances, and check arithmetic takes paragraphs. A reader counting words cannot tell the difference between a long section and a weak case.

One detail I only saw because I was reading all five side by side. On four of the pages the rebuttal heading names us: "Where Notifio is the better buy", "Where Notifio is the right answer". On /compare/visualping it reads "Where the arithmetic breaks for rentals". The page where we spend three times the words is also the only one whose rebuttal heading makes a claim about their product instead of ours.

What a word count is not

It is not a fairness metric, and I do not want to pretend otherwise. A 280-word answer to a 90-word concession can be completely fair when the concession is one fact and the answer is four. Padding a concession to hit a ratio would make the page worse rather than more honest, and a test asserting theyWin.words >= weWin.words * 0.6 would be a test that rewards waffle.

What the measurement is good for is finding the page where the balance drifted without anybody deciding it should. That is what it found. Visualping has been on the list longest and has had the most edits, and it is the one that quietly grew a three-to-one section.

The part that is holding up on its own is the verdict paragraph every page carries above the table. All five are between 49 and 77 words, and all five open with the condition under which you should buy the other thing:

If your problem is that you cannot find enough listings at all, a portal with its own inventory is a different and possibly better answer than a monitor.

That is from /compare/rentola, and the sentence after it says Notifio cannot show you a property on a site you are not watching, "because it has no listings of its own and never will".

So the change I am making is not to the ratio. It is to put this count on the list of things I re-run whenever one of these pages is edited, next to the price-freshness check from our comparison pages tell the reader September and the crawler October. A required field guarantees a section exists. Nothing guarantees it stayed the size of its argument.

All five pages are at notifio.app/compare if you want to judge the balance yourself, and the product they are arguing about is at notifio.app/download.