
GEO is still analytics, and data discipline is the same. Clean pipelines. Validated metrics. Knowing your data better than your dashboard does.
I've spent the last four-ish months working in GEO (Generative Engine Optimisation), the art practice of tracking and improving how brands show up inside AI answers. Wanted to write this post to share some learnings on what actually stuck, in roughly the order it mattered to me
This is the one I'd put above everything else. GEO moves fast, and the tracking tools move with it. If you're working with Semrush, Peec AI, or PromptWatch, you've probably already noticed they change their reports and data schemas more often than you'd like (looking at you promptwatch). A column gets renamed and your data structure shifts.
When that happens, the worst outcome is probably silence, meaning your pipeline keeps running quietly wrong. So treat this like the analytics problem it is. Keep your ingestion code modular, and put a strict validation layer at the front of it (pandera, Pydantic, whatever you like) that defines the exact schema you expect: column names, types, the lot. The moment a provider sends you something that doesn't match, your pipeline should halt.
Consider mapping a strictly typed baseline layer directly to the provider's raw csv export (response text, model, region, visibility score, rank, cited URLs) and do all your cleaning in stages above it. That way raw files stay quarantined and never leak into your analytical logic.

That .csv you download is your starting point, it should never be your deliverable. The provider hands you a base schema, use it as the floor and build your own layer on top of it.
Most companies have in-house metrics/KPIs that only make sense to them, and that's an opportunity rather than a problem (as long as whatever you're adding is actually GEO-related). Marketing KPI’s are the obvious example.
Let’s imagine you work for a big global running shoe brand. Your team is running a big global PR push around how "green" your brand is, now… how can you tell if that message actually landing in AI narratives? You might be visible for "best running shoes" but still completely absent on sustainability-related-queries, which means the PR strategy hasn't reached AI yet.
That's a custom metric that you can tackle. It sounds fancy, but in practice it just means routing the AI response back through an API and getting another AI to score it against your own rubric. For the green brand, your rubric prompt (or system prompt) might be: "Score this response 0–5 on how much it emphasises the your_brand use of recycled materials. 0 = no mention of sustainability; 5 = sustainability is the primary focus." You parse the score and the rationale, append them as a new column (let’s call it sustainability_score, and that’s it, now you've got a dataset that measures the thing your strategy cares about. And makes you look cool as.
So, tl;dr. AI Response → Feed to another AI (your LLM judge) with clear instructions on how to score based on your in-house KPI/metric/checklist → New column with your newly, custom-made score
One warning tho, LLM judges are stochastic, so validate before you trust. Please. Run the same text through a few times to check the score is stable, and spot-check a sample against human judgement (this is honestly the hardest part, getting a few people in a room to spot check, do not skip this step). Once it's stable (you run them a couple of times and get the same-ish results), you can get genuinely specific like: scoring placement (is the brand in a heading, a bullet, or buried in the last paragraph?), tone, or even factual accuracy against your product.
Which raises the next question. How do you design the prompts that surface all this in the first place?

You can have a decent guess at what your persona/customer would actually type, Tomek Rudzki's (from peec.ai) research on prompt variation is worth a read here. (Keep in mind their bias, after all, they are a prompt-tracking company)
So, back to the running shoes green brand.
Let’s say your tracked prompt might be something like "is target_brand using recycled materials?" Is that the exact first thing a customer types into ChatGPT? Probably not. But it's a statistically valid instrument as long as it stays semantically close to the intent you care about, i.e. the whole neighbourhood of "is this brand green."
Where it gets more useful is mapping those prompts to the customer journey instead of dumping them in one bucket. Awareness prompts often capture broad fears or problems ("are target_brand running shoes worth it?"). Consideration prompts capture comparisons ("best running shoes for first time runners"). Purchase prompts capture high-intent logistics ("where can I find target_brand stores near me?"). Blend all three into a single average and you get a meaningless number.
A few caveats where prompts don't map cleanly onto real queries:
Mid-funnel queries are the most sensitive. This is the most contested ground, and it's quite volatile. Because AI retrieval runs on vector similarity, a tiny wording change moves the mathematical distance between your prompt and the indexed content. "Best pro running shoes" and "top running shoes for pros" can surface completely different sets of competitors. So track a variation of prompts for what you consider mid-funnel, not just one prompt phrasing.
Prompt style matters more than exact wording. An open-ended prompt ("tell me about sustainable running shoes") tends to produce a narrative that one or two market leaders monopolise. A list prompt ("list the top 5 sustainable running shoe brands") forces the model to widen its net, which surfaces more brands and lowers the barrier for challengers. Don't mix list and open-ended data in the same metric, you'll skew everything. That’s no bueno.
If you’re interested in reading more about prompt styles. > Did you know there’s a huge difference on how different age brackets use AI? How every generation uses AI, from boomers to Gen Z
Each engine handles variation differently! Which is a big enough deal that it gets its own section belooow

