Your first finding before you publish anything.

Publish your blog.
See if AI is reading it.

Bueno serves your blog over an API and counts every fetch, from search crawlers and AI crawlers to the humans who arrived because an AI cited you. Then it tells you what to write next.

The chart

One stacked chart.
Five kinds of fetch.

A crawler is not a visit. Bueno keeps them apart, day by day, so the moment an AI answer starts sending you readers is a line you can actually point at.

Traffic segments · last 30 days

Sample data for illustration. Not Bueno’s own measured traffic.

Five segments

Every fetch, classified.

User-Agent first, then referrer. A hit is only ever “human” if it matches no known bot.

Search crawlers

Googlebot, Bingbot, Applebot, YandexBot. You're indexable.

AI crawlers

GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot, CCBot. You're being ingested.

The win condition

AI referrals

A human whose referrer is chatgpt.com, perplexity.ai, claude.ai, or gemini. An AI cited you and someone clicked.

Human

Everyone else: organic search, direct, internal, or a referring site.

Other bots

SEO suites (AhrefsBot, SemrushBot), link unfurlers, uptime monitors, HTTP clients.

“AhrefsBot is not a search engine.” It crawls for a rank tracker, not to index you for readers. Bueno keeps it out of your search-crawler count.

Server-side vs. a tag

GA4 can’t see this traffic.

A JavaScript tag

Can't see crawlers at all. GPTBot and Googlebot never execute the script.
AI referrals routinely land as "direct" because the assistants strip the referrer header before the click reaches your site.

Bueno, server-side

Reads every request off your own server, before any browser is involved. Crawler or human, it's counted.
Classifies off the actual User-Agent and Referer headers your backend received, not what survives a redirect chain.

One cited analysis put the “direct” misattribution rate for AI-referred visits at 70.6%. Neither failure mode is a config problem. They’re structural to a client-side tag.

Headless CMS

The mechanism
the measurement runs on

API-first: posts, categories, series, multi-locale content and assets, served over /api/v1/* to your own frontend. Replaces Sanity, and it’s free.

Posts, categories, and series
Multi-locale content, one post per locale
Assets, served from the same API
GET /api/v1/posts
Poststitle, body, slug, status
Categoriesnested, slug-addressable
Seriesordered post sets
Localesone post per locale
Assetsserved from the API
What to write next

Seven rules. Queries,
not model guesses.

Every opportunity is a deterministic query over your own posts and hits, with no LLM in the loop deciding what’s wrong.

ingestion_blind

Traffic is arriving but no crawler has ever been recorded.

Not how a live site behaves. Check the forwarder before trusting anything else on this page.

ai_crawlers_absent

Search engines crawl this site but no AI crawler ever has.

Usually a one-line robots.txt block on GPTBot, ClaudeBot or PerplexityBot.

not_discovered

Live for weeks and no search crawler has fetched it, while the rest of the site gets crawled fine.

Points at a per-page block. Check noindex and canonical tags first.

ingested_not_cited

AI crawlers fetched this repeatedly and it has never sent back a single reader.

It's being read, but it isn't answer-shaped. The flagship rule, walked through below.

orphan

No other post links to this one.

A crawler walking your site never arrives at a page with no inbound links, however often it's submitted.

never_submitted

This post has never been accepted by an indexing provider.

Nobody told the index it exists yet. Submit it from Settings → Indexing.

decaying

Visits fell hard against the prior window.

Something aged. A stale price, an old version, a dead link. Refresh, don't rewrite.

Worked example · ingested_not_cited
Find
AI crawlers read it 10+ times, zero citations back.
Propose
An answer-shaped rewrite. Proposing it is free.
Verify
Four mechanical checks against the draft. No model call.
Accept
Bueno writes the revision back to the post it already holds.
mcp.usebueno.com/mcp/<project>
getOpportunitiesfree
auditContentfree
getContentPerformancefree
updateContentpaid
publishContentpaid
MCP

15 GEO tools
for your coding agent

Point Claude Code or Cursor at your project’s MCP endpoint and it can read getOpportunities, pull the flagged post, rewrite it, and write it back, the same loop the dashboard runs, without you retyping anything between panels.

Read tools, free forever, no COGS to meter
Write tools such as publish, update, and submit, available on the paid plan
Same server/lib functions the dashboard calls
What you’ll see and when

Honest about the wait.

No 14-day trial. It would expire on the exact day the best findings start to fire. Free tier keeps 30 days of history; nothing about it is time-boxed.

T+0before publishing anything

A seed brief: ranked keywords, who owns the SERP, whether an AI Overview already exists. Keyed off your domain alone. Nothing to install yet.

T+minutesfirst hits land

ingestion_blind confirms the forwarder actually works, the moment traffic starts arriving.

T+1–7dcrawler cadence

ai_crawlers_absent fires if AI crawlers still haven't shown up, and the first real stacked chart takes shape.

T+10 AI crawlsenough to judge

ingested_not_cited, the flagship rule. Crawled enough times that citation silence stops being noise.

T+14dold enough to matter

not_discovered. A post this old with zero search-crawler hits, while the rest of the site is crawled, means something.

T+60da full prior window

decaying and the Trend column, once there's a comparable stretch behind it to measure against.

Setup

One fetch in middleware.

Your backend already renders the page for Googlebot, GPTBot, and the human. Forward what it saw and Bueno does the classifying.

// middleware.ts
export const config = { matcher: ["/blog/:path*"] }

export function middleware(req: NextRequest) {
  const send = fetch("https://usebueno.com/api/v1/hits", {
    method: "POST",
    headers: {
      authorization: `Bearer ${process.env.BUENO_INGEST_KEY}`,
      "content-type": "application/json",
    },
    body: JSON.stringify({
      path: req.nextUrl.pathname + req.nextUrl.search,
      ua: req.headers.get("user-agent") ?? "",
      referer: req.headers.get("referer") ?? undefined,
      country: req.headers.get("cf-ipcountry") ?? undefined,
    }),
  }).catch(() => {})

  ctx.waitUntil(send) // fire-and-forget, never blocks the page
  return NextResponse.next()
}

Free CMS.
Paid measurement, at scale.

The free tier is the trial. No countdown, no credit card to start.

Free

$0
Headless CMS + /api/v1/*
Hits ingestion + dashboard
30-day retention
MCP read tools
Get started

Paid

$29/mo
Up to 25k visits/mo
12-month retention
MCP write tools
300 credits/mo
Get started

Visits count humans and AI referrals only. Crawlers are never billed. Caps are per org, and projects are unlimited.

Publish it.
Then find out who’s reading.

Free CMS, free dashboard, no trial to run out of.