AI Brand Sentiment: How to Score What AI Engines Say About You

AI brand sentiment, measured on 446 real mentions: why scores cluster at 55, why being named first scores higher, how noisy one answer is, and a script.

· BugViso Team

15 min read

AI brand sentiment is a 0–100 score for how an AI answer portrays your brand: 50 when it merely lists you, above 60 when it recommends you, below 40 when it raises a concern. On 446 real brand mentions from ChatGPT, Gemini, Perplexity and Claude, every score fell between 30 and 89, and 55 alone made up 22 %.

That compressed range is the first thing to understand before you report sentiment to anyone. By the end of this post you'll know what moves the score (position in the answer, more than anything), how much one answer's score can be trusted, what the rare "concern" labels actually contained, and how to summarise your own scores with the script below.

Data used: 400 answers from BugViso's AI Visibility Tracker for bugviso.com: 50 buyer prompts × ChatGPT, Gemini, Perplexity and Claude × 2 runs on 2026-10-20, web search on. Every tracked brand named in an answer (ours plus five anonymised competitors, A–E) got a sentiment score from one language-model call per answer: 446 scored mentions, 284 of them on unbranded prompts.

How an AI Brand Sentiment Score Is Produced

Each answer goes to a second model with one job: rate how that answer portrays each tracked brand, and copy the sentence that justifies the rating. The scorer's instructions in our tracker are short:

Instruction to the scoring modelWhy it's there
Judge only what the answer itself saysStops the scorer bringing in its own opinion of the brand
50 is neutral or merely listedBeing named in a list isn't praise
Above 60 is clearly favourable, below 40 raises concernsLabels: positive (60+), neutral (41–59), concern (40 and under)
Copy the evidence word for word from the answerEvery score is checkable against the text

The evidence rule matters more than it looks. A quote is discarded unless the exact text appears in the answer, so a score can never be backed by a sentence the engine didn't write. In our data, the model's own label disagreed with the score thresholds on only 9 of 446 mentions, so the labels and numbers tell the same story.

Using a model as the judge has known weaknesses. The MT-Bench study of LLM judges documents position, verbosity and self-enhancement biases. Calibration text, verbatim evidence and averaging over many answers are how you keep those biases from turning into a trend line.

Why Most AI Brand Sentiment Scores Land Between 50 and 70

AI answers are written to be helpful and balanced, so they rarely praise or criticise hard. Across 446 mentions:

Score bandMentionsShare
30–39153.4 %
40–49306.7 %
50–5914332.1 %
60–6914332.1 %
70–799721.7 %
80–89184.0 %

The most common single score was 55 (100 mentions), which is the scorer's way of saying "listed, slightly positive". Labels split 263 positive, 160 neutral and 23 concern. Nothing scored below 30 or above 89.

Two consequences follow. First, a 5-point move is large on this scale, because most of the distribution sits inside a 20-point band. Second, "concern" is rare enough that each one is worth reading individually. It's not a percentage to chart.

Engines Describe Brands Differently

The four engines average within 4 points of each other, but they get there differently. Claude stays neutral, while Gemini swings both ways.

EngineMentions scoredMeanSpread (SD)PositiveNeutralConcern
ChatGPT7862.19.153232
Gemini14061.914.7804614
Perplexity8862.68.559281
Claude14058.79.071636

Gemini produced 14 of the 23 concerns and many of the highest scores. Claude labelled 45 % of its mentions neutral, the most of any engine. For our own brand, the per-engine means ranged from 58.2 on Claude to 71.4 on Gemini, a 13-point gap on the same questions.

That gap is mostly engine style, not a difference in how buyers would perceive you. Compare a brand's sentiment within one engine over time, or against competitors on the same engine. Don't rank engines as "liking" you more.

Being Named First Scores Higher Than Anything Else You Control

The clearest driver in our data was position: the first brand named averaged 64.4, the second 58.0, and later brands about 56.

Position in the answerMentionsMean sentiment
1st brand named24364.4
2nd11858.0
3rd5355.7
4th or later3256.0