A fatal assumption in GEO is thinking that all AI engines work the same way. They don't (even google-owned AIs produce different query fanouts). When you submit a prompt, most of them don't just run one unique search, they decompose it into several background sub-queries (the "fanout"), run each one, and synthesise the answer from all of them. If you rank for the prompt but not for the sub-queries the model actually generated, you might still be invisible in the final answer (although less likely).
Peec ran a study on this in April 2026, analysing around 5 million fanouts, and the engine-by-engine behaviour analysis was quite interesting (their writeup is here):
Perplexity (~1.4 fanouts per prompt): basically just simplifies your query and runs it. Narrow and literal. The optimisation move is concise, factually dense content that directly answers the prompt.
ChatGPT (~2.1): stays close to your intent but quietly injects modifiers like "best," "reviews," and the current year (even when you never typed them) and it uses “Reciprocal Rank Fusion”, so content showing up across multiple sub-queries scores higher (SEO gurus rejoice). However, you can't win ChatGPT on your own domain alone. You need presence on third-party review sites, listicles, and forums like Reddit, because that's what it's reaching for in the background.
Grok (~6.8): runs what's basically a research brief, narrows by year, generates brand-versus-brand comparisons, and explicitly targets trusted domains (Reddit, Wirecutter, Consumer Reports). Again, winning here needs a broad, distributed footprint across the web.
Treat the absolute query numbers as directional (1.4 v 2.1 v 6.8), they shift with methodology and time window, and other studies frame it differently. The durable insight is the shape: Perplexity narrow, ChatGPT modifier-injecting, Grok expansive.
The takeaway here is the same point as the prompt-style caveat above, just sharper: never blend visibility across engines into one score. But, our visibility score is 99! . Doing that destroys the signal and hides exactly the “engine/model” specific weakness you most need to see. Again, avoid vanity metrics at all costs.
This part's personal. I've used both tools extensively, and on the surface they do the same job… you guessed it, they track prompts.
However, for the way I like to work, Peec is the better fit, so here's my honest opinion.
Where Peec wins (for me)
Data quality. Peec's raw export is cleaner. Fewer markdown issues, leaner data schema, fewer useless columns, and the columns it does have are clearly labelled. Overall I describe it as Lean, as you'd expect from German software. And let's be honest, you're analysing this stuff like a pro in Python, not squinting at a fancy dashboard, so the quality of that raw CSV really matters.
UI fidelity. There are two ways to hit an LLM. One is through the UI (ChatGPT/Claude/GrokX/Gemini app), which is what? something like 95% of users and very nearly all of your customers actually use. The other is through the API, for programmatic work. They give different answers to "what's the best brand for X," because the UI version runs proprietary system prompts, conversational memory, and sometimes a different underlying model entirely. So what you want to track is the UI, full stop. Peec does true DOM-level scraping, it drives a real browser session rather than calling an API. With PromptWatch I've occasionally found what look like API leftovers in the raw exports (the kind of artefacts you only get from API calls). That doesn't prove they're using the API, it could be their UI-simulation pipeline falling back, but it's noise you have to filter out, and it's there.
The API and developer experience. Peec's backend is just better engineered, predictable typed JSON, sane pagination and rate limits, clean docs. And it ships an MCP server, so I can wire it straight into Cursor or claude-code and pull live data in natural language instead of babysitting CSV exports. For anyone building custom pipelines, that's g-o-l-d. Have a looksie docs.peec.ai.
Where PromptWatch wins, in fairness: it covers more engines at the lower price tiers, Claude, Gemini, Grok and DeepSeek are in reach without Peec's per-model add-ons, which climb fast. It does crawler-log analysis (watching GPTBot, ClaudeBot and friends hit your site), and it tries to close the loop with content recommendations rather than just diagnosing. Peec is deliberately a measurement tool, it tells you where you stand, not what article to go write.
So, if you live in Python and care most about clean, UI-faithful data and a good API, Peec. If you want broader coverage and an execution layer bundled in, PromptWatch has a real case.
If there's a thread running through all five of these, it's that GEO is still analytics. The engines are new, the schemas keep moving, and the retrieval is probabilistic in a way Google's blue links never were, but the discipline underneath is the same as it's always been. Clean pipelines that fail loudly. Metrics you've actually validated. Knowing your data better than your dashboard does. Get that part right and the rest is a lot less stressful.