AI Visibility Email Report: What a Daily Email Should Say

An AI visibility email report should flag real change, not noise. Two runs 23 minutes apart moved one rival's index 11 points. What to send and what to cut.

· BugViso Team

13 min read

A daily AI visibility email report should confirm the run happened, give three headline numbers with their change, and say plainly whether anything moved beyond normal variation. Most days, the honest answer is "no". Between two of our runs 23 minutes apart, with nothing changed, one competitor's visibility index rose from 21.2 to 32.3 and it climbed two places. A daily email that reported that as news would be wrong every day.

By the end of this post you'll know how much daily numbers move by chance, which numbers belong in a daily email and which don't, how to word the verdict, and the email rules that keep a daily client message out of spam folders. A script drafts the email from two runs.

Data used: 35 unbranded buyer prompts × ChatGPT, Gemini, Perplexity and Claude × 2 runs on 2026-10-20 (280 answers, web search on), started 23 minutes apart, collected by BugViso's AI Visibility Tracker for bugviso.com against five anonymised competitors. Index and rank come from the tracker's scoring code; the run-to-run spread comes from 300 bootstrap resamples of the prompts in each run.

What a Daily Email Is For

A daily email is a heartbeat, not a report. It answers three questions in ten seconds: did today's run complete, where do we stand, and is there anything I need to look at? The monthly or weekly report does the analysis. The daily email only decides whether someone opens it today.

That framing rules out most of what a dashboard shows. Per-prompt wins and losses, per-engine moves and sentiment wobbles are all real data, but on a single day they're mostly noise, and a daily email that lists them trains the reader to ignore it.

How Much Daily Numbers Move by Chance

A single run's visibility index carries a spread of several points, and ranks in the middle of a leaderboard swap freely. Here are our two same-day runs, scored identically:

BrandIndex, run 1Index, run 2ChangeRank, run 1Rank, run 2
Competitor A38.840.0+1.211
Competitor B34.134.10.022
Competitor E32.033.5+1.543
Competitor D21.232.3+11.164
Competitor C33.930.7−3.235
Our brand26.525.6−0.956

Three of six brands changed rank in 23 minutes. Competitor D gained 11 points, mostly because ChatGPT named it in 4 answers in the second run and none in the first, which lifted its position and sentiment parts on that engine from zero. Nothing about its site, its sources or the engines had changed.

To size the spread properly, we resampled the 35 prompts of each run 300 times and recomputed every index:

BrandSpread of one run's index (1 standard deviation)Rank range (90% of resamples)
Competitor A3.5–3.9 pts1st–3rd
Competitor B3.2–3.7 pts1st–5th
Competitor C3.0–3.3 pts2nd–6th
Competitor D2.2–3.0 pts2nd–6th
Competitor E5.9–7.1 pts1st–6th
Our brand4.7–5.1 pts4th–6th

The two ranges are the two runs. A day-to-day change is the difference of two such runs, so its spread is about 1.4 times larger: roughly 4 to 10 points. With a 35-prompt set, daily index moves under about 10 points tell you nothing. Our guide on how often to track AI visibility shows how pooling runs shrinks that spread.

The Three Numbers That Belong in the Email

Index, rank and mention rate, each with its change and a verdict. These three are stable enough to read daily when you show their uncertainty, and together they say "where do we stand".

NumberWhy it's in the emailHow to show the change
Visibility index (0–100)The single headline score clients learn to followChange vs the previous daily run, tagged "normal range" or not
Rank among tracked brandsEasy to read, and what clients ask aboutToday's rank, yesterday's in brackets; no arrow emoji
Mention rateThe raw count behind the index: "named in 10 of 140 answers"Show the count, not just the percentage

The weekly and monthly reports carry the rest, as laid out in our AI visibility report template. Then one line of run health ("140 of 140 answers collected" or "Claude failed on 12 calls; today's numbers exclude them") and a link to the full report. Nothing attached: a link to a report that stays available for a set period is lighter, safer and always current.

Here's what that looks like, drafted by the script further down from our two runs:

text
Subject: BugViso AI visibility, run2: named in 7.1% of answers

Mention rate  7.1% (10 of 140 answers), -0.7 pts vs run1: within normal day-to-day variation
Rank          6 of 6 (was 6)
Biggest mover Competitor C -2.9 pts: within normal day-to-day variation

Nothing moved beyond normal variation today. No action needed.

The rank here is by mention rate, which didn't change. The index rank did move, from 5th to 6th. That's exactly the kind of shift a daily email should show calmly, with the verdict next to it.

What to Leave Out of a Daily Email