The mechanism is simple. Engines lead with the option they recommend and describe it in more detail, then list alternatives with a line each. So sentiment and the position part of an AI visibility score move together. Raising one usually raises the other.

Buyer stage matters less. Shortlist ("consider") questions averaged 62.8, buying questions 60.8 and research ("learn") questions 57.2. Research answers explain a category and name brands as examples, which reads neutral.

Two Groups of Competitors, Separated by Price

On unbranded prompts the six brands split into two groups whose intervals don't overlap.

Brand (unbranded prompts)MentionsMean95 % interval
Competitor A7165.462.5–68.3
BugViso2165.361.8–68.6
Competitor E3663.359.0–67.5
Competitor D4163.059.6–66.1
Competitor C5255.052.3–57.6
Competitor B6354.952.3–57.5

Competitors B and C are the broad SEO suites in the set. The engines named them often but described them as expensive or as more than a small team needs. The concerns make that explicit. Of the 23 concern labels, 16 were about price or billing terms. Typical wording: "committing to a heavy, recurring monthly enterprise subscription … rarely makes financial sense", "scheduled white-label reports cost extra", "requires annual billing". Three were about output that's hard to act on ("designed to output raw data tables and spreadsheets"), and one was a capability caveat.

Our brand's 21 unbranded mentions put it level with the leader on tone. The interval is the widest in the table, though, so read it as "described well when named", not "best liked". How often you're named is a separate number. Ours was 7.5 % against the leader's 25.4 %.

What the Concern Labels Were Actually About

All three concerns about our brand came from one question, and none was about quality. The prompt asked whether BugViso can detect React hydration mismatches. Two ChatGPT answers began "I couldn't verify a product called BugViso", one adding that "the search results I found were for other tools". Claude wrote: "BugViso says it can, but I could only find vendor claims, not independent evidence."

That's a verifiability problem. The engines couldn't find the capability described anywhere they trusted, so they hedged. Google's guidance on AI features and your website says there are no special optimisations for its AI answers beyond normal SEO best practice, and the same logic held here: the fix is a crawlable page that states the capability, not a trick. Each kind of concern has a different fix:

Concern type (23 in our data)CountWhat fixes it
Price or billing terms16State plans, limits and billing in text on your pricing page; correct third-party pages that quote old prices
Hard-to-act-on output3Show the output (sample reports, screenshots with text) on a page engines can read
Capability caveat1A feature page that names the capability and how it works
Can't verify the product or claim3Documentation and independent mentions: reviews, comparisons, forum answers

High scores need reading too. One of Gemini's 78s described "dedicated high-volume enterprise and agency scale structures explicitly built for 300 to 10,000+ monthly site audits", which overstates what we sell. A positive score is not an accurate one. Pair sentiment with a fact check of the claims, as our AI brand accuracy audit does. Agencies reporting this to clients should set those expectations up front; see how to sell GEO services.

How Much One Answer's Sentiment Can Be Trusted

Not much on its own: the same prompt, engine and brand moved 5.9 points on average between two runs, and the label changed 31 % of the time. We compared 182 brand mentions that appeared in both runs:

Run-to-run change (182 repeated mentions)Result
Mean absolute change in score5.9 points
Median change5 points
Changed by 10 points or less159 (87 %)
Label changed (e.g. positive to neutral)57 (31 %)

So a single answer can flip from "positive" to "neutral" with no change in the world. Means over dozens of mentions are stable, but labels on one answer aren't. This is the same variability our study of AI answer consistency found for brand lists and citations. Report sentiment as a mean with an interval, over at least 30 mentions, and treat changes smaller than the interval as noise.

Summarise Your Own AI Brand Sentiment Scores

This standard-library script reads one row per brand mention (engine, brand, score, and optionally label, run, prompt and position). It prints each brand's mean with a 95 % bootstrap interval (resampling the mentions 2,000 times, so no normality assumption), flags brands with too few mentions to compare, shows the position effect, and measures your own run-to-run noise when the file has two runs.

