Recomma docs

Opportunities

The sites already trusted on your subject that say nothing about you.

The Actions page: a status bar over a rail of branches, with one ticket open beside its evidence.

Two different questions fill this queue, and it matters which one produced a ticket.

Where is the category being read without you? Sources tells you which sites the models lean on; this narrows it to the ones cited on your subject while saying nothing about you. Those are the cheapest ground you can take, because the hard part is already done — the model trusts the site.

What is wrong with the pages you already have? That question needs no rival and no gap. It is answered by reading your own site and holding each page to a fixed set of rules, and it has an answer on your first day, before a single chat has been sampled.

The first question can only be asked once somebody is ahead of you. A brand with plenty of citations and no visible rival gets nothing from it — correctly, and unhelpfully, if it were the only question being asked.

Earned and Owned

The rail lists this page twice, because the work divides cleanly in two and the two are done by different people:

  • Earned — somebody else’s site. A community you can take part in, or a publication you have to earn a mention in. The work is a pitch or a post.
  • Owned — a page you control, which splits again:
    • Site health — a page you already have that breaks a rule. The work is an edit, usually to a template.
    • New pages — a page you do not have yet. The work is writing it and shipping it.

Both open the same queue scoped to their half, so each is an address you can send to whoever does that kind of work. The unscoped page is still the whole list, and it is the one to read when deciding what to do first — ranking is computed across everything, and two lists each ranked against themselves cannot say which of the two matters more.

A rival’s own site appears on the unscoped list and on neither half: it is context, not work, because you cannot publish there.

How a gap is scored

A gap is a domain the chats cited without naming you in the same chat. There are two ways for one to qualify, and which applies depends on how visible you are overall.

If you appear in 15% of chats or more, a gap is a source that treats you worse than the web does:

gap strength = your overall visibility − that source's coverage of you

The subtraction is the important part. A source that already mentions you about as often as the web at large is not a gap, however often it is cited — you are already as present there as you are anywhere. What ranks is the source that is less friendly to you than your average, weighted by how much the models actually lean on it.

Below 15%, that subtraction cannot produce anything. Gap strength is at most your overall visibility, and a gap has to clear a floor of 15 points before it is worth a ticket — so a brand at 3% has no source that can qualify, whatever the data says. The test does not become strict; it becomes impossible.

So below the floor the question changes to the only one that can be answered:

gap strength = how much of that source's reach goes to somebody else

A source qualifies when it shaped at least three of your chats and named you no more often than you are named anywhere. That is not a claim that the source is singling you out — at 3% visibility, three chats naming somebody else is not a surprising event. It is a claim that the chats demonstrably look there and you are not present, which is what Get listed and Pitch editorial have always meant.

Tickets from the second mode say so, and quote your overall figure rather than a comparison they did not make.

Source type is part of the weighting: editorial coverage counts for substantially more than a corporate page, because it is harder to win and the models lean on it more.

Kinds of opportunity

Each one carries what sort of work it implies:

KindWhat it means
Owned pageYour own site, on a subject where it is not being cited
EditorialPress or a publication covering your category without you
ReferenceDocumentation or an encyclopaedic source
UGCA forum or community thread
CompetitorA rival’s own site — a positioning job, not a page to write
Site healthA page of yours that breaks one of the audit rules

The last is deliberately not actionable in the same way. It is listed because knowing that a model’s chat rests on a competitor’s own marketing is worth knowing, even though the action is not “go and edit their site”.

Filing by status

Every action is in one of four states, and the bar at the top of the page holds them apart.

TabWhat is in it
NewProposed, and nobody has answered yet
In progressYou pressed Todo — it is also on Impact
DoneFinished, and being re-measured
DeclinedYou said no

Counts are taken inside whichever scope the page is showing, so a number never sends you to a tab that looks full and renders empty.

Declined is a real tab, not a bin. A declined action is kept so it is not proposed again, and it can be restored from here — a decision made by accident should be reversible, and a decision made on purpose should be reviewable.