Anything that needs pooling to mean something belongs in the weekly report.

  • Prompts gained and lost. With one answer per prompt and engine, they flip constantly. Our week-over-week analysis found 9 such flips between two identical runs.
  • Per-engine changes. Each engine has a quarter of the day's answers, so its daily spread is about twice the headline's.
  • Competitor rank swaps in the middle of the table. In our resamples, four of six brands could land anywhere across four or more places.
  • Sentiment shifts. A few answers with a different tone move the average; it needs a week of answers.
  • Recommendations. The action plan doesn't change daily, and repeating it daily makes it wallpaper.

What does belong on a quiet day is the sentence "Nothing moved beyond normal variation today." It's the most useful line a daily email can carry, because it makes the rare "something moved" line credible.

Wording the Verdict

Say whether the change is beyond chance, in words, every time. Three phrasings cover almost every day:

  1. "Within normal day-to-day variation." The change is inside the noise band. No action.
  2. "Outside the usual range; worth a look." The change is larger than recent runs would explain. Link to the prompts behind it.
  3. "Not comparable: the prompt set changed." A new prompt version is a new instrument. Show today's numbers without a change.

Don't use colour or arrows alone to carry the verdict. Many clients read email on a phone in dark mode, and a red arrow on a 0.9-point dip says "bad news" when the words say "nothing happened".

Email Rules for Daily Client Reports

A daily message to a client's inbox has to meet bulk-sender standards, or it ends up in spam within weeks. Gmail's email sender guidelines set the bar for anyone sending regularly:

  1. One-click unsubscribe. Send List-Unsubscribe with List-Unsubscribe-Post: List-Unsubscribe=One-Click, as defined in RFC 8058. The header itself comes from RFC 2369.
  2. Make the unsubscribe link safe from scanners. Corporate mail filters open links. The link should open a confirmation page, and only the confirmation should unsubscribe.
  3. Include a plain-text part. Some clients and filters read it first.
  4. No tracking pixels in client reports. They add little to a daily heartbeat and cost trust.
  5. Put the date in the subject. Identical daily subjects get threaded into one long conversation, and yesterday's numbers hide today's.
  6. Authenticate the sending domain (SPF, DKIM, DMARC) and send links on that same domain.

For agencies, one more rule: send the daily email to the account team, and the weekly or monthly report to the client. Most clients don't want daily numbers, and the ones who do should get the verdict line first.

Draft the Email From Two Runs

This script reads an answers export, compares two runs, and prints a daily email: your mention rate with its change, your rank by mention rate, the competitor that moved most, and for each a Fisher exact test verdict. It ends with one line saying whether anything moved beyond chance. Standard library only.

python
#!/usr/bin/env python3
"""Draft a daily AI visibility email from two runs: mention rate and rank for your brand,
the biggest competitor move, and a plain verdict on whether anything moved beyond chance.

Usage: python3 daily_digest.py answers.csv --brand Acme --competitor Globex ... --before run1 --after run2
answers.csv columns: run, engine, answer, branded (1/0; branded rows are skipped).
"""
import argparse, csv, re
from math import comb

def fisher(a, b, c, d):
    """Two-sided Fisher exact p for [[a, b], [c, d]]."""
    n, r1, c1 = a + b + c + d, a + b, a + c
    pr = lambda x: comb(r1, x) * comb(n - r1, c1 - x) / comb(n, c1)
    p0 = pr(a)
    return min(1.0, sum(pr(x) for x in range(max(0, c1 - (n - r1)), min(r1, c1) + 1) if pr(x) <= p0 * (1 + 1e-9)))

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("csv"); ap.add_argument("--brand", required=True)
    ap.add_argument("--competitor", action="append", default=[])
    ap.add_argument("--before", required=True); ap.add_argument("--after", required=True)
    a = ap.parse_args()
    names = [a.brand, *a.competitor]
    rx = {n: re.compile(r"(?<![\w-])" + re.escape(n) + r"(?![\w-])", re.I) for n in names}
    hits = {run: {n: 0 for n in names} for run in (a.before, a.after)}
    total = {a.before: 0, a.after: 0}
    for r in csv.DictReader(open(a.csv, newline="", encoding="utf-8")):
        if r.get("branded") == "1" or r["run"] not in total:
            continue
        total[r["run"]] += 1
        for n in names:
            hits[r["run"]][n] += bool(rx[n].search(r["answer"]))
    rank = lambda run, n: 1 + sum(hits[run][m] > hits[run][n] for m in names)
    def move(n):
        k0, n0, k1, n1 = hits[a.before][n], total[a.before], hits[a.after][n], total[a.after]
        return k1 / n1 - k0 / n0, fisher(k0, n0 - k0, k1, n1 - k1)
    d, p = move(a.brand)
    k1, n1 = hits[a.after][a.brand], total[a.after]
    tag = lambda p: "a real change" if p < 0.05 else "within normal day-to-day variation"
    print(f"Subject: {a.brand} AI visibility, {a.after}: named in {100 * k1 / n1:.1f}% of answers\n")
    print(f"Mention rate  {100 * k1 / n1:.1f}% ({k1} of {n1} answers), {100 * d:+.1f} pts vs {a.before}: {tag(p)}")
    print(f"Rank          {rank(a.after, a.brand)} of {len(names)} (was {rank(a.before, a.brand)})")
    rival = max(a.competitor, key=lambda n: abs(move(n)[0]))
    rd, rp = move(rival)
    print(f"Biggest mover {rival} {100 * rd:+.1f} pts: {tag(rp)}")
    real = [n for n in names if move(n)[1] < 0.05]
    print("\n" + (f"Changed beyond chance: {', '.join(real)}. Open the report for the prompts behind it."
                  if real else "Nothing moved beyond normal variation today. No action needed."))