python
#!/usr/bin/env python3
"""sentiment_report.py: read AI brand sentiment scores the way a careful analyst would.

Usage: python3 sentiment_report.py sentiment.csv [--brand "Your Brand"]

sentiment.csv: one row per brand mention, columns engine, brand, sentiment (0-100) and,
optionally, label (positive/neutral/concern), run, prompt_id, branded (0/1), position.
"""
import csv, random, statistics as st, sys
from collections import defaultdict


def label_of(score):
    return "positive" if score >= 60 else "concern" if score <= 40 else "neutral"


def boot_ci(xs, n=2000, seed=7):
    rng = random.Random(seed)
    means = sorted(st.mean(rng.choices(xs, k=len(xs))) for _ in range(n))
    return means[int(0.025 * n)], means[int(0.975 * n) - 1]


def main(path, focus=None):
    rows = [r for r in csv.DictReader(open(path, newline="")) if r.get("sentiment") not in (None, "")]
    for r in rows:
        r["s"] = float(r["sentiment"])
        r["lab"] = r.get("label") or label_of(r["s"])
    unb = [r for r in rows if r.get("branded", "0") in ("0", "", "false", "False")]
    print(f"{len(rows)} scored mentions ({len(unb)} on unbranded prompts)\n")
    print(f"{'brand':<16}{'n':>5}{'mean':>7}  {'95% CI':<13}{'concern':>8}")
    by_brand = defaultdict(list)
    for r in unb:
        by_brand[r["brand"]].append(r)
    for b, rs in sorted(by_brand.items(), key=lambda kv: -st.mean(x["s"] for x in kv[1])):
        xs = [x["s"] for x in rs]
        lo, hi = boot_ci(xs) if len(xs) > 1 else (xs[0], xs[0])
        flag = "  <- few mentions, don't compare" if len(xs) < 30 else ""
        print(f"{b:<16}{len(xs):>5}{st.mean(xs):>7.1f}  {lo:5.1f}-{hi:<6.1f}"
              f"{sum(x['lab'] == 'concern' for x in rs):>8}{flag}")
    if any(r.get("position") for r in rows):
        print("\nmean sentiment by mention position (all prompts):")
        pos = defaultdict(list)
        for r in rows:
            if r.get("position"):
                pos[min(int(r["position"]), 4)].append(r["s"])
        for p in sorted(pos):
            print(f"  {'4+' if p == 4 else p}: {st.mean(pos[p]):5.1f}  (n {len(pos[p])})")
    if all(r.get("run") and r.get("prompt_id") for r in rows):
        pair = defaultdict(dict)
        for r in rows:
            pair[(r["prompt_id"], r["engine"], r["brand"])][r["run"]] = r
        diffs, flips = [], 0
        for runs in pair.values():
            ks = sorted(runs)
            if len(ks) >= 2:
                a, b = runs[ks[0]], runs[ks[1]]
                diffs.append(abs(a["s"] - b["s"]))
                flips += a["lab"] != b["lab"]
        if diffs:
            print(f"\nrun-to-run noise on {len(diffs)} repeated brand/prompt/engine pairs: "
                  f"mean change {st.mean(diffs):.1f} points, label changed in {flips} ({100 * flips / len(diffs):.0f}%)")
    if focus:
        mine = [r for r in rows if r["brand"].lower() == focus.lower()]
        concerns = [r for r in mine if r["lab"] == "concern"]
        print(f"\n{focus}: {len(mine)} mentions, {len(concerns)} concerns")
        for r in concerns:
            print(f"  concern {r['s']:.0f} on {r['engine']}, prompt {r.get('prompt_id', '?')[:8]} -> read this answer")


if __name__ == "__main__":
    args = sys.argv[1:]
    if not args:
        sys.exit(__doc__)
    focus = args[args.index("--brand") + 1] if "--brand" in args else None
    main(args[0], focus)

The output on our 446 mentions, unedited:

text
$ python3 sentiment_report.py sentiment.csv --brand BugViso
446 scored mentions (284 on unbranded prompts)

brand               n   mean  95% CI        concern
Competitor A       71   65.4   62.5-68.3         4
BugViso            21   65.3   61.8-68.6         0  <- few mentions, don't compare
Competitor E       36   63.3   59.0-67.5         2
Competitor D       41   63.0   59.6-66.1         1
Competitor C       52   55.0   52.3-57.6         5
Competitor B       63   54.9   52.3-57.5         7