Site health: the audit

The Owned queue, split into Site health and New pages, with the audit tickets ranked by impact.

Press Run audit and Recomma reads your own pages — found through your sitemap, not through your citations, because the pages with problems are usually the ones nothing has quoted yet. A site with hundreds of pages in its sitemap typically has a handful that have ever been cited.

The same rules, and the crawl behind them, are readable without a ticket on Site — the state of your own site whether or not anybody has decided to act on it. A rule can fail there and carry no ticket here: a ticket is raised when a fault clears an impact bar, and a rule failing on a handful of pages may never clear it.

Each page is held to fifteen rules. Every rule is a fact about the markup that you can check by viewing source, and every one has a fix that fits in a diff:

RuleIt fires when
Canonical points at itselfThe canonical tag names a different address
Canonical declaredThere is no canonical tag at all
Content boundaryNeither main nor article marks the page’s own content
One H1The page has two or more
An H1The page has none
Heading orderA level is skipped — an H2 followed by an H4
Publish dateA post carries no time datetime and no datePublished
Last-updated dateSchema declares a publish date and never a modified one
Current year in the titleA comparison or best-of list whose title names a past year
Open Graph typeNo og:type tag
FAQ schemaThree or more question headings and no FAQPage block
Contents listA long, sectioned page with no in-page links
Alt textImages with no alt attribute
Quote attributionTwo or more blockquotes naming nobody
Content in the HTMLPlenty of markup, almost no prose — the page renders in JavaScript
AI crawlersA retrieval crawler is shut out in robots.txt

One ticket per rule, not per page. “Add alt text to the images that have none” is one job whether it touches one page or forty — and each ticket lists the pages it covers, with the markup on the page beside the markup to replace it with.

An audit ticket: a numbered checklist, the markup to change, and the list of pages it affects.

What the audit will not tell you

There is no rule for “move the author bio into an aside” and none for “improve the introduction”. Both are real advice and neither can be decided from a shape. A finding you cannot verify costs more trust than the finding is worth, so the list above is the whole of it.

Two things the rules are deliberately careful about:

  • Documentation is not dated writing. An API reference page is not stale for having no publish date, so it is never asked for one.
  • Blocking a training crawler is a decision, not a fault. Only the crawlers that fetch a page in order to answer a question count here. Keeping CCBot or Bytespider out costs you nothing in the engines this product measures. What your robots.txt says to each of them, agent by agent, is on Site.

Reading a partial audit

A crawl is a backlog, so a ticket can be a true statement about the pages read so far and not yet about the whole site. Every audit ticket says how much of it is based on, beside the page count. A number that did not say so would make a partial reading look like a complete one.

The same care applies inside a single page. Recomma reads up to 2MB of each one, and a page longer than that arrives as a fragment — so the rules that reason from absence decline to run on it. A rule that fires on something it saw (two H1s, a canonical pointing elsewhere, a skipped heading level) is telling the truth about a fragment as much as about a whole page. A rule that fires on something it did not see is not.

Working them

Each opportunity can be taken, moved along, or dismissed. Dismissing is a real decision and is kept, so it is not proposed again — the page should get shorter as you work, not repeat itself.

Once something is done, it moves to Impact, which watches the figure afterwards and reports whether it moved.

When there is nothing here

The two halves go empty for different reasons, which is why they are read separately.

Earned has three quite different causes, and the page says which:

  1. Nothing has been sampled yet — there are no chats to find gaps in.
  2. Nothing has been looked at yet — press Find gaps.
  3. Every cited source covers you — no source is covering the category without covering you.

In the third case the page still lists the three sources covering you least well. “Nothing to do” is where a page stops being worth opening; those three are the same numbers ranked the other way, and the first place you would lose ground.

A single branch can be empty while the others are not — a category the models never discuss on Reddit has nothing under Community, however visible you are. An empty branch says so in a word rather than explaining itself.

Site health goes empty for one reason: the pages read so far break none of the rules. The panel says how many that is.