if __name__ == "__main__":
    main()
bash
python3 daily_digest.py answers.csv --brand BugViso \
  --competitor "Competitor A" --competitor "Competitor B" --competitor "Competitor C" \
  --competitor "Competitor D" --competitor "Competitor E" --before run1 --after run2

Label the run column with dates (2026-10-28, 2026-10-29) for real daily use. Fisher's test compares two single runs; for a steadier verdict, compare today with the pooled previous week.

How BugViso Sends the Daily AI Visibility Email Report

When a brand's daily run finishes, BugViso's AI Visibility Tracker freezes a daily report for that run and emails a short message to the brand's owner and up to five extra recipients you add in settings. The email carries three numbers (the visibility index with its change since the previous daily run on the same prompt set, the rank, and the mention rate) and a link to the full report; there's no attachment. Building it makes no extra model calls, and the linked daily reports stay available for 30 days.

Each message has a plain-text part, RFC 8058 one-click unsubscribe headers, no tracking pixels and the date in the subject. The unsubscribe link opens a confirmation page, so mail scanners can't unsubscribe anyone, and a recipient who unsubscribes can't be resubscribed by re-adding the address. Owners can turn the email off at any time. Daily runs, reports and sharing are described on the AI visibility tracker page.

Daily Email Mistakes That Lose Readers

Celebrating noise. "Up 11 points!" on a Tuesday, "down 9" on Wednesday. After a week, nobody believes either.

Sending the dashboard by email. Twenty numbers a day is a report nobody reads. Three numbers and a verdict get read.

Daily emails to clients by default. Daily is for the people doing the work. Clients get weekly or monthly, unless they ask.

Attachments. PDFs every day fill inboxes and go stale. Link to a report that stays available.

No verdict on quiet days. Silence about change looks like nobody checked. Say "nothing moved beyond normal variation" explicitly.

Frequently Asked Questions

What should a daily AI visibility report email include?

Three numbers (visibility index, rank and mention rate) with their change since the previous run, a one-line verdict on whether anything moved beyond normal variation, a run-health line, and a link to the full report. Leave prompt-level and engine-level changes for the weekly report.

How much does an AI visibility score change day to day?

More than most people expect. In our data, a single run's index had a spread of 2 to 7 points, and one competitor's index rose 11 points between two runs 23 minutes apart. With a 35-prompt set, daily moves under about 10 points are noise.

Should agencies send daily AI visibility emails to clients?

Usually not. Send daily emails to the account team and weekly or monthly reports to the client. Daily numbers swing enough to cause needless questions, and the weekly pooled view is what supports decisions.

How do I stop daily report emails going to spam?

Authenticate your domain (SPF, DKIM, DMARC), add one-click unsubscribe headers per RFC 8058, include a plain-text part, avoid tracking pixels and attachments, and put the date in the subject so messages don't thread together.

Why did my competitor jump in today's AI visibility report?

Most likely chance. Each run is a fresh sample of answers, and mid-table brands can swap several places between runs. Check whether the change is outside the normal range, and wait for the weekly pooled numbers before acting.

Make "Nothing Moved" the Usual Headline

A daily email earns its place by being right about when to look: three numbers, their change, and a plain verdict that says "within normal variation" most days. BugViso's AI visibility tracking sends that daily email after each run, with the full report one click away.

Written by

· BugViso Team

Kazi writes BugViso’s guides on website audits, Core Web Vitals, technical SEO, accessibility and AI search. The data in them comes from audits BugViso runs in a real Chromium browser, including our 219-site study of website health.

Found this useful? Share it.

Summarise with AI

Open this guide in your assistant.

Follow BugViso

New guides and audit data as we publish them.

See where your site stands

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