Chris EichlerAI-first Product
& Marketing

GEO Analysis Skill


What the skill measures

There are two questions, and only the second one is actually useful.

First: does your brand appear in AI answers at all? That is the diagnosis. For most small brands the answer is zero, and then you are stuck.

Second: which pages do the models cite in your category? That is the instruction. Once you know that YouTube, Wikipedia, and Reddit are the sources in your field, you know where you need to show up.

The skill answers both. Data comes through AIsa via its AI Optimization endpoint, which indexes mentions inside AI answers. The skill runs in Claude Code, Cursor, OpenClaw, Hermes, and anything else that reads SKILL.md folders.

Step 1: Install the skill

The skill is a folder holding a SKILL.md and a few Python files. Claude reads folders like this at startup and volunteers itself when a request matches. Nothing to configure, you only have to put it in the right place.

Download: geo-analyse-skill.zip · Source: github.com/e3xler/geo-analyser

Where the folder goes

ScopeFolderApplies to
Everywhere~/.claude/skills/all your projects
One project<project>/.claude/skills/this repo, teammates included

Start with the first one. The folder must be named geo-analyse or Claude will not find the skill.

Option A: zip

mkdir -p ~/.claude/skills
unzip ~/Downloads/geo-analyse-skill.zip -d ~/.claude/skills/

Option B: git

Better if you want to pull updates:

mkdir -p ~/.claude/skills
git clone https://github.com/e3xler/geo-analyser.git ~/.claude/skills/geo-analyse

Update later with git -C ~/.claude/skills/geo-analyse pull.

Verify it landed

ls ~/.claude/skills/geo-analyse/SKILL.md

If the path comes back, the skill is installed. Restart Claude Code afterwards, skills are read at session start. A running session will not pick up the new folder.

Using it

You do not call the skill with a command, you just say what you want:

Run a GEO analysis for Personio, domain personio.de, category HR software.

Claude matches the description in SKILL.md, reads the instructions, and runs the steps. If you prefer typing them yourself, the commands in step 4 work the same.

Other agents

The format is not Claude-Code-only. Cursor, OpenClaw, Hermes, Codex, and other runtimes read the same skill folders, just at a different path. Drop the folder wherever your environment looks for skills, the contents stay identical.

No agent needed either. The package includes app/scan.html. Double-click it, enter your key once, hit Scan. No Python, no terminal, no install. More on that at the end of this page.

Requirements

Python 3.10 or newer. Nothing else, no pip install. The client uses the standard library only, so it runs inside any agent session. Check with python3 --version.

Step 2: AIsa account and API key

The skill pulls its data through AIsa, so you need your own access. Takes two minutes.

Create an account

Use this link to AIsa and new accounts get 50 percent off their first top-up. Disclosure: I am an AIsa partner and the link is attributed to me. It costs you nothing extra, and if you would rather skip it, the rest of this guide works the same.

Then sign up in the AIsa Console. Three routes: email, Google, or GitHub. With email you verify the address first and set the password afterwards.

New accounts start with 2 US dollars in credit. That covers roughly twenty calls, enough for your first comparison runs. You only need to top up after that, which is exactly what the discount applies to.

Copy the key

Registration drops you straight onto the API Keys page, where a key has already been generated for you. Copy it right away and store it somewhere safe. It is tied to your billing, so it does not belong in client-side code, in a public repo, or in a chat.

An AIsa key starts with sk-aisa-.

Set a spending cap

This is the step most people skip, and it matters most. On the same page you can give every key a quota, a maximum amount that this specific key is allowed to spend.

That is not the same as your balance. Your balance is the pot, the quota is the brake on one key. Spending is always capped by whichever of the two is lower. If you use the key for an experiment or hand it to someone else, this keeps a runaway loop from burning your whole balance.

Five dollars is a sensible start. Around fifty calls, and you notice immediately if something goes sideways.

Top up when it runs out

Funding happens on the Wallet page in the console, by card via Stripe or by stablecoin. The same page shows what you have spent so far and how many requests are behind it.

