> ## Documentation Index
> Fetch the complete documentation index at: https://www.usenotra.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Sentiment

> The brand sentiment score rates how AI engines talk about your brand from 0 to 100, with themes and quotes pulled from saved answers.

Brand sentiment uses saved **single-turn answers in your prompt language** for the active organization, project and date range. It rates the tone AI engines take toward your brand, not the overall mood of an answer or customer satisfaction.

<img src="https://mintcdn.com/notra/JBIHUUfwvnmdFaPD/images/geo/sentiment-light.webp?fit=max&auto=format&n=JBIHUUfwvnmdFaPD&q=85&s=dadd8a942e6a416b65784e96e1139b4a" alt="Brand Sentiment tab on the GEO Overview page" className="block dark:hidden rounded-lg border" width="3840" height="2160" data-path="images/geo/sentiment-light.webp" />

<img src="https://mintcdn.com/notra/JBIHUUfwvnmdFaPD/images/geo/sentiment-dark.webp?fit=max&auto=format&n=JBIHUUfwvnmdFaPD&q=85&s=4ff43868624341256686cd4f234abc95" alt="Brand Sentiment tab on the GEO Overview page" className="hidden dark:block rounded-lg border" width="3840" height="2160" data-path="images/geo/sentiment-dark.webp" />

## How the score is calculated

The score is **(positive × 100 + neutral × 50) / classified mentions**.

All positive mentions score 100, all neutral mentions score 50 and all negative mentions score 0. Three positive, two neutral and one negative mention produce 66.7, displayed as **67 / 100**. The score is a descriptive rating rather than a percentage or a model confidence.

Only mentions labeled exactly positive, neutral or negative count toward the denominator. Notra excludes unknown labels and answers that do not mention your brand. When there are no classified mentions, the score is unavailable and shows as **—** instead of zero.

The `positiveShare` response field is still positive / classified mentions, which is 50% in the example above, so it is a separate number from the score.

### Time windows and weighting

* Daily buckets use UTC.
* Notra combines counts across engines first and then calculates the score, instead of averaging per-model scores.
* Days without classified mentions stay as gaps.
* The date picker includes its final day, because internally the window ends at the start of the following UTC day.
* Each saved answer has equal weight. Repeated manual scans count again, and partial results from unfinished scans may appear.

A change in the prompt mix, the engine mix or the judge can shift the distribution even when brand perception has not changed. The score is not NPS, a confidence score or a causal trend.

### Sentiment in answer details

Answer details show a compact sentiment label. Notra emphasizes an excerpt only when it is an exact, contiguous substring of the saved answer, so it leaves paraphrased or combined excerpts plain and keeps the original answer renderer as it is. Viewing sentiment reads existing labels without running new AI calls or reclassifying older answers.

## The brand sentiment tab

The **Brand Sentiment** dashboard tab is one compact dualtone card. The left side has the score and the current-period chart, and the right side has positive and negative themes and the sentiment distribution. On mobile, the chart and summary stack.

The summary shows **Current sentiment score**, its change from the previous period and a 0 to 100 scale with the score's position. Hover or focus the black marker to see the current score. The summary excludes unrated answers and answers without a brand mention.

Loading states use skeletons that keep the layout. Empty states tell apart three cases: no saved answers, no rated mentions and no supported themes.

### Claims table

Below the card, a Feedback-style table lists claims, and each row shows the claim with its theme underneath, the sentiment, the models and the count of distinct supporting answers. The table covers the analyzed evidence sample, not every response in the selected period.

Select a row to open that claim's original quotes, prompts, models and timestamps. On mobile, sentiment appears inside the claim cell and model details stay available in the sheet.

### Trend chart

The trend uses the Mention Activity chart, with monotone curves, a subtle current-period fill and a fixed 0 to 100 scale with gaps for missing ratings.