mean sentiment by mention position (all prompts):
  1:  64.4  (n 243)
  2:  58.0  (n 118)
  3:  55.7  (n 53)
  4+:  56.0  (n 32)

run-to-run noise on 182 repeated brand/prompt/engine pairs: mean change 5.9 points, label changed in 57 (31%)

BugViso: 141 mentions, 3 concerns
  concern 35 on chatgpt, prompt eed873e0 -> read this answer
  concern 42 on claude, prompt eed873e0 -> read this answer
  concern 35 on chatgpt, prompt eed873e0 -> read this answer

The last block is the useful one in practice: three concerns, one prompt ID. Read that answer, find the missing evidence, publish it.

How BugViso Tracks AI Brand Sentiment

The AI Visibility Tracker scores sentiment for every tracked brand in every answer, and shows the quote behind each score. It asks ChatGPT, Gemini, Perplexity, Claude and Google AI Overviews, all with web search on, your 50 buyer prompts against at least three competitors. Each answer that names a tracked brand gets one sentiment call with the calibration rules above.

You see sentiment per engine and per brand, the positive and concern quotes copied word for word from the answers, and a fact check of the claims made about your brand against your own site. Sentiment is the T part of the visibility index, weighted at 10 %, so a tone change can't outweigh a change in how often you're named. The reasoning behind that weight is in our AI visibility score breakdown. Setup and reports are on the AI visibility tracker page.

Mistakes When Reporting AI Brand Sentiment

  • Charting the share of "positive" answers. Labels flip on 31 % of repeated answers. Chart the mean over many mentions instead.
  • Comparing brands with 20 mentions. Our brand's interval was 7 points wide on 21 mentions. Flag anything under 30.
  • Ranking engines by how much they like you. Claude's neutral style and Gemini's wide swings are house styles, not opinions.
  • Treating high scores as good news. Read the top-scored quotes for overstated claims, then correct the sources.
  • Mixing branded and unbranded prompts. Branded answers describe you in detail because the buyer asked about you. Keep them separate.

Frequently Asked Questions

What is AI brand sentiment?

AI brand sentiment is a measure of how AI answers portray a brand, usually as a 0–100 score per mention where 50 means neutral or simply listed. It's scored by a language model that reads each answer, rates every tracked brand and quotes the sentence behind the rating. Averaged over many answers, it shows whether engines recommend you or hedge.

How do you measure sentiment in ChatGPT answers?

Collect ChatGPT's answers to a fixed set of buyer questions with web search on, then score each answer for every brand it names with calibrated rules (50 neutral, above 60 favourable, below 40 a concern) and a verbatim evidence quote. In our data ChatGPT averaged 62.1 across 78 brand mentions, with only 2 concerns.

Why is my AI sentiment score always around 55?

Because AI answers are balanced by design. In our data 22 % of all mentions scored exactly 55, and nothing scored below 30 or above 89. A 55 usually means "listed, mildly positive". Scores above 65 tend to come from being the recommended, first-named option.

Can I improve how AI engines describe my brand?

Yes, indirectly, by fixing the sources they read. Most concerns in our data were about pricing and billing terms, which a clear pricing page and corrected third-party listings address. Concerns about verifiability need documentation and independent mentions. Being named first lifted average sentiment by 6 points over second place.

How many answers do I need for a reliable sentiment score?

At least 30 mentions of the brand for a usable mean. Our brand's 21 unbranded mentions gave a 95 % interval nearly 7 points wide. Single answers aren't reliable: repeated answers changed by 5.9 points on average and switched label 31 % of the time.

Read the Quotes Before the Score

A sentiment number tells you where to look, and the quotes tell you what to fix. In our data the fixable problems were almost all specific: prices engines found or guessed, and claims they couldn't verify. Start with every concern quote and the five highest scores, then track the mean over time with BugViso's AI visibility tracking.

Found this useful? Share it.

See where your site stands

Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.