Volume discounts start at fifty dollars, documented as five percent up to twenty percent at a thousand. For monitoring a handful of brands per week you will not need them.

Step 3: Store the key

Two lines, and the key never touches your shell history:

read -rs "AISA_API_KEY?AIsa key: " && export AISA_API_KEY
python3 ~/.claude/skills/geo-analyse/scripts/install_key.py

read -rs echoes nothing and the shell does not interpret special characters in the key. The second script writes a backup and stores the key in ~/.claude/settings.local.json with file mode 600.

Verify it landed:

python3 ~/.claude/skills/geo-analyse/scripts/doctor.py

The doctor describes the shape of your key without printing it, and tests both API surfaces separately.

Step 4: First run

python3 ~/.claude/skills/geo-analyse/scripts/geo_analyse.py \
  --brand "AI agent" --domain your-domain.com --out ~/geo-analyse

You get an HTML dashboard, the condensed metrics as JSON, and all four raw responses. Inside an agent session a sentence like "run a GEO analysis for my brand" works too, the skill is found through its description.

Compare mode

For the question of which category has any volume at all, there is a second entry point. It needs one API call per target instead of four:

python3 ~/.claude/skills/geo-analyse/scripts/compare.py \
  --own-domain your-domain.com \
  "AI agent" "AI agency" "AI consulting"

Domains and keywords can be mixed, detection is automatic.

What the measurement showed

Five categories, German market, measured on 4 August 2026:

CategoryMentionsAI search volume
KI Agent2,0071,319,940
Claude Code809458,510
KI Beratung13077,970
KI Agentur3022,020
AI Automatisierung179,190

Three things in there I did not know before.

YouTube is the most cited source in every single category. For "KI Agent" it accounts for 1,253 of 2,007 mentions, more than half. Wikipedia, Reddit, and GitHub follow. The models cite video and community, not company blogs.

"KI Agentur" and "AI Automatisierung" barely exist. 30 and 17 mentions. Positioning on those terms means positioning on an empty field. "KI Agent" is worth sixty times as much.

My own domain shows up in none of the five. That is uncomfortable, and exactly why I built this thing.

Common mistakes

Using your brand name as the target. Small brands return zero, which also leaves the domain and page lists empty. That is not a bug. I checked it against a control: "OpenAI" returns 50,926 mentions on identical settings, my own brand returns zero. Use your category as the target instead, at least then you see who owns the field.

Forgetting market and language. The defaults are Germany and German. For international brands you need --location "United States" --language English, otherwise you are measuring past your target market.

Passing brand and domain as targets together. The API intersects multiple targets, it does not add them up. "KI Agent" alone returns 2,007 hits, together with a third-party domain 290, together with my own domain zero. The skill handles this now: the brand defines the search space, the domain is only located inside the results.

What it costs

Billing is per call, roughly 0.10 US dollars. A single analysis is four calls, so about 0.40. A comparison across five categories cost me 0.50. Actual cost is printed after every run and shown as a tile in the dashboard, so you never have to take my number for it.

Rejected requests cost nothing. Experimenting is free, only a valid response gets billed.

Your starting credit covers the first twenty calls. When you top up after that, the discount from step 2 applies.

No terminal: the scan page

The package includes app/scan.html, a single file with no dependencies. Double-click it, enter your key once, then a brand and a category, and hit Scan. The key stays in your browser's localStorage and never sits in the file.

It shows the same data as the command line, but additionally sorts the cited domains by type (video, encyclopedia, community, review site, social, vendor) and derives concrete next steps from that: which source type owns your field, where you are missing, which terms are too small to position on, and where competitors show up inside your own brand query.

Two things so there are no surprises. The page works locally only. On a server or as a shared page, the browser's security policy blocks the API call. And never pass on a copy with your key filled in, it bills straight against your balance.

Ideas on AI-first Product Management & Marketing, straight to your inbox.

No spam, unsubscribe at any time

Chris Eichler