* Point markers appear on a rated day with no rated neighbor so that isolated observations stay visible, while contiguous series use a plain line.
* If the selected window ends with missing days, a dashed line extends the last observed score for up to three days. It uses the same linear-trend calculation as Mention Activity, needs at least three completed observed days and stays within 0 to 100.
* Gaps inside the window stay empty.
* Tooltips label these estimates separately, and the estimates do not affect scores, comparisons, mention counts or saved data.

### Period comparison

The shared dashboard date filter controls the chart, and the previous period covers the same number of UTC calendar days immediately before the selected inclusive window. Notra uses the previous period for the score comparison and does not plot it as a second line. Focus or hover the score comparison to see both full date windows.

The delta is in **score points** rather than a percent change, and it is unavailable when either period has no classified mentions.

Without an explicit window, the range defaults to 30 UTC calendar days including today, while explicit windows can span up to 366 days.

## Agent-extracted themes

Select **Find themes** in the themes empty state to extract themes from saved positive and negative answers.

* The action appears when analysis is missing or stale, and a usage notice shows before the paid action runs.
* Failed analysis offers a retry, but ready results have no persistent generation button.
* Configuration problems show the server's explanation.

### The model call

Theme extraction is a separate structured model call through the organization's existing model router, using `zai/glm-5.3-flash`, and the model has no browsing or other tools. Each attempted call, including one that fails output validation, uses one AI-answer quota unit or goes through the existing AI-credit billing path. The existing sentiment judge and its labels do not change.

### Sampling and validation

Sampling is deterministic, because Notra takes up to 12 checks per polarity ordered by a hash of the saved check ID. Each check contributes its first 2,000 answer characters and up to 500 prompt characters.

The model may return up to six themes, where each theme has one to four concrete claims and each claim has up to six evidence references. Every quote must be an exact contiguous substring of the supplied historical answer and must match the theme's saved polarity. Foreign IDs, paraphrased quotes, duplicate sources or mismatched polarities invalidate the result. Notra treats answers and brand metadata as untrusted data, never as instructions.

### Reading themes

Select a claim to see its saved quotes, engines, dates and prompts.

* **Recurring** means at least two distinct sampled checks support the claim.
* **Single source** means one check supports it.

These evidence counts do not measure prevalence across all answers, and they are not counts of independent users.

The classified-mention distribution uses all saved counts in scope rather than the theme sample. It never combines neutral with negative, and it rounds displayed percentages.

### Caching and refresh

Reading analysis never generates content or writes the cache, while an authorized POST mutation waits for the bounded extraction, with a 60-second model timeout and no automatic model retries.

Redis stores results for seven days, keyed by organization, resolved project, UTC window, model, brand name and a fingerprint of the historical input. The fingerprint includes the canonical project's `geo_settings.companyName`, which matches the scan and judge context, and not the name of the linked content brand identity. The fingerprint also covers all eligible answer content, including answers outside the bounded sample.

A finalized scan invalidates the client's analysis query. If the inputs changed, the next read marks the lookup stale and shows an analysis action, and the themes section offers **Find themes** again.

Completed dashboard scans start a separate background workflow for the last 30 days, which generates only when new eligible answers exist and no fresh result is available. A persisted atomic timestamp limits automatic attempts to one per project every 24 hours. This automatic run is always enabled, but manual analysis for other date windows still requires confirmation.

### States and concurrency

The UI handles ready, pending, stale, failed and unavailable states.

* A 180-second Redis lease blocks concurrent extraction for the same project and window, even if the inputs change.
* The worker checks ownership after the billing reservation and uses an atomic token check when publishing, so old results cannot overwrite another worker's result or appear under a newer input fingerprint.
* You can retry expired work.
* Analysis is unavailable when Redis, the provider configuration or a project brand name is missing.
* Migration `0088_geo_sentiment_attempt` adds the persisted attempt timestamp and removes the obsolete opt-in flag if present.
* Cached results are not permanent Postgres records, and while a refresh is pending, older results for the same window can stay visible, but Notra does not treat them as fresh.

### Limits

Notra validates quotes mechanically, but theme interpretation still depends on the model and the saved judge labels. A bounded sample can miss themes or repeat similar answers.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.