The Knowledge Base dashboard

Every figure on the admin overview — which are actionable, which are scope, which month-over-month comparisons are honest, and which chart was removed because there is no data behind it.

8 min readUpdated 6 August 2026analytics, dashboard, reporting

/admin/faq, gated on access.faq, titled Knowledge Base. It is built as a console rather than a report: the two things worth doing sit at the top, and every tile links to the rows behind it.

Read this page before you copy any number off that screen into a report of your own. Several figures mean something narrower than their label suggests, and one former chart was removed because nothing in the product could produce it.

The two actionable figures

Everything else on the screen is context for these.

Unanswered questions, and the age of the oldest

How many reader-submitted questions are still PENDING, and how long the oldest one has been waiting — in days, hours or minutes.

The waiting time is the figure to watch. Nothing in this addon escalates, reminds or notifies about a stale queue; there is no cron job and no SLA alert. If that number is measured in weeks, no automated process will ever tell you again.

Beneath it, an answer queue meter splits every question ever submitted into unanswered, answered and rejected. The counts run over the whole table, so this cannot disagree with the Questions screen, which counts the same way.

Three unanswered questions against four thousand answered is 0.07% of the bar — a sub-pixel band that simply disappears. The unanswered band is widened rather than rounded away, because it is the one whose disappearance would be a lie. Read the number, not the width.

Answers below 50% helpful

Articles readers are voting down. The tile carries the true total across every rated article; the list beneath it shows only the eight weakest, worst first.

A tile reading 30 above a list of 8 is correct.

Each row shows the article's helpful share as a bar, the number of responses behind it, and its view count. Clicking a row opens that article in the editor.

Two thresholds govern the list, and neither is configurable:

Threshold Value Why
Minimum responses 3 One thumbs-down on a new article is 0% helpful and means nothing. Without the floor, this list would be topped by articles two people have read
Failing below 50% helpful Below 25% a row is flagged critical; between 25% and 50% it is work rather than a failure, and is coloured as such — so when the page does go red it still means something

Scope figures

True, useful for sizing, not things to act on.

  • Total articles and active articles.
  • Total views — the sum of every article's lifetime view counter. Stated as scope, with no trend behind it. See the warning below.
  • Answer helpfulness — every vote ever cast, split helpful and unhelpful, with the count of articles under the floor stated beside it.
  • Category distribution — article count per category.
  • Most viewed — the top five by lifetime views.

Search queries

The top ten queries of all time, each with how often it was run, the average number of results it returned, and a No results flag on any query averaging under one.

There is no window on this block and no control to add one. The query in admin/faq/analytics/index.get.ts groups the whole faq_searches table with no where clause and takes the ten largest counts, and nothing prunes that table — so a term that was searched a thousand times last year still sits at the top after you wrote the article that answers it, and a term readers are hammering this week may not appear at all. Read it as "what this library has been asked for since recording started", never as "what people are asking now".

The seven-day window some of this addon's other search figures carry belongs to the public route: /api/faq/stats filters faq_searches to the last seven days for the reader-facing What others are searching block. The two lists come from one table and will routinely disagree; neither is wrong.

The flagged rows are the most actionable thing on the page after the question queue. A query people run repeatedly that finds nothing is a missing article, named by the people who wanted it, in their own words.

Details of what is and is not recorded — including the four-character floor and why no identity is stored — are in How search behaves.

The feedback trend

Daily feedback counts, with a timeframe control on the chart itself. That control windows this chart only; the report takes no timeframe. It used to sit in the page header, where it read as a page-wide filter and replaced the entire dashboard with a spinner while re-fetching exactly the same data.

On Last 7 Days and Last 30 Days it drew a flat row of zeros however much feedback there was — the report sent each day as a full timestamp while the chart looked days up as plain dates, so nothing ever matched. On Current Year it drew one arbitrary day's votes per month in place of the month's total.

If you concluded from that chart that readers had stopped leaving feedback, look again. The chart was empty; your readers may not have been. The helpful and unhelpful percentages elsewhere on the page were always computed from the full feedback table and were never affected.

Month-over-month, and when it is honest

One comparison remains on the screen: feedback this calendar month against last, including across a year boundary, so January compares against the previous December.

When the previous month recorded nothing, no percentage is shown at all — the page says so in words rather than drawing a chip. A change from zero has no percentage, and reporting one is worse than reporting nothing.

When last month had nothing to divide by, the report returned a flat 100 and the tiles drew it as a confident green +100.0%. A first month of feedback, a quiet December, or a counter that had been reset all produced the same figure.

It was worse than occasional. The monthly rollup the comparison read was bounded to the current calendar year, and in January the previous month is last December — a key that rollup can never contain. The lookup missed, "previous" silently became zero, and the only trend on the dashboard reported +100.0% for all thirty-one days of every January, whatever December had actually done.

Discard any month-over-month FAQ figure you recorded from an older build for a January, and any figure taken from a month whose predecessor was quiet. The counts either side of the percentage were always real; only the percentage between them was invented.

A change of exactly zero is drawn as a reading. It used to be dropped, so a month that came out level with the one before printed the words "vs last month" with nothing in front of them.

The views chart is gone, and is not coming back

faqs.views is a lifetime counter on each article, incremented when the article is read. There is no event table, no timestamp, and therefore no way to know how many views happened on any given day.

The chart that used to sit here was titled FAQ Views Over Time — Last 30 Days. What it plotted was the sum of lifetime view counters grouped by the month each article was created, restricted to the current year. A five-year-old article contributed every view it has ever had to the month it was written, and contributed nothing once the year turned. In practice it drew a flat row of zeros in two of its three timeframes.

Both the chart and the growth chip that came from the same grouping have been removed. Total views is a real figure and is still stated, as scope. If you have been reporting FAQ view growth from this screen, stop — there is no honest way to draw that line and it is not returning in another shape.

Freshness and failure

The screen carries a last updated clock and a live indicator, because figures with no timestamp tell you nothing about whether you are looking at something read a second ago or an hour ago.

Refresh leaves the figures on screen while it re-reads them, rather than blanking a dashboard that is still perfectly true as of its own timestamp. If a refresh fails, the indicator turns amber and says the figures are stale.

If the report cannot be read at all, the page keeps its title and navigation and offers Retry plus direct links to the question queue and the article list. The dashboard body is deliberately not left mounted behind the notice: every tile would read 0 under a message saying the data could not be read, and a zero is a claim.

A weekly routine

  1. Clear the question queue, oldest first. Convert anything worth publishing into an article rather than answering it privately and moving on — see Reader questions and feedback.

  2. Open the failing answers list. For each, read that article's feedback comments before touching it: a low score with comments usually names the problem, and a low score without them usually means the article answers a different question than its title promises.

  3. Take the zero-result search queries and decide, for each, whether you have a content gap or a vocabulary mismatch. Search is substring-only, so the reader's phrasing has to appear literally in the article.

  4. Glance at the answer queue meter. A rejected share that keeps growing usually means the Ask a Question form is being used for something it was not meant for — support requests, most often — which is a routing problem, not a content one.

Everything else on the screen is scope. Check it monthly if you like; nothing on it changes what you should do tomorrow.