# Agent analytics Source: https://docs.fixaeo.com/agent-analytics See which AI crawlers visit your site and what they fetch. Agent analytics shows you the AI bots hitting your site, how often they come, and which pages they take. It's a traffic report for non-human visitors. FixAEO classifies every request against a catalog of known AI crawlers, browsing agents, agentic browsers, and MCP clients, then rolls the matches up per day. Open **Agent Analytics** in the sidebar — it opens on the **Crawl insights** tab. FixAEO Crawl insights page for Linear: an insight line naming GPTBot as leading with 40 hits (5.8% of traffic), then KPI tiles showing Total bot hits 694, Unique bots 87, and Active bots 13 ## Why can't normal analytics see this? Because GPTBot, ClaudeBot, and the other training crawlers don't run JavaScript. Tag-based tools record only visitors that execute a script, so those crawlers are invisible to them. That includes [Google Analytics](/integrations/google-analytics), which sees the humans AI sends you but never the bots. Reading requests at the server or edge is the only way to catch them. That's the split FixAEO uses: | Plan | How traffic is captured | | ------------------ | ------------------------------------------------ | | Free | Not available — the page shows an upgrade prompt | | Lite | JavaScript tag | | Growth, Enterprise | Server logs | It's one method per plan, on purpose. On Growth and Enterprise the tag's data is ignored, so a leftover tag can't double count against your server logs. ## What does it tell you? A KPI strip across the top: * **Total bot hits**, with a daily trend chart * **Unique bots**, counted as distinct hashed IPs * **Active bots** and **Engines seen** * **Failure rate**, the share of crawls that returned a 4xx or 5xx * **Top folder** and **Top page**, the paths bots fetch most Crawl insights KPI strip showing 694 total bot hits, 87 unique bots, 13 active bots, a 0.0% failure rate, /_next/ as the top folder with 127 hits, and / as the top page with 66 hits Below that the page splits in two, on tabs named **Overview** and **Detailed insights**. It opens on Overview. The KPI strip stays on both, because it frames either question. **Overview** holds: * **Bot hits over time**, with a Total or By bot toggle. Total folds every crawler into one line; By bot stacks the top ones. On ranges of 7 days or less you can switch to hourly buckets. * **Content** — two ranked lists side by side, by folder and by URL. * **Crawl breakdown** — by platform, by bot, and by type. A fourth card, by country, appears only when your source sends country data. The Cloudflare Worker and the WordPress plugin do; the others don't. * The **status-code panel**, which is what bots got served. **Detailed insights** holds the full crawled-pages table: every URL bots fetched, searchable, filterable by folder and status code, and paginated. Overview shows a short by-URL card, but the complete list lives here only. Switch tabs if you're hunting for a specific path. ## The crawler filter A filter bar pins itself below the header, above both tabs. It re-scopes every number on the page. Three menus, each single-select: * **Platforms** — the vendor behind the bot * **Bot types** — what the crawler is for: training crawler, browsing agent, agentic browser, or MCP client. Traffic the classifier can't place shows as Unknown * **Bots** — the named crawler They're single-select on purpose, because the three dimensions nest — a platform *is* a set of bots. Active choices show as chips you can dismiss. If a filter matches nothing in the range, the page says so and offers a Clear filter button. ## How far back does it go? Range tabs go out to 365 days, long enough to spot weekly crawl cycles, and open on 30. The charts refresh through the day, so the most recent hours fill in as they're classified. A **Settings** view sits next to Dashboard at the top of the page. It owns the provider list, adding another source, and the data wipe. The range tabs disappear there, since none of it is range-scoped. Beside Crawl insights, as the second tab of **Agent Analytics**, sits **Crawlability**, which answers the permission half of the question: which AI crawlers your `robots.txt` actually lets in, and whether your competitors let in ones you block. See [Crawlability](/crawlability). ## Installing the JavaScript tag On Lite, the page gives you one line to paste before ``: ```html theme={null} ``` Your site ID is in the tag URL shown under the snippet. The tag works on any host, with no CDN required. A built-in check fetches your homepage and reports whether the tag was found and whether it's firing. If you run a Content-Security-Policy, allow `https://api.fixaeo.com` in both `script-src` and `connect-src`. The tag needs both to load and to report. The tag catches agentic browsers, which do render pages, plus visitors arriving from an AI chat, spotted by referrer. It misses training crawlers unless your HTML is server-rendered with the tag already inlined. ## Connecting your server logs On Growth and Enterprise the setup card becomes a platform picker instead of a tag snippet. Pick your platform and it walks you through that one. All of them classify through the same catalog and land in the same dashboard. Every route except the file upload needs an API key, which you create in Settings. FixAEO gives you the Worker code with your site already filled in. Paste it into a Worker, add your API key as a secret, then add a route so it runs in front of your zone. It passes every request to your origin first, so it adds no latency. It forwards only AI-looking requests, not all traffic, and swallows its own errors so it can't break your site. Download the plugin as a `.zip` straight from the panel, upload it in WordPress, and paste your key. See [WordPress](/integrations/wordpress) for the full walkthrough. Paste the drain URL the panel gives you into **Team Settings → Drains → Add Drain**, pick Logs and Custom endpoint, then add an `Authorization: Bearer` header with your API key. FixAEO reads Vercel's own log format, so you don't host a translator. Drains need a Vercel Pro or Enterprise plan. Anything that can POST JSON works. Send `{site_id, channel, records[]}` to `/api/public/v1/agents/ingest`. Each record carries the user agent, path, referrer, IP, timestamp, status code, method, and country. Only the user agent is needed. Send them in batches — the [API reference](/api/introduction) has the exact shape and batch sizes. No edge layer at all? Drop an access log into the panel. FixAEO parses Combined Log Format, the Apache and Nginx default, and keeps only the AI-bot lines. No API key needed. Good for a one-off backfill or a nightly cron. The picker also lists AWS CloudFront, Google Cloud CDN, and Akamai DataStream. Those aren't one-click — you point their log pipeline at the same ingest endpoint yourself. Monthly allowances default to 100,000 events on Growth and 2,000,000 on Enterprise. See [Plans and limits](/plans-and-limits). IP addresses are hashed with a salt before storage and never kept raw. That hash is what "unique bots" counts, so read it as an estimate. ## Which bots does FixAEO track? Bots from the engines FixAEO scans are labeled with that engine. | Vendor | Bots | | ---------- | -------------------------------------------------------------------------------- | | OpenAI | GPTBot, OAI-SearchBot, ChatGPT-User, ChatGPT Atlas | | Anthropic | ClaudeBot, Claude-SearchBot, Claude-Web, Claude-User, Claude-Code, Anthropic MCP | | Perplexity | PerplexityBot, Perplexity-User, Comet | | Google | Google-Extended, GoogleOther, Gemini-Deep-Research, Google-CloudVertexBot | | Microsoft | Bingbot | | xAI | GrokBot, Grok-DeepSearch, xAI-Grok | | DeepSeek | DeepSeekBot | A second set is recognized but carries no engine label, because FixAEO doesn't scan those engines. That covers Meta, ByteDance, Amazon, Apple, Common Crawl, Cohere, Allen Institute, Mistral, DuckDuckGo, You.com, Diffbot, Webz.io, Timpi, Huawei, Kagi, and QuillBot. AI Overviews and AI Mode never appear as engine labels here — no crawler identifies itself as either one. Google's bots all count under Gemini, and Bingbot counts under Copilot, because that's the index each one feeds. Every bot also lands in one of four types: training crawler, browsing agent, agentic browser, or MCP client. Crawl traffic tells you what the engines read. [Sources](/sources) tells you what they showed a user, and [Citations](/citations) tells you who got the credit. Running WordPress? The [WordPress plugin](/integrations/wordpress) captures these hits inside PHP, so a full-page cache is the only thing that can hide them. # Agents Source: https://docs.fixaeo.com/agents Build AI agents that do marketing work over your own FixAEO data, and review every result before anything is used. Agents let you build a repeatable job that reads your own FixAEO data, does a piece of marketing work, and hands you a draft to review. Where the [AI Marketer](/ai-marketer) chat answers one question at a time, an agent runs a fixed set of steps end to end. You'll also see agents called **workflows** in a few places — they're the same thing. They live at the **Agents** entry in the sidebar, under the Action group. The page opens on a tab rail: **Overview**, **All Agents**, **Templates**, **Skills**, **Scheduled**, **Resources**, and **Automation**. Two buttons sit in the header: **New folder** and **New Agent**. **Agents are in beta.** Review AI-generated work before you use it. Nothing is published to your site, sent to a person, or written anywhere external on its own — every result stops for you to approve or reject first. Treat what an agent produces as a draft to check, not an answer to trust unattended. ## Two ways to build **Describe it in plain language.** On the Overview tab there's a **What do you want to build?** box. Type what you want the agent to do, and optionally attach up to three source files to work from — plain text, Markdown, CSV, TSV, JSON, HTML, or XML. FixAEO proposes a step-by-step plan, which you can look over and then **Approve & run**. This AI builder is rolling out gradually, so some accounts won't see it yet — if yours doesn't, use the visual builder. **Build it visually.** **New Agent** opens a canvas. You add steps from a side panel, place them, and connect each one to its next step. This builder is always available. The plain-language box has three controls that shape how the agent is built: Chooses which AI model does the work. The default **Auto** uses the best available model; you can pin a specific one instead. The exact models depend on your account. **Auto policy** lets the agent make its own calls as it builds; **Guided policy** asks you before key choices. How hard the model works on a step — **Low**, **Medium**, **High**, or **Max** — plus a **Thinking** toggle. More effort is slower; less is quicker. ## The step library In the visual builder, the side panel groups the steps you can add: * **Research** and **Generate with AI** — investigate a topic, then draft or create the result. * **Capture web page** and **Knowledge base** — pull in a page's content, or draw on approved source material you've set up. * **Your FixAEO data** — **FixAEO citation pages**, **FixAEO brand health**, **FixAEO tracked prompts**, **FixAEO competitors**, and **Past outcome signals**, so the work is grounded in your real numbers. * **Brand kit** and **Audience** — keep the output on-brand and aimed at the right reader. * **Condition** and **Repeat for each item** — branch on a test, or run a step over a list. * **Call an API**, **Send to Slack**, **Create Google Doc**, and **Create WordPress draft** — deliver the result to another tool. * **Human approval** — pause the run for a person to approve, edit, or reject before it continues. You name each step, map its inputs to earlier outputs, and connect the flow. Set the reusable pieces up once on the [Resources](/agents/resources) tab and attach them where you need them. ## Test, save, publish Validates the flow without touching anything external. Writes to Slack, a doc, or an API are skipped, and you get a **Test passed** result with how many steps are ready. Keeps your work in progress. Drafts don't run on their own. Turns the current draft into the version future runs use. Publishing never runs the agent and never contacts anything external — it only marks the version. Every publish is kept in **History**. You can compare the current draft against an earlier version to see what changed, and **Load as draft** to pick one up and edit from there. Runs keep using the version they started with, so editing later never rewrites work that already happened. ## All Agents and folders The **All Agents** tab is your library. Search it, filter by **Location**, **Status**, **Type**, or **Creator**, and favorite the ones you use most. On any agent you can rename, duplicate, archive and restore, or delete it, and organize everything into **folders**. You can also move agents between accounts. **Export** writes a JSON file of the agent's steps only — it leaves out run history, credentials, schedules, and connected accounts. **Import** reads one of those files back in as a new draft, up to 2 MB. ## Run history and what needs attention The **Overview** tab surfaces a **Review or fix N agent runs** panel when something needs you. It lists up to five runs that failed or are waiting on a decision, shown as **Approval is waiting**. Click one to open the run, review the output and the evidence behind it, and act. Every agent also keeps its own past-run history you can search and reopen. ## Sharing Share an agent with a teammate as an **Editor**, who can change, publish, and run it, or a **Viewer**, who can read and follow along only. The owner controls access. See [Team and workspaces](/team-and-workspaces) for how members and roles work. ## Limits and credits Running an agent needs an active paid plan. You can still build, organize, and save without one — when you try to start a run, FixAEO tells you plainly: *"An active paid plan is required to start a workflow. Your saved results remain available."* Across manual, scheduled, and automated runs together, each account can start up to **20 runs per rolling day** and keep **3 runs active at once**. Agent runs draw on the same AI Marketer work credits as the chat, so a heavier task uses more than a light one. See [Plans and limits](/plans-and-limits) and [Usage](/usage) for your allowance and remaining balance. ## Related Ready-made agents and guided recipes you can start from. Reusable instructions you write once and attach to any agent. Run a published agent on a schedule, a webhook, or a bulk list. Reusable building blocks, and the approval flow that gates every run. The conversational sibling that answers one question at a time. Which plans can run agents, and the credit allowance for each. # Scheduling and automation Source: https://docs.fixaeo.com/agents/automation Set a published agent to run on its own, and watch every run on a dated timeline. Building and saving agents is broadly available. *Running* one is the paid part, and running one on its own is what this page covers. Two tabs handle it: the **Automation** tab, where you set an agent to run on a schedule, from a webhook, or across a batch of rows, and the **Scheduled** tab, where every run those settings produce shows up on a dated timeline. Agents are Beta and review-gated. Automation does not change that. Nothing is published to your site, emailed, or sent to any outside service without a person approving it first, and any step that would reach out stops for approval before it runs. Treat what an agent produces as a draft to review, not an answer to trust unattended. ## What can run on its own Only a **published custom agent** can be automated. A recipe or a draft can't. Publish the agent first, then it appears in the Automation picker. (Agents are also called "workflows" in a few places in the app; they're the same thing.) Automation always uses the **fixed published version**. If you edit the draft later, a live schedule or webhook keeps running the version you published until you publish again. That's deliberate, so a half-finished edit can't quietly change a job that's already running. ## The Automation tab Pick a published agent, then set up one of three ways to run it. Each run keeps its own record, whichever way it started. Run once or on a repeating cadence: **Doesn't repeat**, **Hourly**, **Daily**, **Weekdays**, **Weekend**, **Weekly**, **Monthly**, or **Annually**, at a time in **your local timezone**. You can pass optional inputs for the run. After it's saved, each schedule shows its next run and its latest result, and you can edit it, pause and resume it, or delete it. Pausing stops future runs; runs already started aren't cancelled and past results stay available. Give another product a **secret URL** it can call to start the agent. Name the trigger, create it, and copy the URL then — it's shown **once**, at creation, and never again. Repeat calls can carry an idempotency key, so if the same call arrives twice the agent doesn't start the run twice. Each trigger lists when it was last used and links to its last run, and you can revoke it whenever you like. Revoking takes effect immediately; saved runs remain. Run the agent once per row across many rows at once. Give the batch a name, then supply the rows one of three ways: upload a **CSV** (up to 8 MB and 10,000 rows), connect a **Google Sheet** by link, or paste a **JSON** array. The first row of a CSV or sheet must match the agent's input names. A connected sheet has to allow anyone with the link to view it, and **FixAEO never edits the sheet** — it only reads it. The batch then shows row-by-row progress with a status per row and a link into each run. A webhook URL is shown once, at the moment you create it. Copy it then and store it somewhere safe. If you lose it, there's no way to see it again — you revoke the old trigger and create a new one. ## The Scheduled tab The Scheduled tab is the dated timeline of runs your automations produce. It shows the runs coming up over roughly the next 30 days and the last 90 days of past ones, grouped into **Past**, **Today**, **Tomorrow**, **This Week**, **Upcoming 30 Days**, and **Later**. Each run carries a status: * **Scheduled** — set to run and waiting for its time. * **Running** — in progress now. * **Awaiting review** — paused at a review step for a person to approve or reject. * **Succeeded** — finished. * **Failed** — the run didn't complete. * **Missed** — its time passed without the service starting it (for example, it was offline). Missed runs aren't backfilled. * **Cancelled** — you cancelled it before it ran. From a run you can open it to see its output and evidence. You can **cancel a single upcoming run** without touching the rest of the schedule, or **remove the whole schedule** so no future run happens. Removing a schedule leaves any run already started alone, and every past result stays available. ## The weekly brand-health report The Scheduled tab also manages a simpler, built-in schedule: a **weekly brand-health report** that compares this week to last and saves the result in the app. It's the one automation you don't have to build — start it with **New weekly report**. A few things set it apart from a custom agent's schedule: * It's **weekly only**, on a day and time you pick. * Its time is in **UTC**, so the schedule stays put across daylight-saving changes. (Custom-agent schedules use your local timezone instead.) * Every result is **saved in the app**. Nothing is emailed or published. * You can save up to **20 weekly report schedules** per account. Paused ones still count toward that. You can pause, resume, edit, or remove a weekly report the same way as any schedule. ## What you need to run Enabling or running any automation needs an **active paid plan**. Without one, FixAEO tells you plainly: *"An active paid plan is required to start a workflow. Your saved results remain available."* You can still **pause** a schedule without a paid plan — pausing never starts a run. A few limits apply to every account, and they cover manual, scheduled, and automated runs together: * Up to **20 runs per rolling day**. * Up to **3 runs active at once**. Automated runs draw on your AI Marketer work credits, the same pool the chat and manual runs use — see [Plans and limits](/plans-and-limits) and [Usage](/usage) for the allowance and your remaining balance. If an agent is shared with you, changing its automation needs **editor** access; a viewer can follow the runs but not change the schedule. ## Related Build, test, and publish an agent — the step before you can automate it. The approval flow that every run pauses at before anything goes out. Ready-made agents to start from, including the weekly brand-health report. Which plans can run agents, and the run and schedule caps. The credits automated runs draw on, and your remaining balance. The conversational sibling that drafts work for you to review. # Resources and review Source: https://docs.fixaeo.com/agents/resources The building blocks agents reuse, and the human approval step that gates every run. Agents is a **Beta** feature, and it's built to keep a person in the loop. Nothing an agent produces gets published or sent anywhere until you look at it and approve it. This page covers the two parts of that promise: the **Resources** tab, where you set up the building blocks agents reuse, and the **review and approval** flow, where a person decides before a run continues. Agents are also called workflows in a few places in the app. They're the same thing. ## The Resources tab Open the **Resources** tab from the Agents page. The idea, in the app's own words: > Set these up once, then attach them to agent steps. Credentials are encrypted and never shown again. There are four kinds of resource. **Connections** let an agent call an external service: a **Slack webhook**, an **Outgoing webhook**, an **API**, or **Google Docs**. Each one is listed with its kind and its status, and you can remove it. A connection is the only way an agent reaches outside FixAEO, and every use of one still stops for your approval first (more on that below). **Knowledge bases** are the approved facts an agent is allowed to draw on: product facts, documentation, and internal source material. You give a knowledge base a name and a short note on what belongs in it, then add documents — each one a title plus the source text you paste in. This is how you keep an agent grounded in what's true about your product instead of whatever it guesses. **Brand kits** keep the writing on-brand. A brand kit holds your writing voice, your approved claims (one per line), and the claims to avoid (one per line). Attach it so every draft sounds like you and stays inside what you're willing to say. **Audiences** describe who the content is for: a name, a description of who they are, their goals, and their pain points. An agent writing for a named audience aims the work instead of writing for no one. A credential you save into a connection is encrypted and shown only once. Save it somewhere safe when you create it — FixAEO can't display it again, and you'd have to recreate the connection to replace it. ## Review and approval Every agent run reaches a point where it pauses and waits for a person. You can approve it, edit what it proposes, or reject it. Until you do, nothing moves forward. There are two shapes to this, depending on what you're running. **Custom agents stop at an approval checkpoint.** When a run hits a **Human review** step, it pauses and shows you **Approve this checkpoint**. You see the proposed output, and you can edit it inline before you decide. You can add a review note (up to 2,000 characters) to say why, then choose **Approve** or **Reject**. Approving continues the run with the values you see; rejecting stops it. Any external action listed there is approved one time only. **Built-in recipe runs pause at Review before generation.** Instead of a raw output, a recipe shows you the plan before it writes anything. Depending on the recipe you either edit the brief the draft will be built from, or choose which recommendations to apply and edit each proposed change. Then you pick **Approve and generate** or **Reject**. The app is blunt about the limit of this step: approval doesn't verify facts or publish anything. Review the finished work too. Approval is not the same as publishing. Approving a checkpoint lets the run keep going; it doesn't push anything live. AI-generated work should be read before you use it anywhere. ## External actions always stop first When a step would send something out of FixAEO — post a Slack message, make an API call, or create a Google Doc — the approval screen shows an amber box headed **This approval will send externally**. It lists exactly what will go out and where. You're approving that specific send, this one time. It does not pre-authorize the same action on a future run; the next run stops and asks again. ## Who can decide Not everyone who can watch a run can approve it. The decision belongs to the agent's **owner**, an **editor** collaborator, or an **assigned reviewer**. Anyone else can follow the run and see what's proposed, but they can't approve or reject it — the app tells them the assigned reviewer, an editor, or the owner has to make the call. Roles come from how the agent is shared; see [Team and workspaces](/team-and-workspaces). Anything waiting on a person shows up on the Agents **Overview** tab, under **Review or fix N agent runs**, marked **Approval is waiting**. That panel is the fastest way to find runs that are stuck on you. Approving a recipe run needs an active paid plan and a configured provider — the app will say so if either is missing. The checkpoint approval on a custom agent is gated by your role or assignment, not by your plan. See [Plans and limits](/plans-and-limits). ## Related Build an agent from plain language or on the visual canvas. Reusable instructions you attach to any agent's AI steps. Ready-made agents and recipes you can start from. Run agents on a schedule, from a webhook, or in bulk. The conversational sibling that drafts work from your data. How credentials are encrypted and who can see your data. # Skills Source: https://docs.fixaeo.com/agents/skills Reusable, named instructions you write once and attach to any agent. A skill is a named instruction you write once and reuse. Instead of re-typing "keep the tone plain" or "never invent a source" into every agent, you save that behaviour as a skill and attach it. Every AI step in an agent then follows it. Skills live on the **Skills** tab of the [Agents](/agents) area, at `/app/workflows`. Agents are also called workflows in a few places in the app; they're the same thing. Agents are in **Beta** and review-gated. A skill only shapes how an agent writes. It never publishes, sends, or approves anything on its own. AI-generated work still waits for your review before you use it. ## The four built-in skills FixAEO ships four skills out of the box. They carry a **Built in** badge: * **Humanizer** — makes generated writing feel natural and specific instead of robotic. * **Improved Copywriting** — sharpens clarity and persuasion without adding claims the evidence doesn't support. * **Match Brand Voice** — keeps wording aligned with your connected brand context. * **Citation Guard** — keeps factual claims traceable to the sources the agent was given. You can't edit, archive, or delete a built-in skill. To make one your own, **Duplicate** it. The copy is a normal custom skill you can change freely. ## Create your own Click **New skill** and fill in four things: A short label, up to 80 characters. This is what you'll pick from the list later. One of **Writing**, **Brand**, **Evidence**, **Quality**, or **Custom**. Category only helps you filter the list. A "when to use it" line, up to 500 characters. It helps you and your teammates choose the right skill later. What the skill should actually do, up to 12,000 characters. Be concrete about tone, evidence, claims, and output. A focused instruction is easier to reuse than a sprawling one. Use **Preview instructions** to see how the skill will read to the agent before you save it. Keep each skill to one job. A "plain, human tone" skill and a "never invent a statistic" skill are easier to mix and match than one skill that tries to do both. ## Manage your skills The Skills tab has category chips and a **Search skills** box so you can find a skill by name, description, or instruction text. Each custom skill has an actions menu: * **Duplicate** — make an editable copy of any skill, built-in or custom. * **Archive skill** — hide a skill you're not using without losing it. **Restore skill** brings it back. Archived skills sit behind the **Archived** filter. * **Delete skill** — a permanent removal. You type the skill's name to confirm. It's removed from current agent drafts, but published agent versions and past runs keep their own frozen copies. ### Version history Every time you save a change, FixAEO records a new immutable version. Open **History** on a skill to see each version with its date and instructions; the latest is marked **Current**. Older versions are kept, not overwritten, so you can always see what an earlier run followed. ## Attach a skill to an agent Open an agent in the builder and use the **Skills** button (labelled **Skills** in the toolbar, with a count when some are attached). This opens **Skills for this workflow**, where you: * Choose up to **10** skills. * Set the order they run in — skills apply top to bottom on every AI step. * Remove ones you no longer want. Only the agent's owner can change its attached skills. Editors and viewers can see them. See [Agents](/agents) for how sharing and roles work. You can also switch individual skills off before a manual run, without changing the saved setup. ### Save an assistant reply as a skill When an agent or the [AI Marketer](/ai-marketer) writes something you'd want to reuse as an instruction, use **Save as skill** on that reply. The response becomes the new skill's instructions, so you don't have to re-write it by hand. Pick a name and category, and it lands in your Skills library ready to attach. ## Skills freeze at run time Editing a skill later never rewrites the past. A run keeps the exact version of every skill it used, and a published agent version keeps the versions it was published with. So: * Changing a skill does **not** change results you've already produced. * To make a change take effect in an agent, publish a new version of that agent so it picks up the current skill versions. This is what keeps your history honest — you can always trace what any past result was told to do. Skills are also readable through FixAEO's read-only public API, so you can review them outside the app. Building, organizing, and saving skills is broadly available. **Running** an agent needs an active paid plan — including any run that uses your skills. Your saved work stays available either way. See [Plans and limits](/plans-and-limits). ## Related Build an agent, then attach your skills to its AI steps. Ready-made agents to start from instead of a blank canvas. Run a published agent on a schedule, a webhook, or in bulk. Brand kits, knowledge bases, and the approval checkpoints your runs pause at. The conversational sibling — and where "Save as skill" often starts. What's free, what needs a paid plan, and the run limits. # Templates Source: https://docs.fixaeo.com/agents/templates Start an agent from a ready-made recipe or a prebuilt template instead of a blank canvas. The **Templates** tab in the Agents area is a gallery of ready-made agents you can start from. Instead of building a job step by step, you pick one that already does close to what you want, then adjust it. Templates are part of the Agents area, which is **Beta**. Everything an agent produces is a draft that waits for your review, and nothing is published to your site, sent, or written anywhere external on its own. Browsing this gallery runs nothing at all. Building, browsing, and saving are broadly available. **Running** an agent needs an active paid plan. When you try to start one without a plan, FixAEO says so: *"An active paid plan is required to start a workflow. Your saved results remain available."* See [Plans and limits](/plans-and-limits). ## Two kinds of template The gallery holds two things. Both open with a **Use template** button, but they lead to different places. ### Guided recipes Five guided recipes are live today. Each one is a fixed set of steps FixAEO wrote for a common job: * **Get content recommendations** — you have a published page and want to know what to improve. It returns a source-linked assessment and a prioritized list of edits. * **Refresh an existing page** — turn reviewed recommendations into a new draft. You get a before-and-after edit list plus a refreshed draft. * **Create a brief and first draft** — you're starting a new article and have research sources to use. It produces an editable brief, then a sourced draft. * **Improve an under-cited page** — let FixAEO pick one of your owned pages that needs citation help, then show its evidence and recommended fixes. * **Track weekly brand health** — a repeatable week-over-week visibility and citation report, saved as a comparison of two complete weeks of captured answers. On a recipe, **Use template** opens a short run setup form: pick the brand and fill in a few inputs, such as a page URL or a topic. You can also choose **View workflow** first to preview the steps before you commit to a run. ### Prebuilt agent templates Alongside the recipes, FixAEO offers prebuilt multi-step **agent templates** — ready-made starting points across the same categories. On one of these, **Use template** drops a copy into the visual builder so you can rename steps, change inputs, and edit the flow before you publish and run it. Think of a recipe as run-it-now and an agent template as edit-then-run. The agent-template gallery is rolling out gradually, so some accounts see only the five guided recipes for now. New templates appear here as they're published. ## Browsing the gallery Everything sits in one grid, with a few ways to narrow it down. * **Category chips** across the top: **All**, **Featured**, and the categories that have templates — Content optimization, Content creation, Research, Report, and Outreach. The **Featured** row highlights a few. A category with nothing in it doesn't show. * **Search templates** — a search box that filters by name, description, and tags as you type. * **Template details** — selecting any card opens a details dialog with the **Creator**, the **Category**, and a short **Workflow** summary, so you can read what a template does before you use it. Built-in templates are made by FixAEO; the details dialog names the creator for each one. Opening a card or reading its details never starts a run. ## Using a template Filter by category, search by keyword, or scan the Featured row. Open a card to read its details. On a guided recipe, choose **View workflow** to see the steps, or **Use template** to open the run setup form. On a prebuilt agent template, **Use template** opens the visual builder with an editable copy. Fill in the run inputs (recipe) or adjust the steps and publish (agent template). Running needs a paid plan. A recipe run pauses for you to check the plan before it generates, and every agent stops at a review step before its output is used. You approve, edit, or reject. See [Resources and review](/agents/resources). A template is a starting point, not a finished answer. Read the evidence an agent cites and review its output before you act on it. Nothing leaves FixAEO or goes live without your approval. ## Submit a template You can share one of your own saved agents with the community gallery. Use **Submit a template**, pick a custom agent you've saved, choose a category, and write a short public description. FixAEO reviews the submission before it can appear publicly. What's submitted is a snapshot of the agent's steps — your credentials, run data, and private resource contents are never included. Later edits to your agent don't change a submission you've already sent. Want to build from nothing instead? The [Agents](/agents) page covers the visual builder and the plain-language builder, where you describe the job and FixAEO proposes the steps. ## Related Build an agent from scratch, visually or by describing it in plain language. Reusable instructions you attach to an agent so it works the way you want. Run a template on a schedule, from a webhook, or across a batch of rows. The building blocks agents draw on, and the approval step before anything is used. Which plans can run agents, and the caps on runs. The chat assistant that answers from your data and drafts work to review. # AI Marketer Source: https://docs.fixaeo.com/ai-marketer A chat assistant that reads your FixAEO data, plus agents that draft the work for you to review. The AI Marketer is a chat assistant that reads your live FixAEO data and answers in plain language. Ask it how your visibility is trending, which competitors keep showing up, which prompts have the weakest coverage, or what to fix on a page. It answers from your own numbers, not from a general model's guess. On a paid plan, the AI Marketer is your app home. It's the screen you land on after signing in. You can also reach it from the **AI Marketer** entry at the top of the sidebar, from the mobile nav, or from the command palette (Cmd/Ctrl+K). There's a public overview at [fixaeo.com/ai-marketer](https://fixaeo.com/ai-marketer). ## The chat Conversations are multi-turn and saved. You can rename a chat, archive it, restore it later, and stop a turn while it's still running. The assistant works from the same read-only data tools as the [MCP server](/mcp/introduction), but inside FixAEO. It can read the actual answer text an engine returned, and it can scrape a cited page to check what's really on it. When it makes a claim, it can show you where the claim came from. A few controls sit around each turn: * **Attach context.** Paste or add material you want this turn to work from. * **Pick its tools.** Choose which of its data tools it's allowed to use for a turn, so you can keep an answer narrow. * **Get a deliverable.** Some turns produce a downloadable file, such as a brief or a draft. You can preview it before you download it. ## Agents The second sidebar entry, **Agents**, opens the agent builder at `/app/workflows/`. Where the chat answers one question at a time, an agent runs a fixed set of steps end to end. You can build one by describing it in plain language or on a visual canvas, start from a ready-made template, save reusable skills and resources, and schedule or automate runs. Agents have their own section in these docs: Build, test, publish, and run agents over your own data. Ready-made recipes and prebuilt agents to start from. Reusable instructions you attach to any agent. Run agents on a schedule, by webhook, or in bulk. The chat and its drafts are grounded in numbers you can verify elsewhere in FixAEO. Letting an agent run steps on its own is newer, so treat what an agent produces as a draft to review, not an answer to trust unattended. Read the evidence it cites before you act on it. ## Nothing goes live on its own Every result is a draft. It waits at a review step for a person to approve or reject it. FixAEO does not publish to your site, send email, or write to your CMS on its own. When an agent finishes, you get the output and the evidence behind it, and the next move is yours. This is a deliberate boundary, not a missing feature. The work is done for you; the decision stays with you. ## Who can use it The AI Marketer and agents are on paid plans. The Free plan doesn't include them. If you try to use them there, FixAEO points you to upgrade, and access is enforced on the server, not just hidden in the interface. The work runs on **credits**. Each plan includes a monthly allowance: Lite includes 100, Growth includes 400, and Enterprise is custom. Credits meter the measured cost of the AI work, so a heavier task costs more than a light one. Your remaining balance for the cycle shows in **Settings → Usage**. On a team, AI Marketer credits are a single shared pool for the whole workspace. The Usage page attributes spend back to each member so you can see where it's going. Don't confuse the AI Marketer and Agents with the **Agent Analytics** area (Crawl insights and Crawlability). Those read your server logs to show which AI crawlers fetched which pages. They're about crawler traffic, not about generating or reviewing marketing work. See [Agent analytics](/agent-analytics). ## Related The same read-only data tools, pointed at your own ChatGPT, Claude, or Cursor. Which plans include the AI Marketer, and the credit allowance for each. The checklist of recommendations you work through and mark off. A different feature: what AI crawlers fetched, read from your server logs. # Alerts Source: https://docs.fixaeo.com/alerts Get told when a tracked brand moves, without checking the dashboard. Alerts watch your scan results and message you when something crosses a line you set. An alert is a rule on your account. After every scan writes a new daily snapshot, FixAEO checks your active rules against it. Any rule that trips records an event and sends it to the channels you picked: email, Slack, or your own webhook. FixAEO Alerts page: clicking New alert opens a dialog with three template chips — Citation drop, Negative sentiment, and New competitor — that pre-fill the rule form with a name, brand, kind and threshold ## When are alerts checked? Only right after a scan, so a rule can't fire on a day your brand wasn't scanned. Alerts therefore need a plan with scheduled scans. Cadence by plan is on [Plans and limits](/plans-and-limits). Each check compares your newest numbers against where the brand stood at the start of the past week. A brand on its very first scan has nothing to compare against yet, so change-based rules start working once there's a few days of history. ## What can trigger an alert? Five rule types, picked from the **Kind** dropdown when you create a rule. | Rule | Fires when | Default | | --------------------------------- | ------------------------------------------------------------------------------------------------------------- | ---------- | | Visibility Score dropped | Your [Visibility Score](/metrics/visibility-score) falls by at least the threshold against the baseline | 20 points | | Visibility Score rose | Your Visibility Score climbs by at least the threshold | 10 points | | Negative sentiment count exceeded | Negative mentions in the latest snapshot reach the threshold count | 3 mentions | | New competitor appeared | A brand shows up in your ranking that wasn't there before, and holds at least a minimum share of all mentions | 1% share | | A competitor surged | A named competitor's share of voice climbs by at least the threshold | 15 points | Thresholds for drop, rise, and surge are percentage points, not percent change. A move from 40% to 30% is a 10-point drop. FixAEO Alerts page listing five active rules — competitor share surges 3 points delivering to email and webhook, new competitor enters the ranking, negative sentiment spike, visibility rises 10 points, and visibility drops 10 points To watch one named rival rather than the whole ranking, [Industry benchmarks](/industry) is the better surface — it ranks every brand in your category side by side. ## Creating a rule Click **New alert** on the Alerts page. Three template chips prefill a sensible rule: Citation drop, Negative sentiment, and New competitor. Then set the rest. The name travels with every fired event, so make it readable. The threshold field changes with the kind. Percentage points for drop, rise, and surge. A plain count for sentiment. How long the rule stays quiet after it fires. Between 1 and 168 hours, 24 by default. This is what keeps one bad week from filling your inbox. Email is on by default. Paste a Slack webhook URL, a generic webhook URL, or both. To change a threshold later, delete the rule and create it again. ## How are alerts delivered? **Email** goes to your account address. One message per fired event, with a one-line summary and a link back to the app. These alert emails are switched on and off on the rule itself, right here in the delivery step. They are separate from the account-wide email categories in [Settings → Notifications](/email-notifications). Turning a category off there won't quiet a rule — switch its email delivery off on the rule instead. **Slack** uses an incoming webhook. Create one in your Slack admin and paste the `https://hooks.slack.com/services/...` URL into the rule. **Webhook** posts JSON to any URL you control. The body carries `event_id`, `rule_id`, `rule_name`, `rule_kind`, `fired_at`, a `summary` string, and the full `payload` with the before and after numbers. A rule can also carry a signing secret. Set one and every request gains an `X-Fixaeo-Signature` header holding `sha256=` plus an HMAC-SHA256 of the body, so you can verify the sender. A failure on one channel doesn't stop the others, and the record of which channels delivered travels with the event. ## Where do fired alerts go? The Alerts page shows your 10 most recent fires in a side panel, with a badge for each channel that delivered. Your full history lives in **Inbox**, where you can filter by type and by brand, mark items read, and page back through older events. Deleting a rule stops it firing immediately. Past events stay in the Inbox, so your history stays intact. ## What should you set up first? One drop rule per brand at 20 points, on email. That's the alert that tells you something broke. Add a sentiment rule if reviews move fast in your category, and a new-competitor rule if it's crowded. See [Tracking competitors](/competitors) for the pinning side of that. When an alert fires, [Improve](/improve) is usually the next stop. It reads the same scan data and turns the drop into work you can ship. # Agent dashboard Source: https://docs.fixaeo.com/api-reference/public-api/agent-dashboard /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/agents Agent dashboard (bearer-authed) # Citation aggregation Source: https://docs.fixaeo.com/api-reference/public-api/citation-aggregation /api-reference/public-openapi.json get /api/public/v1/citations Citation aggregation (bearer-authed) # Comprehensive industry metrics Source: https://docs.fixaeo.com/api-reference/public-api/comprehensive-industry-metrics /api-reference/public-openapi.json get /api/public/v1/industry/metrics Comprehensive industry metrics (bearer-authed) # Crawled-pages list / crawler logs Source: https://docs.fixaeo.com/api-reference/public-api/crawled-pages-list-crawler-logs /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/agents/pages The complete per-URL list of URLs AI bots fetched — the public twin of GET /api/v1/me/brands/{slug}/agents/pages. EVERY crawled URL is included: static assets (`/_next/...`, images, CSS) and crawler-directive files (`/robots.txt`, `/llms.txt`) are reported alongside content pages, because what a crawler spends its budget on is the point of the report. Paginated, searchable, and filterable by status (`ok`, `error`, or one exact code such as `404`), bot, vendor, kind, and folder. Crawler filters are served from the (path x bot) rollup, which starts at the raw-hit retention horizon and grows from there — see retention_limited / coverage_from. # Daily snapshot series Source: https://docs.fixaeo.com/api-reference/public-api/daily-snapshot-series /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/snapshots Daily snapshot series (bearer-authed) # Gap analysis Source: https://docs.fixaeo.com/api-reference/public-api/gap-analysis /api-reference/public-openapi.json get /api/public/v1/industry/gap Gap analysis — sources citing competitors but not you (bearer-authed) # Get a brand Source: https://docs.fixaeo.com/api-reference/public-api/get-a-brand /api-reference/public-openapi.json get /api/public/v1/brands/{slug} Get a brand (bearer-authed) # Ingest a Vercel Drain delivery Source: https://docs.fixaeo.com/api-reference/public-api/ingest-a-vercel-drain-delivery /api-reference/public-openapi.json post /api/public/v1/agents/ingest/vercel Receives a Vercel Drain (formerly "Log Drain") delivery in VERCEL'S OWN format, so a Vercel-hosted customer needs no code: they paste this URL into a drain and add one `Authorization: Bearer ` custom header. We translate, classify the User-Agent through the same catalog the JS beacon uses, and store recognised AI-crawler requests with `channel=vercel`. Accepts both delivery encodings — a JSON array or NDJSON — sniffed from the body rather than from Content-Type, which Vercel does not guarantee; gzip is detected by magic bytes. Records without a `proxy` object (build output, function stdout, and the sample events Vercel posts when the drain is created) are counted as skipped, not errors. DELIBERATELY FORGIVING: a delivery we cannot parse, or one we fail to persist, still returns 200. Vercel publishes no retry policy and flags a drain (emailing the customer that the endpoint is broken) past 80% failed deliveries. Only a bad token, a foreign site_id, a signature mismatch or a spent quota return a non-2xx. Requires the Growth plan or higher and is metered against the same monthly server-log event cap as `/agents/ingest`. # Ingest server-log AI-crawler hits Source: https://docs.fixaeo.com/api-reference/public-api/ingest-server-log-ai-crawler-hits /api-reference/public-openapi.json post /api/public/v1/agents/ingest Server-log ingestion for Agent Analytics. The customer's edge — a Cloudflare Worker, a generic CDN webhook, or a CSV log upload — forwards a batch of raw request records. Each User-Agent is classified with the same engine catalog the JS beacon uses and written to the same Agents dashboard, so server-side crawlers (GPTBot, ClaudeBot, etc.) that never execute JavaScript are captured. Paid plans only. The batch's site_id must belong to the authenticated account. Max 2000 records per batch; larger batches return 413. # List brands Source: https://docs.fixaeo.com/api-reference/public-api/list-brands /api-reference/public-openapi.json get /api/public/v1/brands List brands (bearer-authed) # List monitored prompts Source: https://docs.fixaeo.com/api-reference/public-api/list-monitored-prompts /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/prompts List monitored prompts (bearer-authed) # Per-brand attribution Source: https://docs.fixaeo.com/api-reference/public-api/per-brand-attribution /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/attribution Per-brand attribution (bearer-authed) # Per-brand organic search performance Source: https://docs.fixaeo.com/api-reference/public-api/per-brand-organic-search-performance /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/search-performance Per-brand organic search performance (bearer-authed) # Per-competitor citation domains Source: https://docs.fixaeo.com/api-reference/public-api/per-competitor-citation-domains /api-reference/public-openapi.json get /api/public/v1/industry/competitors/{name}/citations Per-competitor citation domains (bearer-authed) # Per-competitor prompt drilldown Source: https://docs.fixaeo.com/api-reference/public-api/per-competitor-prompt-drilldown /api-reference/public-openapi.json get /api/public/v1/industry/competitors/{name}/prompts Per-competitor prompt drilldown (bearer-authed) # Per-engine performance Source: https://docs.fixaeo.com/api-reference/public-api/per-engine-performance /api-reference/public-openapi.json get /api/public/v1/model Per-engine performance (bearer-authed) # Portfolio rollup Source: https://docs.fixaeo.com/api-reference/public-api/portfolio-rollup /api-reference/public-openapi.json get /api/public/v1/portfolio Portfolio rollup (bearer-authed) # Query fanouts Source: https://docs.fixaeo.com/api-reference/public-api/query-fanouts /api-reference/public-openapi.json get /api/public/v1/citations/fanouts Bearer-authed twin of `/api/v1/me/citations/fanouts`. Returns the LLM-decomposed sub-questions per (tracked prompt x engine) for the calling key's workspace. `truncated_groups` is true when the response hit the group cap — narrow the range to see the remainder. # Recent mentions Source: https://docs.fixaeo.com/api-reference/public-api/recent-mentions /api-reference/public-openapi.json get /api/public/v1/brands/{slug}/mentions Region-scoped to the brand's primary active region by default; pass region/language to override. # Topic-filtered ranking Source: https://docs.fixaeo.com/api-reference/public-api/topic-filtered-ranking /api-reference/public-openapi.json get /api/public/v1/industry/ranking Topic-filtered ranking (bearer-authed) # Vercel Drain endpoint verification probe Source: https://docs.fixaeo.com/api-reference/public-api/vercel-drain-endpoint-verification-probe /api-reference/public-openapi.json get /api/public/v1/agents/ingest/vercel Answers Vercel's endpoint-verification probe with 200 and echoes any `verify` query value back as an `x-vercel-verify` response header. Deliberately UNAUTHENTICATED: the probe runs before the drain exists and Vercel documents neither its method nor whether it carries the drain's custom headers, so a 401 here would block drain creation. It returns no data and echoes only a value the caller placed in the URL. HEAD behaves identically. # Workspace topic themes Source: https://docs.fixaeo.com/api-reference/public-api/workspace-topic-themes /api-reference/public-openapi.json get /api/public/v1/topics Workspace topic themes (bearer-authed) # Authentication Source: https://docs.fixaeo.com/api/authentication Create an API key, send it as a bearer token, rotate it safely. One scheme, no negotiation: a bearer token in the `Authorization` header. ```bash theme={null} curl "https://api.fixaeo.com/api/public/v1/portfolio?range=30d" \ -H "Authorization: Bearer fixaeo_xxx" ``` Session cookies don't work here. The public surface accepts keys and nothing else, so an authenticated browser tab can't reach it by accident. ## How do you create a key? Keys are made in the app, not through the API. FixAEO Settings — Security scrolled to the API keys card showing 3 of 50 active keys, then clicking Create API key opens a small dialog with a name field to label the key before it's minted Go to [fixaeo.com/app/settings#security](https://fixaeo.com/app/settings#security). The **API keys** card sits below two-factor and your active sessions. Give it a name you'll recognise later — `warehouse-sync`, `grafana`, `staging`. Names are trimmed to 80 characters. An empty name is rejected with `400 name required`. This is the only time the full key is shown. Paste it straight into your secret store. Only the SHA-256 hash of your key is stored, so nobody at FixAEO can read it back to you. If you lose the plaintext, revoke the key and create a new one. ## What does a key look like? `fixaeo_` followed by 32 random bytes in URL-safe base64. That's about 50 characters in total. ``` fixaeo_kJ3nQ8vRt2LpXw9aBc7dYe4FgH1iJk5MnO0pQrS6tUv ``` The `fixaeo_` prefix is there so a leaked key is greppable in logs and catchable by secret scanners. In the keys list the app shows only the first 14 characters plus an ellipsis, which is enough to tell two keys apart without revealing anything useful. ## How many keys can you have? Your plan sets the cap. Settings shows it live as an **X of N active** chip, and the **Create** button greys out once you're at the limit. Free accounts get one. Hit the cap through the API and you get `402`: ```json theme={null} { "error": "plan_limit_reached", "plan": "starter", "count": 1, "limit": 1, "hint": "Upgrade your plan to create more API keys." } ``` If that chip shows a lower cap than your paid plan should give you, email [billing@fixaeo.com](mailto:billing@fixaeo.com). The key cap reads a different plan field from the rest of the product, so it can lag behind a recent upgrade. ## What does a bad key return? Always `401`, always JSON, always a single `error` string. | Request | Response body | | ----------------------------------- | -------------------------------------------------- | | No `Authorization` header | `{"error":"missing Authorization header"}` | | Header without the `Bearer ` scheme | `{"error":"Authorization must be Bearer "}` | | `Bearer` with nothing after it | `{"error":"empty bearer token"}` | | Unknown key, or one you revoked | `{"error":"invalid API key"}` | Unknown and revoked deliberately share a message. Telling them apart would let someone probing keys learn which strings ever existed. ## How do you rotate or revoke? Create the replacement first, deploy it, then revoke the old one. Revocation takes effect on the next request — anything still sending the old key starts getting `401 invalid API key` immediately. Each key records a **last used** timestamp, shown on its row in Settings. That's the fastest way to check a key is genuinely dead before you delete the integration that held it. Revoked keys stay listed with their revocation date rather than disappearing, so you keep an audit trail. ## Can a key manage other keys? No, and that's on purpose. The three management endpoints live on the cookie-authenticated dashboard surface: * `GET /api/v1/me/api-keys` * `POST /api/v1/me/api-keys` * `POST /api/v1/me/api-keys/{id}/revoke` They need a browser session, so a stolen key can't mint itself a successor or lock you out by revoking yours. ## Keeping a key safe * Store it server-side. It carries full read access to your workspace, so it never belongs in browser or mobile code. * Use one key per integration. Then revoking a compromised one doesn't take down everything else. * Rotate on staff changes rather than on a calendar. That's when keys actually leak. The same key authenticates the [MCP server](/mcp/setup), so an assistant configured with it can read everything the API can. ## Next What happens when you call too fast, and how to back off. Shared query parameters and their accepted values. Base URL, the 21 paths, and the plan gates. How FixAEO handles your data more broadly. # Filters and time ranges Source: https://docs.fixaeo.com/api/filters Shared query parameters and the values each one accepts. Most read endpoints share a small set of query parameters. Learn these four — `range`, `region`, `engines` and `brand_slug` — and the rest of the API follows the same shape. ## Value scales Two fields express visibility on different scales. `citation_rate` on `/brands/{slug}/snapshots` is a fraction from `0` to `1`, and so is the `per_engine` map beside it. `score` on `/model` runs from `0` to `100`. Multiply the snapshot values by 100 when you chart the two together. Treat the scale as part of the endpoint contract. [Visibility Score](/metrics/visibility-score) explains what the number itself means. ## `range` — the time window Send one of these four and you'll get identical behaviour everywhere: `7d` · `30d` · `90d` · `365d` Leave it off and you get 30 days. Some endpoints accept extra aliases beyond the four: | Endpoints | Also accepts | | ----------------------------------------------------------------- | ------------------------------------------------------ | | Brands, snapshots, portfolio, citations, fan-outs, industry | `1w`/`week`, `1m`/`month`, `3m`/`quarter`, `1y`/`year` | | `/brands/{slug}/agents`, `/brands/{slug}/agents/pages` | Nothing | | `/brands/{slug}/attribution`, `/brands/{slug}/search-performance` | Nothing | Stick to `7d`, `30d`, `90d` or `365d` and every endpoint answers the same way. `/brands/{slug}/attribution` and `/brands/{slug}/search-performance` reject anything outside that set with `400 range must be one of 7d/30d/90d/365d`. Windows are computed in UTC. The brand, portfolio and industry endpoints use whole days ending today, inclusive. The citation endpoints use a rolling window from exactly N × 24 hours ago, so counts can differ slightly from a whole-day view of the same period. `/model` takes no `range` at all. It's always the last 30 days, and it echoes `"range": "30d"` back so you can see that. ## `engines` — filtering by AI engine Nine engine slugs exist. Send them exactly as written: | Engine | Slug | | ------------ | -------------- | | ChatGPT | `chatgpt` | | Claude | `claude` | | Gemini | `gemini` | | Perplexity | `perplexity` | | Copilot | `copilot` | | DeepSeek | `deepseek` | | Grok | `grok` | | AI Overviews | `ai_overviews` | | AI Mode | `ai_mode` | Matching is exact against the stored value, so use the slug rather than a vendor name like `openai` or a display name like `AI Overviews`. Where each one goes: * `/citations` takes `engines` as a comma-separated list — `engines=chatgpt,perplexity`. * `/industry/ranking` takes `engines` (comma-separated) or the singular `engine`. The plural wins if you send both. * `/industry/metrics` takes a single `engine` only. You'll only have data for engines your plan actually scans. Lite and Growth scan six; `claude`, `grok` and `deepseek` are Enterprise. Filtering by an engine you don't scan returns an empty result, not an error. See [Plans and limits](/plans-and-limits). ## `region` and `language` `region` is a lowercase ISO 3166-1 alpha-2 country code — `us`, `gb`, `de`, `in`. `language` is a lowercase ISO 639-1 code — `en`, `de`, `es`. They aren't wired up identically: | Endpoint | Parameters | Default when omitted | | ------------------------- | --------------------------------------- | --------------------------------- | | `/brands/{slug}/mentions` | `region`, `language` | The brand's primary active region | | `/industry/metrics` | `region`, `language` | The brand's primary active region | | `/industry/gap` | `region` | All regions | | `/industry/ranking` | `regions` (comma-separated), `language` | All regions | | `/citations` | `regions` (comma-separated) | All regions | | `/portfolio` | `region`, `language` | `us` and `en` | `/portfolio` defaults to `us` and `en` rather than to your brand's own region. If you track brands outside the US, send `region` and `language` explicitly — `region=de&language=de`, for example. `/brands/{slug}/snapshots` takes no region parameter. It resolves the brand's primary active region for you, which is why its numbers line up with the dashboard. ## `brand_slug` — picking a brand Account-wide endpoints don't carry a brand in the path. They default to your **newest** tracked brand, and accept `brand_slug` to choose another: `/topics` · `/model` · `/citations` · `/industry/metrics` · `/industry/ranking` · `/industry/gap` · `/industry/competitors/{name}/citations` · `/industry/competitors/{name}/prompts` Read your slugs from `GET /brands` rather than composing them by hand. A slug that matches nothing resolves to the default scope instead of raising an error, so a typo returns a valid-looking answer for the wrong brand. Slugs are lowercase and hyphenated, and `GET /brands` lists yours. ## Endpoint-specific filters **`/brands/{slug}/mentions`** takes `sentiment`, one of `pos`, `neu` or `neg`. Anything else returns `400 invalid sentiment filter`. The endpoint returns up to 100 mentions per call, so narrow with `sentiment` and `region` to get the set you want. **`/industry/ranking`** needs at least one of `topics`, `engines` or `regions`. Call it with only a `range` and you get `400 at least one of topics, engines, or regions is required`. Topics cap at 50 per request and 100 characters each. **The agent endpoints** (`/brands/{slug}/agents` and `/agents/pages`) share three crawler filters, which combine with AND: * `bot` — exact bot name, like `GPTBot`. * `vendor` — exact operator, like `OpenAI`. Covers every bot that company runs. * `kind` — one of `training_crawler`, `browsing_agent`, `agentic_browser`, `mcp_client`. [Agent analytics](/agent-analytics) explains what those four kinds mean in practice. **`/agents/pages`** adds list controls: `search` (substring on the path, truncated at 200 characters), `folder`, `limit` (default `10`), `offset`, `sort` (`hits`, `path`, `errors` or `uniques`) and `dir` (`asc` or `desc`). `dir` is only honoured when you also send `sort`. `status` on that endpoint accepts `ok`, `error`, or a bare three-digit code like `404`. ## A worked example Perplexity citations for one brand in the UK, last quarter: ```bash theme={null} curl -G "https://api.fixaeo.com/api/public/v1/citations" \ -H "Authorization: Bearer fixaeo_xxx" \ -d "range=90d" \ -d "brand_slug=acme" \ -d "engines=perplexity" \ -d "regions=gb" ``` ## Related Base URL, the 21 paths, and the error table. Why a wider `range` beats a loop over days. Creating and rotating the key these calls need. The same filters, as arguments on 14 read-only tools. # Customer API Source: https://docs.fixaeo.com/api/introduction A read API over your FixAEO workspace, authed with a bearer key. The Customer API returns the same numbers your dashboard shows, as JSON. You send an API key, you get your own workspace back. The base URL is `https://api.fixaeo.com`. Every route starts with `/api/public/v1`. ```bash theme={null} curl https://api.fixaeo.com/api/public/v1/brands \ -H "Authorization: Bearer fixaeo_xxx" ``` ## Who is this for? Three jobs come up most often: * Pulling your visibility numbers into a warehouse or BI tool. * Building an internal dashboard your team already lives in. * Pushing server logs to FixAEO so it counts crawlers the browser beacon can't see. If you'd rather query this data conversationally, use the [MCP server](/mcp/introduction) instead. It wraps the same reads as tools and takes the same key. ## Is it read-only? Almost entirely. Of the 21 paths, 19 are read-only. Two accept writes, and both of them take agent traffic: * `POST /agents/ingest` — batches of raw request records from your edge. * `POST /agents/ingest/vercel` — the same records in Vercel's own log-drain format. That Vercel path also answers `GET` and `HEAD`, unauthenticated, so Vercel's endpoint-verification probe can reach it before the drain exists. It echoes back only what the caller put in the URL. Nothing here starts a scan, edits a brand, or changes a prompt. Those actions stay in the app. ## What's in it? Every path is documented under **Endpoints** in this tab, generated from the server's own spec. Here's the shape of it. | Theme | Paths | What you get | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | Brands and trends | `/brands`, `/brands/{slug}`, `/brands/{slug}/snapshots`, `/brands/{slug}/prompts`, `/portfolio` | Your tracked brands, their daily time series, their prompts, and one cross-brand roll-up | | Answers and citations | `/brands/{slug}/mentions`, `/citations`, `/citations/fanouts`, `/topics`, `/model` | Individual mentions, cited domains, fan-out sub-queries, topic themes, per-engine scores | | Industry and competitors | `/industry/metrics`, `/industry/ranking`, `/industry/gap`, `/industry/competitors/{name}/citations`, `/industry/competitors/{name}/prompts` | Share of voice, ranking, the sources you're missing, per-rival drilldowns | | Agent traffic | `/brands/{slug}/agents`, `/brands/{slug}/agents/pages`, `/agents/ingest`, `/agents/ingest/vercel` | Which AI crawlers hit you, which pages they took, plus the two ingest endpoints | | Traffic joins | `/brands/{slug}/attribution`, `/brands/{slug}/search-performance` | Your Google Analytics and Search Console data, joined to AI referrals | `/industry/metrics` is the one-call endpoint. It returns the ranking, the time series, per-competitor sentiment and your own aggregates in a single payload, which saves a reporting job five round trips. ## Which plans can call it? Any plan can create a key and call the read endpoints, including Free. Free accounts get no scheduled scans though, so those reads come back empty until you upgrade. [Plans and limits](/plans-and-limits) has the full matrix. The two ingest endpoints are gated harder. They need a paid plan, and server-log ingestion needs Growth or higher. A key without the right plan gets a `403` naming the plan it wants. `POST /agents/ingest` caps a batch at 2000 records, and returns `413` telling you to split when you exceed that. The body is separately capped at 4 MB, which surfaces as `400 invalid JSON body` because the read is cut short. Chunk to stay under both. ## How is a key scoped? To one account: the one that owns the key. There's no account parameter and no way to widen the scope. Cookie sessions are rejected on this surface deliberately. Keeping the two auth paths separate makes "what can an API key reach" a single answer rather than an audit exercise. If you track several brands, the account-wide endpoints default to your newest one. Pass `brand_slug` to pick another — see [Filters and time ranges](/api/filters). ## What do errors look like? Every failure returns JSON with a single `error` string. | Status | You'll see it when | | ------ | --------------------------------------------------------------------- | | `400` | A parameter is malformed or a required one is missing | | `401` | The key is missing, revoked, or unknown | | `403` | Your plan doesn't cover the endpoint, or the `site_id` isn't yours | | `404` | The brand slug or `site_id` doesn't exist on your account | | `413` | A `POST /agents/ingest` batch exceeded 2000 records | | `429` | You went past the rate limit | | `500` | Something broke server-side. Retry, then email support if it persists | There's no error code field yet, so match on the status first and the string second. ## Next Creating a key, its format, and what a bad one returns. 120 requests a minute, and how you find out you've hit it. The `range`, `region` and `engines` vocabulary, plus one scale trap. The same reads, as tools your AI assistant can call. # Rate limits Source: https://docs.fixaeo.com/api/rate-limits 120 requests a minute, a 429 with Retry-After, and no quota headers. The Customer API allows **120 requests per minute**. That's the production setting today, and it's generous enough that most integrations never notice it. The window slides. It isn't a bucket that resets on the minute — the server counts requests made in the last 60 seconds, continuously. ## What counts toward the limit? One shared budget covers three surfaces: * every `/api/public/v1/*` route * the [MCP server](/mcp/introduction) at `/api/mcp` * both `POST` agent-ingest endpoints So an assistant querying through MCP and a nightly export job spend from the same 120. The limit is counted **per client IP address, not per API key**. Two services sharing one NAT gateway or one Kubernetes egress IP share one budget, even with separate keys. Creating another key does not buy you more throughput. ## What happens when you go over? You get `429 Too Many Requests` with this body: ```json theme={null} { "error": "rate limit exceeded, try again later" } ``` and one header: ```http theme={null} Retry-After: 12 ``` `Retry-After` is a whole number of seconds, at least `1` and never more than `60`. It's the real wait — the time until your oldest request ages out of the window, not a fixed penalty. Sleep for that long and your next call goes through. ## Are there quota headers? `Retry-After` on a `429` is the rate-limit signal the API sends. Successful responses don't carry `X-RateLimit-Limit`, `X-RateLimit-Remaining` or `X-RateLimit-Reset`, so track your own call count if you need to know where you stand before you hit the limit. ## How should you handle it? Retry on `429`, and honour `Retry-After` rather than guessing. ```python theme={null} import time, requests def get(url, key, attempts=4): for i in range(attempts): r = requests.get(url, headers={"Authorization": f"Bearer {key}"}) if r.status_code != 429: r.raise_for_status() return r.json() time.sleep(int(r.headers.get("Retry-After", 5))) raise RuntimeError("still rate limited after retries") ``` Two habits keep you well clear of the ceiling: * **Widen the range instead of looping over days.** One call with `range=90d` beats 90 calls with a date filter. See [Filters and time ranges](/api/filters). * **Prefer the endpoints that answer in one request.** `/industry/metrics` returns the ranking, the time series and per-competitor sentiment together. A daily sync of a five-brand workspace is roughly 30 requests. You'd have to run it every 15 seconds to trouble the limit. ## Do you need more than 120? Email [sales@fixaeo.com](mailto:sales@fixaeo.com) with the shape of your workload. The limit is a server setting, not something baked into the build, so it can be raised for an account that needs it. ## Related Keys, rotation, and what a `401` means. Fetch wider windows in fewer calls. The full error table and what each status means. Shares this budget — worth knowing if you run both. # Attribution Source: https://docs.fixaeo.com/attribution Sessions, conversions, and revenue that started in an AI answer. Attribution is the page that tells you what happens after someone clicks through from an AI assistant. It reads your Google Analytics 4 property, keeps only the sessions whose referrer was an AI engine, and reports three things: sessions, conversions, and revenue. Everything else on the page — the per-engine bars, the landing pages, the country and device splits — is a breakdown of those same AI sessions. Attribution page with no GA4 connection: a centered card explains that Attribution needs a read-only GA4 OAuth, describes the engine and landing-page breakdowns that unlock once connected, and offers a Connect GA4 CTA button ## What you need before it works Attribution has no data of its own. It is entirely a read of GA4. Attribution rolls up to one brand. With no brands, the page shows an "Add a brand" card. Connecting requires a paid plan. See [Plans and limits](/plans-and-limits). OAuth alone isn't enough. Until you select a property, the page shows "Pick a GA4 property" instead of charts. The connection is per brand. A two-brand account can have GA4 on one brand and nothing on the other, and the page follows whichever brand you have selected. Full setup steps live on [Google Analytics](/integrations/google-analytics). ## How does FixAEO decide a session came from AI? It reads GA4's `sessionSource` for every session and matches it against the referrers below. A match tags that session with an engine. Everything else is ignored. | Engine | Referrer | | ---------- | -------------------------------------- | | ChatGPT | `chatgpt.com`, `openai` | | Claude | `claude.ai`, `anthropic` | | Perplexity | `perplexity.ai` | | Copilot | `copilot.microsoft.com` | | Gemini | `gemini.google.com`, `bard.google.com` | | Grok | `grok.com`, `x.ai` and its subdomains | | DeepSeek | `deepseek` | | Meta AI | `meta.ai` | This engine list is not the same as the nine engines FixAEO scans for answers. AI Overviews and AI Mode clicks arrive in GA4 as ordinary Google organic traffic, so no referrer can separate them. Attribution can't see them at all. ## The three numbers Three tiles sit at the top. Click one to switch what the chart below plots. * **AI sessions** — GA4 sessions from a matched AI referrer. * **AI conversions** — GA4's own conversions metric for those sessions. * **AI revenue** — GA4's total revenue for those sessions, in the property's own reporting currency. Two smaller numbers come off those totals for the range you've selected. Conversion rate is conversions per AI session, as a percentage. Revenue per session is AI revenue divided by AI sessions. Both show a dash when there are zero AI sessions, rather than a misleading zero. Conversions and revenue are whatever your GA4 property already counts. FixAEO doesn't define goals of its own. If the number looks wrong, the fix is in GA4. ## Reading the charts The time series plots the metric you selected. You can switch it between daily, weekly, and monthly. Weekly appears once you have at least 14 days of data, monthly at 60. Weekly and monthly buckets sum the daily counts, and a still-running week or month is drawn with a hollow dot plus an "in progress" note so a half-finished period doesn't read as a crash. Today's value is always partial. GA4 finalises a day roughly 24 hours after midnight in the property's timezone. The bar chart on the right groups the same metric by engine. Engines with a zero value are dropped rather than drawn as empty bars, so a short list means few engines are sending traffic. ## What is an AI-cited page? The table below the charts uses GA4's `landingPage` dimension: the entry page of each AI-referred session. That is the page the assistant actually linked to. It deliberately isn't a general page-views table, which would fill up with downstream pages like `/login` that no assistant ever cites. Each row shows the URL, sessions, icons for the engines that referred to it, and average engagement time. If the sessions in the table don't add up to the AI sessions tile, a footnote tells you the difference. GA4 returns no resolvable landing page when a tracker fires late, a privacy extension strips the referrer, or a single-page app changes the URL first. Those sessions still count in the total; they just have no URL to list. Cross-check your top AI-cited pages against [Sources](/sources). A page that engines both cite in answers and send clicks to is your strongest asset. Improve it before you write anything new. ## Countries and devices Two cards close the page. Countries shows AI sessions per country as a donut plus a top-eight table, with the share of AI sessions each represents. Devices splits the same sessions across desktop, mobile, and tablet with a bar per row. Both count sessions only — no conversions or revenue split. Country codes come from GA4 as ISO codes, and rows GA4 can't resolve are dropped rather than shown as "(not set)". ## How fresh is the data, and how far back does it go? FixAEO syncs every active connection through the day, and recent days are re-pulled as GA4 settles them, so late-arriving data corrects itself. History starts accruing when you connect. On the day you connect you get about 30 days of backfill. The 90-day and 365-day ranges keep filling in from there, so they look thin at first and get better every day. Ranges available: 7, 30, 90, and 365 days. ## What attribution can't tell you * **Clicks, not answers.** Most AI answers never produce a click. Treat these numbers as a floor on your real impact and use [Visibility Score](/metrics/visibility-score) for the part analytics can never see. * **Nothing about crawlers.** Bots reading your site don't create GA4 sessions. That's [Agent analytics](/agent-analytics). * **Only what GA4 recorded.** Blocked trackers, consent banners, and stripped referrers all subtract from these counts. * **One property per brand.** Traffic split across several GA4 properties needs several brands. The attribution snapshot on your [dashboard](/dashboard) covers the last seven days and reads in the same currency, just abbreviated — "\$1.2K", "₹3.4L". Both surfaces follow your GA4 property's reporting currency. ## Related pages * [Google Analytics](/integrations/google-analytics) — connecting, reconnecting, and disconnecting * [Search performance](/seo) — the Google side, and the queries you rank for but AI ignores * [Dashboard](/dashboard) — where the seven-day attribution summary appears # Your brand profile Source: https://docs.fixaeo.com/brand-profile The context FixAEO reads before it writes a single prompt. Your brand profile is the context every other part of FixAEO reads from. It's a short, structured description of your company: what you do, what industry you're in, what you sell, and who buys it. FixAEO drafts it for you during setup, and you can edit it any time. ## Why does the profile matter so much? Because it sits upstream of everything else. The chain runs one way: An accurate profile gives you better topics. Better topics give you better prompts. Better prompts give you results you can act on. Break the first link and the rest breaks with it. Say your industry reads "software" when you actually sell payroll software. The topic suggestions aim wide, the prompts miss what your buyers ask, and your [Visibility Score](/metrics/visibility-score) measures the wrong race. Fixing the profile is the cheapest fix in the product. ## What's in it | Field | What it holds | | --------------------- | ---------------------------------------------- | | Description | What your brand does and who you serve | | Industry | The category you compete in | | Brand identity | Adjectives that describe your brand | | Products and services | What you actually sell | | Scan region | The country FixAEO localizes its AI queries to | | Audience distribution | The mix of buyer types you sell to | ## How does FixAEO fill it in? Automatically. Reach the brand profile step with empty fields and FixAEO fetches your homepage. An AI model then drafts your description, industry, identity adjectives, and product list. Two things to know about the draft: * It only fills fields you haven't typed into. Anything you've already written is left alone. * It's best effort. If FixAEO can't read your site, the fields come back blank. Type them yourself and move on. Read the draft, don't just accept it. Homepages are written to impress, so drafts skew toward marketing language. Rewrite the description in the words a customer would use, not the words your landing page uses. ## Audience distribution Three preset buyer types, each with an on/off toggle and a percentage: * **Simple recommendation seeker** — casual and non-technical, wants one name. * **Informed shopper** — knows the product category, asks about features. * **Evaluative researcher** — weighs tradeoffs across a decision space. Enabled rows have to total exactly 100% or you can't continue. The mix feeds the topic suggester. This matters more than it looks. A recommendation seeker asks "what's the best issue tracker for a small team". An evaluative researcher asks "Linear vs Jira for a 20-person engineering org". Those are different questions, so they need different prompts. Set the mix to match your real funnel. ## Scan region The scan region is the country FixAEO localizes its AI queries to. It prefills from the country you picked on the first setup step. You pick a country, not a language. The picker is country-only by design. A brand gets one scan region today, and it's fixed once setup finishes. Every answer carries the region it came from, so keeping it stable keeps your history comparable. Pick the country your buyers are in before you finish setup. The region shows as a flag pill beside your brand name in the sidebar. Multi-region tracking is on the roadmap. ## Editing after setup Everything stays editable. Go to your brand settings and open the brand profile card. FixAEO brand overview for Linear: header with logo and domain, then six tabs (Overview, Trends, Prompts, Mentions, Knowledge, Settings). Clicking Prompts reveals the Tracked prompts panel with the prompt list and category chips * **Editable:** description, industry, brand identity tags, products and services, audiences. * **Read-only:** language and time zone, shown under **System fields**. Your domain is editable too, but it lives one card up under **Brand identity**, not in the profile card. Changing it asks you to confirm first, because it changes the site every future scan is measured against. Editing one line leaves the rest of the profile alone. Changing your brand URL during setup refreshes everything derived from the domain: description, industry, identity tags, products, audiences, topics, and prompts. Your brand name, location, language, time zone, and region pick stay as they are. It's a deliberate reset so the new domain gets fresh suggestions. ## Next steps * [Setting up your prompts](/setting-up-prompts) — turn your profile into the questions FixAEO runs. * [Topics and labels](/topics-and-labels) — organize prompts once you have more than a handful. * [Tracking competitors](/competitors) — decide who you're measured against. # Citations Source: https://docs.fixaeo.com/citations Which links AI engines show when they answer about your category. A citation is a link an AI engine put on screen while answering. In FixAEO a citation means something specific: a source the engine visibly showed a reader. A citation chip, a footnote link, or a row in the sources panel. If someone reading that answer could see it and click it, it's a citation. The Citation page lists every domain that earned one for your prompts, and where you rank among them. ## How is a citation different from a mention? A mention is your **brand name in the answer text**. A citation is a **link to a website** in the same answer. They're counted separately because they're separate things. | | Mention | Citation | | ------------ | --------------------------------------------- | --------------------------- | | What it is | Your brand named in the answer | A link the engine displayed | | Needs a link | No | Yes | | Feeds | [Visibility Score](/metrics/visibility-score) | Citation Share | All four combinations happen. You can be mentioned without being cited, when the model recommends you from what it already knows and links a review site instead. You can be cited without being mentioned, when the engine uses your page as evidence and then names a competitor. Chasing citations won't automatically raise your Visibility Score, and raising your Visibility Score won't automatically get you cited. Track both. [Understanding AI answers](/understanding-answers) explains how each is detected. ## The two numbers at the top **Citation Share** is how often your own domain is the one being cited, out of every citation in the window. If nothing points at your domain this reads an honest 0%, not a dash. The data exists. You're just not in it. **Citation Rank** is where your best-performing owned domain places among all the domains cited for your prompts. You'll see a dash when none of the cited domains is yours. Turn on the compare toggle and both tiles gain a change chip against the previous period. FixAEO Citation page showing a Citation Share of 37.3% for linear.app and a Citation Rank of #2 of 8 domains, out of 898 total citations ## What are the citation categories? Every cited domain lands in one of eight buckets: **Earned Media, Social, PR Wire, Institution, Owned, Competition, Custom, Other**. The stacked bar shows the mix. Categories are consistent, so a domain always lands in the same bucket and the mix stays comparable week to week. The mix tells you what kind of content wins in your category. Heavy on Social means forum threads and video decide your answers. Heavy on Earned Media means you need press and reviews. ## The domains table Below the chart sits every cited domain in the window. Each row gives you rank, domain, content type, category, citations (with a share bar), the engines that cited it, sentiment, and a recent trend. Click a row to open that domain's cited pages. There's a quicker drilldown too. The chevron beside a domain's rank expands an inline preview of its most-cited URLs, without leaving the table. **Expand all** in the table footer opens every row on the current page at once, and flips to **Collapse all**. FixAEO Citations page: scrolling down to the Top Citation Domains table and searching for 'reddit', which narrows the list to reddit.com with 358 citations (39.9%), Forum/Q&A content type, Social category Filter by date range, granularity, engine, region, and topic, and search by domain. Tabs narrow the table to **All**, **Your Site**, **Competitors**, **Links to Competitors**, or **Other**. Topics come from [Topics](/topics-and-labels). Export the filtered set to CSV. Tag and persona filters exist too, but they stay hidden until labels are attached to prompts — and attaching them isn't built yet. See [Topics](/topics-and-labels#labels-tags-and-personas). Citations page Platforms filter: opening the multi-select dropdown, unchecking ChatGPT, and watching the Citation Rank tile's denominator drop from among 898 citations to among 717 citations while your #2 rank holds steady The Citation page reports on one brand at a time — whichever brand is currently selected. Switch brands from the Brands grid to re-scope every number on the page (the brand cell at the top of the sidebar is a link to that brand's profile, not a switcher). See [Managing brands](/managing-brands). ## The citation graph The **View as graph** button draws your most-cited domains as a network. Two domains connect when they appear in the same AI answer, and thicker lines mean they co-appear more often. Your site is green, competitors red, everything else grey. FixAEO Citation Graph for Linear: a force-directed network with linear.app (green, YOUR site) at the centre, connected to reddit.com, github.com, capterra.com, news.ycombinator.com, g2.com, producthunt.com and one more grey competitor node — edges between domains show they co-appear in the same AI answers Clusters are the useful part. They show which sites the engines reach for together, which tells you where a placement is most likely to pull you into the same answers. Work the table top-down. The highest-cited domain you're absent from is usually your cheapest win. One guest post, one listing, or one correction on a page the engines already trust. [Sources](/sources) goes a level deeper. It shows the pages an engine fetched while drafting, including the ones it never showed. # Tracking competitors Source: https://docs.fixaeo.com/competitors Who AI models name instead of you, and how to pin the ones that matter. A competitor in FixAEO is any brand an AI model names in an answer to one of your prompts. Most of them find you. FixAEO reads every answer, extracts the brands mentioned, and ranks them against you without you configuring anything. You only step in when you want to force a specific rival into view, or filter your citations by one. ## How competitors get detected Automatically, from your prompt results. Run a non-branded prompt like "best issue tracker for a small engineering team" and whichever brands the model names get counted. They appear in your industry ranking with their mention count and share. Nothing is populated during setup. Your competitor list is a by-product of your prompts, which is another reason to keep most of them non-branded. See [Setting up your prompts](/setting-up-prompts). If a rival never appears, that's data, not a gap. It means the models aren't naming them for the questions you track. ## Pinning a competitor Pinned competitors always appear in your ranking, even with zero mentions. They show as "Watching" until they surface. Pin them from the **Tracked competitors** card on the Industry page. The add field asks for the company's domain, like `drift.com` — a domain is unique and lets FixAEO fetch their logo. A plain brand name works too. Beside it sits a suggestion row built from the top of your current ranking. The suggestions skip your own brand and anything you've already pinned. FixAEO Industry page scrolled to the Tracked competitors card, showing the Gap Analysis above (domains that cite rivals but not you) and the Pinned pills below (Jira, Monday.com, Height, ClickUp, Asana, Notion) next to the Add a competitor domain input Use the suggestion buttons where you can. They insert the name exactly as it appears in your ranking, so the spelling lines up without you checking it. Pinning does one more thing: it unlocks the denominator toggle on the Industry page. * **All brands** divides your mentions by every brand the scanner detected. * **Tracked only** divides by you plus your pinned competitors. The first is the honest baseline. The second answers "how am I doing against the four rivals I actually care about". The toggle appears once you've pinned at least one competitor. ## Competitor domains are a separate list There's a second, different list: **competitor domains**, added from the Competitors card in your brand settings. You enter a domain like `stripe.com` plus an optional label. | | Pinned competitors | Competitor domains | | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | Where | Industry page | Brand settings | | Scope | One brand | Whole account | | What you enter | A domain, or a plain brand name | A domain | | What it does | Forces the brand into your ranking | Powers the Competitors filter on the Citation page, and keeps competitor sites from being classified as earned media | They don't sync. If you want a rival in both places, add them twice. ## How many should you track? Pin three to five. The trends chart plots your closest rivals against you and rolls the rest into an "Other" line, so a long pin list stops being readable. Pick rivals your buyers actually compare you against, not every brand the models mention. A long pin list makes the ranking noisy and the quadrant unreadable. ## What the competitive views tell you * **Industry ranking** — every brand ranked by share of voice, with mentions and the change since the start of your window. Read [Share of voice](/metrics/share-of-voice) for how it's worked out. * **Competitor drilldown** — click any row. A Prompts tab shows which of your prompts they win, and a Sources tab shows which domains got cited when they did. * **Competitive quadrant** — share of voice on one axis, sentiment on the other, so you can see who's both visible and well described. The drilldown is the one to spend time in. Ranking tells you that you're behind. The Prompts tab tells you exactly which questions you're behind on, and the Sources tab tells you which pages the models trusted instead of yours. Take that into [Citations](/citations) and you have a target list. ## Related * [Industry benchmarks](/industry) — the page all of this lives on. * [Topics and labels](/topics-and-labels) — group the themes where you're losing. * [Your brand profile](/brand-profile) — the industry field that frames the whole comparison. # Crawlability Source: https://docs.fixaeo.com/crawlability Which AI crawlers your robots.txt lets in, and which ones your competitors allow. Crawlability reads your `robots.txt` and tells you, crawler by crawler, whether it may fetch your site. It's the permission side of AI visibility. [Agent analytics](/agent-analytics) records the bots that actually arrived. This page tells you which ones you've asked to stay out — often without meaning to. Open **Agent Analytics** in the sidebar and switch to the **Crawlability** tab. The page has three tabs: **Crawlability**, **URL Tester**, and **vs Competitors**. All three run against the same catalog of 51 crawler tokens, from GPTBot and ClaudeBot down to CCBot, Bytespider, and Baiduspider. FixAEO Crawlability page: URL Tester with the path https://linear.app/api/ returning 51 blocked and 0 allowed, then a switch to the vs Competitors matrix comparing Linear against seven competitors ## Are you blocking a crawler your competitors let in? That's the **vs Competitors** tab, and it's the fastest thing on the page to act on. It builds a matrix: one row per crawler, one column per site. Your column comes first, then each tracked competitor. Every cell is a verdict — `✓` allowed, `~` partial, `✕` blocked. Tiles above the matrix give each site a blocked count and a fully-open count. **Only show crawlers treated differently** is ticked by default. Rows where every site agrees get hidden, because those rows have nothing to tell you. Untick it to see the full catalog. Competitors come from your account-wide competitor list, not from this brand alone. See [Competitors](/competitors) for how that list is built. Your own domain is filtered out, so you never appear as your own rival. The comparison covers up to eight competitors, and if you track more, a line above the matrix says how many are shown. ## Why does the comparison count blocked, not restricted? Because nearly every real `robots.txt` disallows *something* under `User-agent: *`. Count anything non-open and almost every site scores the same, so the columns look identical and the comparison tells you nothing. So the two views use different numbers on purpose: * The **Crawlability** tab headline counts crawlers with any restriction — "*your brand* — N bots with restrictions, M fully open". That's the right lens for auditing your own file. * The **vs Competitors** tiles count only crawlers that are blocked outright. That's where sites genuinely differ. ## The three verdicts | Verdict | What it means | | ------- | -------------------------------------------------------------- | | Allowed | Nothing in your file fences this crawler off anywhere | | Partial | Your site root is reachable, but some paths are disallowed | | Blocked | Your site root itself is disallowed — the crawler gets nothing | Partial only exists in the site-root view. A single URL is either allowed or blocked, so the URL Tester never returns it. ## Which rule produced the verdict? Rows sit under one of two headings, and that split is the actionable part. **Explicitly mentioned** means a `User-agent` group in your file names that bot. You decided this. **Following global rules** means no group names it, so your catch-all `User-agent: *` applies. That's what your file happens to do to a crawler you've probably never thought about. Every row also carries a Reason column — a plain sentence naming the group that decided it, like "Your site root is allowed, but your global User-agent: \* rules disallow some paths." Read that column rather than the group heading alone when a verdict surprises you. Matching follows the standard Robots Exclusion Protocol conventions, wildcards and precedence included, so `Disallow: /` plus `Allow: /public/` behaves the way you'd expect. ## Can you test one specific URL? Yes — the **URL Tester** tab. Paste a full URL or a bare path and press **Check URL**. Only the path and query string are used. The host is ignored on purpose: the rules always come from *this* brand's `robots.txt`, so pasting a competitor's URL would give you a misleading answer. The result is the same table, re-evaluated for that one path. The headline switches to the path you tested, with its own blocked and allowed counts. ## Reading the table A filter bar pins itself under the header. It carries a search box plus four menus: * **Platforms** — the vendor behind the bot * **Bot types** — Training, Search, User Query, Other * **Bots** — the full list, searchable and grouped by type * **Status** — Allowed, Partial, Blocked Every menu starts with all boxes ticked. Hover a row and an **Only** button isolates that one value. Sorting a column sorts inside each group, so the explicit-versus-global split survives. Two buttons sit top right. **View robots.txt** opens your raw file, line-numbered, with directives highlighted. **Reload robots.txt** re-fetches your own file for the root and URL Tester views. Competitor files refresh on their own schedule, so a change on their side takes a little longer to reach the comparison. The brand picker at the left of the filter bar sets the same current brand the sidebar uses, so switching here follows you across the app. See [Managing brands](/managing-brands). ## What if you have no robots.txt? The table is replaced by a short explanation instead of 51 identical Allowed rows. Under the Robots Exclusion Protocol, no file means no rules, so every crawler is allowed by default. An unreachable server reads the same as a missing file. If you know you have a `robots.txt`, press Reload before you trust that state. ## What this page won't tell you Three honest limits. **A verdict is a request, not enforcement.** Your file states a preference. Whether a crawler respects it is a separate question, and [Agent analytics](/agent-analytics) is the only record of what actually arrived. **A competitor whose server couldn't be reached reads as wide open.** If their server times out, their whole column fills with green ticks. The tile above that column is the tell — it shows a dash and "no robots.txt found" instead of a number. **Allowed is not the same as visible.** Letting every crawler in is the floor, not the goal. Once the doors are open, [Sources](/sources) shows what the engines chose to read and [Improve](/improve) turns that into work. Crawlability isn't plan-gated. Crawl insights needs a paid plan to capture traffic, but the robots.txt check runs on every plan, including Free. See [Plans and limits](/plans-and-limits). # Understanding your dashboard Source: https://docs.fixaeo.com/dashboard What each panel tells you, and what to do about it. Your dashboard is the page to open first, every day. The dashboard is your brand's home screen. It answers one question: did your AI visibility move since you last looked, and if so, why. Every number on it is counted from the AI answers FixAEO collected on your scan schedule. See [Understanding AI answers](/understanding-answers) for where that data comes from. The page is titled **Today**. At the top you pick a window: 7, 30, or 90 days. It opens on 30. ## What's in the header? Four things, in reading order. **A status pill** next to your brand name. It reads Healthy, At risk, or Critical, based on how far your score moved across the window. It reads **Scan in progress** when today's scan hasn't finished. **An engine status row.** One pill per engine your plan tracks, plus any engine that has returned data, and a summary line: "all 6 responding", "6 engines tracked" while one still waits on its first result, or "3 of 6 not responding". **Today**, a one-line summary. It appears only when something meaningful moved — your visibility, a competitor's share, or sentiment. Otherwise it hides rather than saying "all quiet". **Visibility Score**, the hero number, with a change chip reading *vs window start* and a trend chart. The hero covers the whole window, so it won't match the last point on the chart, which is a single day. [Visibility Score](/metrics/visibility-score) explains the metric. All four, stacked in that order: FixAEO dashboard header for the demo brand Linear on the Growth plan, showing an At risk status pill, six tracked AI engines, and a Visibility Score of 34.5% down 3.6 points versus the window start ### Why does engine status matter so much? Because a provider outage looks exactly like a visibility crash if you don't check. A pill reads healthy when that engine returned answers in your latest scan. It reads down when the engine answered earlier in the window but returned nothing on the latest day. A grey pill reads **Tracked** — your plan covers that engine, but it hasn't returned a first result for this brand yet. That's not a failure, so it doesn't count toward the "not responding" summary. If an engine is down, your Visibility Score falls because those answers never happened. Not because AI stopped recommending you. Check the pills before you read the chart. An engine sitting at 0% isn't the same as an engine that's down. 0% means it answered and didn't name you. That's a real visibility problem, and [Improve](/improve) is where you fix it. While a scan is running, FixAEO hides the change chip and shows yesterday's value instead. A half-finished day would otherwise read as a crash that never happened. FixAEO dashboard: clicking the 7d then 90d range tab redraws the Visibility Score card — the headline score updates and the vs window start delta shifts from -1.1% to -2.8% for Linear ## The three tiles Below the hero sit Sentiment, Mentions, and Improve. Each links into its full view. Sentiment is the positive / neutral / negative split across classified mentions — see [Sentiment](/metrics/sentiment). Mentions is always a 30-day count, whichever range tab you picked, so it stays comparable week to week. Improve is how many recommendations are still pending. ## What's in the left column? * **AI attribution** — sessions, conversions, and revenue from AI referrals. Appears once you've connected [Google Analytics](/integrations/google-analytics). * **Agent traffic** — which AI crawlers hit your site. See [Agent analytics](/agent-analytics). * **Top movers** — your biggest engine drop and the fastest-rising competitor. Both stay hidden while nothing has really moved. * **Topic visibility** — your strongest topics by Visibility Score. Full view on [Topics and labels](/topics-and-labels). * **Recent mentions** — the newest answers that named you, with engine, sentiment, and the prompt behind them. ## What's in the right column? * **Brand industry ranking** — share-of-voice bars against every brand the engines named in your category. Full view on [Industry benchmarks](/industry), the metric itself on [Share of voice](/metrics/share-of-voice). * **Alerts that fired** — rules that triggered inside the window. Set them up on [Alerts](/alerts). * **Improve** — your most pressing pending recommendations. * **Connect to unlock more** — integrations you haven't set up yet. Track more than one brand and a **Your other brands** row appears, with a chip per brand and a link to the portfolio rollup. See [Managing brands](/managing-brands). ## Why is my dashboard empty? Two common reasons. **Your profile is incomplete.** Until your brand name and industry are filled in, the dashboard shows a "complete your profile" prompt instead of panels. Without a brand name there's nothing to match answers against, so every number would read 0%. Fill the fields in on [Your brand profile](/brand-profile). **No scans have run yet.** Scheduled scans start on a paid plan, and the cadence depends on which one. See [Plans and limits](/plans-and-limits). Read the dashboard top-down: engine status, then the score, then the panels. The panels explain the number. The number rarely explains itself. # Email notifications Source: https://docs.fixaeo.com/email-notifications The emails FixAEO sends, the toggles in Settings, and one-click unsubscribe. Email is the only notification channel FixAEO has today. There are no push notifications and no SMS. So this page is about email: which ones FixAEO sends, which you can switch off, and which always arrive. You control them in one place: **Settings → Notifications**. It's open to every signed-in user, on every plan. Settings opens from the sidebar footer, then pick **Notifications** in the Account section. This page is about email. The in-app **Inbox** is a separate thing — messages that live inside the app, not in your mailbox. See [Inbox](/inbox). ## Emails you can turn off Each of these is a single switch. Turn one off and FixAEO stops sending that category to you. Turn it back on whenever you like. * **Getting-started tips** — a short series in your first week that helps you set up and get value. * **Scan complete** — a heads-up when a visibility scan you started has finished. * **Visibility digest & recommendations** — a periodic summary of your visibility plus new recommendations to act on. * **Product updates & tips** — occasional news about new features. Not one per release. The visibility digest goes out weekly by default. The switch turns the whole category on or off. There's no in-app picker to change it from weekly to monthly, so treat the toggle as the only control here. To change what you receive: Click **Settings** in the sidebar footer. Pick **Notifications** under Account. Toggle any category off or on. The change saves on its own — there's no separate Save button. ## Emails that always send Two categories have no switch. They show an **Always on** label instead, because they carry things you need to receive to use and keep your account. * **Sign-in & security** — magic links, new-device alerts, and notices when your workspace changes. Turning these off would lock you out of your own sign-in. See [Security and privacy](/security). * **Payment & account access** — the reminder before a trial ends, and the notice when access is paused. The always-on billing emails are the trial-ending reminder and the access-paused notice only. The email you get on each failed charge comes from Lemon Squeezy, FixAEO's payment provider — not from FixAEO itself. FixAEO never charges your card and doesn't send its own payment-failure email, so you won't get two copies of the same news. See [Plans and limits](/plans-and-limits) for how a failed payment plays out. ## One-click unsubscribe Every opt-out email carries an unsubscribe link in its footer. Clicking it updates the same preference the matching toggle controls, so the two never disagree. Turn a category off from an email, and its switch in Settings is already off next time you look. It works the other way too. Many mail apps also show a one-click **Unsubscribe** button at the top of these messages. That does the same thing — it flips the same preference, without opening a web page. The always-on categories above don't carry an unsubscribe link, because you can't opt out of them. ## If you scanned without an account You can run a scan from the FixAEO homepage without signing up. If you do, FixAEO can email you the result and, later, alert you when that brand's visibility changes. Those emails aren't tied to any account, so each one carries its own unsubscribe link — separate from the Settings toggles above. Unsubscribing from a homepage-scan email doesn't touch the preferences on an account you create later, and changing your account toggles doesn't touch those homepage emails. ## What this page doesn't cover Three kinds of email or message live somewhere other than Settings → Notifications: * **Alert emails** — drops, rises, or a new competitor showing up — are switched on or off **per rule** in [Alerts](/alerts), not here. If you're getting an alert email you don't want, edit or turn off the rule that sends it. * **The in-app Inbox** is separate. It holds messages inside the app, not in your mailbox. See [Inbox](/inbox). * **Deliverability.** If your email address repeatedly bounces or marks FixAEO as spam, FixAEO may stop sending to it on its own to protect delivery for everyone. That's automatic, not a toggle. If your mail has gone quiet and you didn't turn anything off, email [support@fixaeo.com](mailto:support@fixaeo.com). Don't confuse any of this with the **Agent Analytics** screens (Crawl insights, Crawlability), which read your server logs to show which AI crawlers fetched your pages. Those are reports inside the app, not emails. ## Related Per-rule emails for drops, rises, and new competitors. Set up and tuned separately from these toggles. The in-app message center — separate from email. Sign-in, magic links, and the security emails that always send. Trials, billing, and what happens when a payment fails. # Export your data Source: https://docs.fixaeo.com/export-your-data Every CSV and JSON export FixAEO offers, and what's in each. FixAEO has three export paths: seven analytics CSVs, one usage CSV for what your account has consumed, and one account-wide JSON dump for data portability. They answer different questions. The analytics CSVs are for spreadsheets and BI tools. The usage CSV shows what you've used against your plan. The JSON is for taking your account somewhere else. None of them requires a support ticket. FixAEO Settings — Privacy & data tab showing the Download my data button that returns a JSON file with your profile, brands, tracked prompts, and billing history, named fixaeo-data-<your-id>.json ## Two different exports | | Analytics CSVs | Account JSON | | -------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | Endpoint | `GET /api/v1/me/export` and `GET /api/v1/me/portfolio/export.csv` | `GET /api/v1/me/account/export` | | Format | `text/csv; charset=utf-8` | `application/json` | | Contains | Measurements — snapshots, mentions, cited domains, rankings | Your account — profile, brands (including brand profile text), tracked prompts, and billing history | | Where | A **CSV** or **Export** button on most screens | Settings → Privacy & data | | Good for | Charts, pivot tables, your own warehouse | GDPR Article 20, leaving FixAEO | Both set `Content-Disposition: attachment`, so your browser saves a file instead of rendering it. Both are `Cache-Control: no-store` — every download is point-in-time. ## The six CSV views One endpoint, `GET /api/v1/me/export`, dispatches on a `view` parameter. Six values are valid. | `view` | Where the button is | Filename | Needs `brand=` | | ----------- | ------------------------------------ | ----------------------------- | -------------- | | `brands` | Brands page, **CSV** | `fixaeo-brands.csv` | No | | `snapshots` | By URL, see below | `fixaeo-snapshots-.csv` | Yes | | `mentions` | Brand page, Recent mentions, **CSV** | `fixaeo-mentions-.csv` | Yes | | `prompts` | Brand page, prompt list, **CSV** | `fixaeo-prompts-.csv` | Yes | | `domains` | Citations page, **Export N URLs** | `fixaeo-citations.csv` | No | | `industry` | Industry page, **Export CSV** | `fixaeo-industry.csv` | No | `snapshots` is the one view you request by URL rather than by button. It gives you the daily time series behind the trend chart, so it's the most useful of the six if you're rebuilding charts elsewhere. There's a ready-made URL at the bottom of this page. An invalid `view` returns a 400 listing the valid ones. A missing `brand=` on the three views that need it returns 400 too. ## What's in each view? Columns: `brand_slug`, `brand_name`, `domain`, `scan_frequency_hours`, `added_at`. Configuration only, no metrics. `scan_frequency_hours` is the rescan interval your plan sets — see [Plans and limits](/plans-and-limits). Columns: `date`, `citation_rate`, `brand_mentions`, `total_responses`, `sentiment_pos`, `sentiment_neu`, `sentiment_neg`. This is the daily rollup behind your trend chart. It's scoped to the brand's region, and honors `range`. `brand_mentions` and `total_responses` are the two counts your [Visibility Score](/metrics/visibility-score) is built from: how many captured answers named you, out of how many were captured that day. Work from those two columns rather than `citation_rate`, which is a legacy name. Columns: `date`, `engine`, `sentiment`, `confidence`, `prompt`, `snippet`, `source_url`. The raw evidence rows: which engine, which prompt, and the snippet of text that mentioned you. `confidence` is how sure FixAEO is of the sentiment on that row, and is blank where sentiment wasn't scored. Filter with `sentiment=pos|neu|neg`. Columns: `prompt_text`, `is_active`, `created_at`, `last_snapshot_date`. `is_active` tells you whether the prompt is still being scanned. `last_snapshot_date` is blank for a prompt that has never been scanned — a quick way to spot prompts added since your last scan. See [Setting up your prompts](/setting-up-prompts). Columns: `rank`, `domain`, `category`, `count`, `share_pct`, `engines`, `latest_date`, `authority`, `is_owned`, `is_competitor`. `engines` is pipe-delimited, like `chatgpt|perplexity`. `share_pct` is that domain's share of all citations in the window. `authority` is the domain authority score, blank when FixAEO hasn't looked it up yet. This export honors every filter on the [Citations](/citations) screen: `range`, `q`, `topic`, `engines`, `regions`, `tags`, `personas`, and `bucket`. Narrow the table on screen, and the CSV matches what you're looking at. Columns: `rank`, `name`, `mentions`, `share_pct`, `delta_pp`, `sentiment_pos`, `sentiment_neu`, `sentiment_neg`, `is_own`, `is_pinned`. `delta_pp` is the change in percentage points against the previous window of the same length. `is_own` marks your row among the competitors. Honors `range`, `engine`, `topic`, `region`, `language`, and `brand_slug`. See [Industry](/industry). ## The portfolio CSV Multi-brand accounts get a seventh export on its own endpoint: `GET /api/v1/me/portfolio/export.csv`. It's the **Export CSV** button on the Portfolio page. One row per brand, 18 columns: `brand_slug`, `brand_name`, `domain`, `vertical`, `region`, `language`, `range_days`, `has_data`, `citation_rate_pct`, `citation_delta_pct`, `brand_mentions`, `total_responses`, `sentiment_pos`, `sentiment_neu`, `sentiment_neg`, `latest_scan_date`, `top_engine`, `top_engine_rate_pct`. The filename encodes the filters, like `portfolio-us-en-30d-2026-08-04.csv`, so repeat exports don't overwrite each other. Two things about this one are easy to misread: * **`citation_rate_pct` is the Visibility Score**, despite the column name — the same number the dashboard shows. `citation_delta_pct` is the change in percentage points. * **Metric cells are blank, not zero, for brands with no data yet.** `has_data` is `false` on those rows. Blank keeps a pending brand from dragging your spreadsheet averages down to zero. The portfolio CSV covers one region and language at a time, and defaults to `region=us` and `language=en`. If your brands are tracked for another country, pass it — `?region=gb&language=en` — or the file comes back with only the brands that match the default. ## What the date filters do Use `range`. It accepts `7d`, `30d`, `90d`, `365d` and defaults to `30d`. Anything unrecognized falls back to 30 days rather than erroring. `range` applies to `snapshots`, `domains`, `industry`, and the portfolio CSV. It does nothing on `brands`, `prompts`, or `mentions` — those three come back whole, and you filter dates in your spreadsheet. One more thing worth knowing: `mentions` exports **all regions**, unlike the mention feed on screen, which is scoped to one region. The export is meant as "everything I have." Expect more rows than the page shows. ## The Usage CSV Your account's consumption sits on its own export path. On **Settings → Usage**, the **Export CSV** button downloads the same breakdown the page is showing — the usage figures for your account, not measurement data. It carries the tab, date range, and search you have set, so the file matches what's on screen. This is what you've used against your plan, not what your brands scored. For the limits behind those figures, see [Plans and limits](/plans-and-limits); for the live meter and counters, see [Usage](/usage). ## How do you export everything for GDPR? Go to **Settings → Privacy & data** and click **Download my data**. You get `fixaeo-data-.json`. This is the Article 20 portability answer: who you are, the brands and prompts you set up, and what you've paid. ```json theme={null} { "exported_at": "2026-08-04T09:12:44Z", "user": { "id": "...", "email": "...", "email_verified": true, "display_name": "...", "avatar_url": "...", "plan": "growth", "created_at": "..." }, "brands": [ { "slug": "...", "name": "...", "domain": "...", "brand_profile": "...", "created_at": "..." } ], "tracked_prompts": [ { "topic": "...", "text": "...", "created_at": "..." } ], "billing_charges": [ { "razorpay_payment_id": "...", "amount_minor": 7900, "currency": "USD", "charged_at": "..." } ], "_note": "Generated under GDPR Article 20..." } ``` Your brand profile text ships inside `brands[].brand_profile`, so you don't need to copy it out of the app by hand. See [Your brand profile](/brand-profile). The `brands` and `prompts` CSV views above cover the same two lists with more per-row detail, so reach for those if you want a spreadsheet rather than a portability dump. What's deliberately left out: raw scan responses and IP logs. Those are omitted because dumping them would be privacy-hostile, not because they're unavailable. Your measurements aren't in the JSON. No snapshots, no mentions, no citations, no rankings. For a complete picture, pair the JSON with the CSV views above — `snapshots` and `mentions` per brand are the two that carry your history. Erasure is the button below it. See [Security and privacy](/security) for what account deletion cascades through. ## Calling the export endpoints directly These endpoints authenticate with your session cookie rather than an API key, so the simplest route is to be signed in and paste a URL into the address bar. ``` https://api.fixaeo.com/api/v1/me/export?view=snapshots&brand=your-brand&range=90d https://api.fixaeo.com/api/v1/me/export?view=mentions&brand=your-brand&sentiment=neg https://api.fixaeo.com/api/v1/me/export?view=domains&range=30d&bucket=competitors https://api.fixaeo.com/api/v1/me/portfolio/export.csv?range=90d®ion=gb&language=en https://api.fixaeo.com/api/v1/me/usage/export.csv https://api.fixaeo.com/api/v1/me/account/export ``` Want this on a schedule instead of by hand? The [MCP server](/mcp/introduction) exposes the same underlying reads to an AI client, which is a better fit for recurring pulls than scripting a cookie-authed download. ## Related Where your data lives, and how account deletion works. What the count columns in your CSVs add up to. The filters the domains export inherits. Brand caps, prompt pool, and rescan frequency. What you've used against your plan, live. # Query fanouts Source: https://docs.fixaeo.com/fanouts The sub-questions an AI engine answers behind your prompt. A fanout is a sub-question an AI engine answered on its way to answering yours. Ask an engine "best CRM for a 10-person SaaS startup" and it doesn't answer one question. It quietly answers four or five. Which CRMs target startups. What features matter at ten seats. What the price ceiling is. How they fit a dev stack. Each of those pulls its own evidence, and the final answer is stitched together from all of them. Query Fanouts shows you that breakdown, one prompt and one engine at a time. ## Why do fanouts matter? [Visibility Score](/metrics/visibility-score) tells you a prompt didn't name you. Fanouts tell you what the engine was actually thinking about instead. Say you track "best CRM for startups" and never appear. The fanouts show the engine spent that answer on pricing tiers, migration effort, and free-plan limits. If your site talks about pipeline automation and nothing else, you're not losing the race. You're in a different one. The fix is a page that answers the sub-question, not a louder version of what you already published. That makes each sub-question a small content brief. It's the closest thing in the product to the engine telling you what it wanted to read. ## How does FixAEO find the sub-questions? Engines don't publish their internal steps, so FixAEO reads the finished answer back. A second model receives three things: your prompt, the answer text, and the list of URLs that answer cited. It's asked to name the sub-questions the answer covered. The result is stored against the answer it came from, and refreshed whenever that answer changes. This is a reconstruction, not a transcript. It's one model's best reading of another model's answer. Treat a fanout as a strong hint about what the engine covered, not as proof of what it did internally. Two kinds of answer are skipped. Anything very short is too thin to break apart, and so is an answer an engine never returned — a timeout or a quota error has no sub-questions in it. ## How fresh is the data Fanouts are prepared in the background, so opening the page never waits on a model call. New scans are picked up on their own, and an answer that hasn't changed isn't re-read. A large workspace catches up over a few passes rather than all at once, so give a busy account a little time after a scan lands. ## What's on the page Three counters sit at the top. **Prompts** is how many of your tracked prompts have fanouts in the window, and matches the number of cards below. **Engines** is how many distinct engines decomposed at least one of them. **Sub-questions** is the total across every prompt and engine pair. Below that, one card per prompt, newest scan first, ten to a page. A collapsed card shows the prompt text and the brand it belongs to. Beside those sit the engine count, the sub-question count, the date of the latest scan, and a small rail of engine logos. Open a card and, if two or more engines decomposed that prompt, you get a tab per engine tagged with its own sub-question count. A single-engine card skips the tabs and just names the engine. The list underneath is numbered in the order the reading model produced it, so number 1 is what it judged the answer led with. Switching tabs is the useful move here. Two engines rarely split the same prompt the same way, and the gap between them is often the story. ## Filters and scope The range tabs cover 7d, 30d, 90d and 1y, and default to 30 days. The window filters on scan date. The engine filter is a multi-select, and only appears once two or more engines have data in the window. Ticked engines are shown combined, not one at a time. Untick everything and the page honestly shows nothing. The cards are scoped to the brand you have selected in the app. See [Managing brands](/managing-brands) for how the selection works. A very wide range on a busy account can return more prompts than one response holds. If that happens a banner tells you to narrow the range, and what you can see is always whole prompts rather than half a card. ## Why is the page empty? The empty state names both likely causes instead of picking one. It reads "either there are no tracked prompts yet, or they haven't been scanned since you added them." What actually populates the page is a chain of three things: A real buyer question, not just your brand name. Brand-name scans give an engine nothing to decompose. See [Setting up your prompts](/setting-up-prompts). The prompt must have been answered, and the answer must have enough substance to break apart. Usually minutes after the scan is analyzed, longer on a big workspace. There's a second, narrower message. Once some brand in your workspace has fanouts but the selected one doesn't, you get "no fanouts for this brand in this window" and a nudge to widen the range or switch brand. If you've set an engine filter, a **Show all engines** button appears beside that message. ## What to do with a fanout Pick a prompt where you're not named. Open it, switch to the engine you care about most, and read the numbered list top to bottom. Any sub-question you have no page for is your next brief. Read sub-questions as topics to cover. For link-level evidence — which URLs an engine actually cited and which pages it read — use [Citations](/citations) and [Sources](/sources). Group those briefs before you write. [Topics and labels](/topics-and-labels) shows whether a gap is one prompt or a whole theme, and [Improve](/improve) turns the theme into specific work. The same prompts split by engine, scored rather than decomposed. How an answer becomes a mention, a citation, and a score. The pages an engine read while drafting, including ones it never showed. How many prompts and engines your plan scans, which sets how much lands here. # Glossary Source: https://docs.fixaeo.com/glossary Every FixAEO term defined once, with the page that owns it. Twenty-odd words, each used in one specific way. A glossary entry here tells you what FixAEO means by a term, not what the industry means by it. Where a word is contested — "citation" is the worst offender — this page states the product's definition and links the page that owns it. Start with the first pair. Most confusion in AI search reporting traces back to those two words. ## Mention and citation These are the load-bearing pair. They're counted separately because they're separate events, and a brand can have one without the other. ### Mention A mention is your brand named in the text of an AI answer. No link required. It counts when the answer names you by brand name or by domain. Mentions are what your [Visibility Score](/metrics/visibility-score) is built from. You read the raw ones on the Mentions tab — see [Understanding AI answers](/understanding-answers). ### Citation A citation is a link to a website that the engine put on screen. A citation chip, a footnote, or a row in the sources panel. If a reader could see it and click it, it's a citation. A citation to your domain is not a mention of your brand, and the two are tracked on different pages. See [Citations](/citations). All four combinations happen. Mentioned and cited. Mentioned but not cited. Cited but not mentioned. Neither. Read the two numbers side by side to see which one you're in. ## The metrics Four headline numbers, plus one that lives on the Sources page. [Metrics overview](/metrics-overview) covers how they fit together. ### Visibility Score The percentage of captured AI answers that mention your brand. This is the core metric and the headline number on your [dashboard](/dashboard). [Understanding AI answers](/understanding-answers) covers where those answers come from. See [Visibility Score](/metrics/visibility-score). ### Share of voice Your share of every brand mention in the window, yours and your rivals' together. It's the only headline metric that accounts for what competitors are doing. See [Share of voice](/metrics/share-of-voice). ### Position How early an answer names you, averaged across the answers that named you. `#1.8` means you're named second on average. Lower is better. See [Position](/metrics/position). ### Sentiment How an answer describes you once it names you, scored positive, neutral, or negative. Only mentions are classified, so an answer that ignored you can't drag it down. See [Sentiment](/metrics/sentiment). ### Cite rate A per-domain number on [Sources](/sources): when an engine pulls a domain, how often it actually shows it on screen. A low cite rate on your own domain means engines read your site and rarely credit it. That's a different problem from not being read at all. ## What you set up The inputs you control. Get these right and everything downstream follows. ### Prompt One question FixAEO asks the AI engines on your behalf, in your brand's region. Your tracked prompt list is the denominator behind every metric, so it decides what you're measuring. See [Setting up your prompts](/setting-up-prompts). ### Prompt pool Your plan's prompt allowance, shared across every brand on the account rather than granted per brand. On Lite you get 15 prompts in total, not 15 each. This is the limit people misread most often. See [Plans and limits](/plans-and-limits). ### Topic A theme your prompts get grouped into. FixAEO uses the word twice. Setup topics are the ones you pick to steer prompt generation. Topic clusters are what an AI model derives from your live prompt list. The two drift apart over time, on purpose. See [Topics and labels](/topics-and-labels). ### Label A tag you define yourself, in two kinds — tags and personas. Unlike topic clusters, labels never regroup themselves. You can create them today, but attaching one to a prompt isn't built yet, so there's nothing to filter by so far. See [Topics and labels](/topics-and-labels). ### Persona The second kind of label, meant for the audience behind a prompt rather than its subject matter — "startup founder" instead of "pricing". See [Topics and labels](/topics-and-labels). ### Brand profile The structured description of your brand that FixAEO stores and reuses. It holds what you do, your key products, your factual claims, your differentiators, your target audience, and your tone. It grounds prompt generation and the [Improve](/improve) recommendations. See [Your brand profile](/brand-profile). ### Competitor A rival brand, either detected automatically in an answer or pinned by you. Pinned competitors appear in the ranking even at zero mentions, so you can watch one before it shows up. See [Tracking competitors](/competitors). ## How is the data collected? The measurement machinery. [Understanding AI answers](/understanding-answers) is the long version. ### Engine One AI product FixAEO asks your prompts. There are nine: ChatGPT, Claude, Gemini, Perplexity, Copilot, DeepSeek, Grok, AI Overviews, and AI Mode. Which ones run for you is a plan limit — paid tiers below Enterprise get a six-engine set. See [Plans and limits](/plans-and-limits). ### Model channel One engine viewed as a distribution channel for your brand. The AI engines screen (the "AI engines" tab under Answer Engine Insights) reports Visibility Score per channel, so you can see that Perplexity runs fifteen points above AI Overviews on an identical prompt list. See [AI engines](/model). ### Region The country a prompt is asked in. Every answer FixAEO stores carries the region it came from. It has to. The same prompt run for the US and for Germany can name entirely different brands. New brands default to the United States, in English. See [Your brand profile](/brand-profile). ### Scan One pass of your tracked prompts across your plan's engines, for your brand's region. Scans are scheduled by plan, and free accounts get none. See [Plans and limits](/plans-and-limits). ### Snapshot One day's aggregated numbers for one brand and region — mentions, answers captured, sentiment counts, and the per-engine split. Snapshots are what the trend chart on your [dashboard](/dashboard) reads. A day with no captured answers shows as a gap in the chart rather than a false zero. ### Fan-out The sub-questions an engine implicitly answers inside one complex query. Ask for "best CRM for 10-person SaaS startups" and the engine is really answering four or five smaller questions, each backed by different sources. See [Query fan-outs](/fanouts). Fan-outs are a best guess, not ground truth. Most engines don't expose their reasoning, so FixAEO infers the breakdown. Treat it as a strong hint about why a competitor won a sub-question, not as a transcript. ### Network source A URL the engine's page fetched in the background while drafting and then never displayed. It's the complement of a citation: everything an engine read, minus what it put on screen. The gap between the two is the difference between what an engine considered and what it was willing to show. See [Sources](/sources). ## What counts as traffic from AI? Two different things arrive at your site from AI, and they need separate tools. ### Agent traffic Requests from AI crawlers, browsing agents, and MCP clients — GPTBot, ClaudeBot, and the rest. These don't run JavaScript, so tag-based analytics can't see them at all. FixAEO reads them from your server logs or a tag, depending on plan. See [Agent analytics](/agent-analytics). ### Referral traffic Humans who read an AI answer and then clicked through to your site. These are real sessions and normal analytics does see them. FixAEO reads them from your Google Analytics connection. See [Attribution](/attribution). When someone asks "how much traffic is AI sending us", find out which of these two they mean. Agent traffic is bots reading you. Referral traffic is people arriving. They move independently, and a healthy crawl rate with flat referrals is a real and common pattern. ## The AI Marketer FixAEO's in-app assistant, and what it spends as it works. ### AI Marketer An assistant inside FixAEO that reads your live data — visibility, citations, prompts, competitors — and answers questions or drafts work from it, in plain language. It runs on paid plans, and every result waits for your review before anything happens. See [AI Marketer](/ai-marketer). ### Work credit The monthly allowance the AI Marketer spends as it runs. Heavier tasks cost more credits than lighter ones. Paid plans only. See [AI Marketer](/ai-marketer). ## Enterprise identity How larger teams sign in and stay provisioned. Both are Enterprise-plan features. ### SSO Single sign-on. Sign in through your company's OpenID Connect provider instead of a magic link or Google. OIDC only — SAML is not supported. Enterprise plan. See [Single sign-on and SCIM](/sso-and-scim). ### SCIM The standard your identity provider uses to provision and deactivate FixAEO members automatically, so access follows your directory. Enterprise plan. See [Single sign-on and SCIM](/sso-and-scim). Where the answers come from, and how often they're collected. The four numbers and which one to watch first. The raw answers every term on this page is counted from. The mention-versus-citation split in full. # Improve Source: https://docs.fixaeo.com/improve Turn your scan data into a short list of fixes you can ship. Improve reads your own numbers and hands back a ranked list of things to do about them. Improve is a per-brand action board. An LLM reads a brand's recent scan data and writes up to five concrete recommendations. Each one carries a rationale, an impact rating, an effort rating, and a short checklist of steps. You mark them off as you ship them. ## How does Improve build a recommendation? Open **Improve** in the sidebar. Every brand you track gets its own block with a **Generate** button. Clicking it sends that brand's data to one AI provider and waits for the answer, which takes a few seconds. What goes into that request: * Brand name, domain, and industry * Current [Visibility Score](/metrics/visibility-score) and the change across the window * Visibility Score broken out per engine, so the model can spot one weak engine * The domains AI engines already cite for your brand, from [Citations](/citations) * Your Knowledge Base, if you've filled in the **Knowledge** tab on your brand page The window is the last 30 days, scoped to the brand's primary region. These recommendations are written by an LLM. They're grounded in numbers you can see elsewhere in the app, but they're suggestions, not guarantees. Read them before you act. ## What does a recommendation look like? Every card has the same anatomy: a short imperative headline, one to three sentences of rationale, an impact rating, an effort rating, and three steps. The rationale quotes your own numbers, in lines like "Claude cites you at 12% vs ChatGPT 45% — fix the gap by...". Where you've filled in a Knowledge Base, the wording comes from yours rather than from invented claims. Every action is meant to be doable by two people in under two weeks — if a card reads like a quarter of work, treat that as a sign to split it. Cards carry one of two badges. **From your data** means the LLM ran on your brand. **Template** means it didn't return usable output, so you got a curated starter action instead. There are three of those, and they're good first moves for any brand: publish an `llms.txt` manifest, add FAQPage schema to your top pages, and outflank the top-cited competitor on one prompt. FixAEO Improve board showing 6 open actions across 3 brands, with Template cards titled Outflank the top-cited competitor on one prompt, Add FAQPage schema to top pages, and Publish an llms.txt manifest, each rated high impact with a three-step checklist ## Working the board Four statuses, shown as counts at the top of the page and as filter pills below them. FixAEO Improve page: a Stripe recommendation card showing HIGH IMPACT · HIGH EFFORT next to the title 'Outflank the top-cited competitor on one prompt', with a three-step checklist on the right for identifying the prompt, writing a long-form page, and publishing it | Status | How you get there | | ----------- | -------------------------------------------------------------------------------------------------------------- | | Open | Where every new card lands | | In progress | Click **Start** | | Done | Click **Mark done**. The card dims but stays visible | | Dismissed | Click **Dismiss**. The card leaves the default board, and the **Dismissed** filter lists what you've set aside | The tick boxes next to each step are a scratchpad for working through a card in one sitting, not a saved record of progress. The card's status is what carries across sessions. Improve page status filter row: clicking Open, then In progress, then Done narrows the card list — the counter next to the chips drops from 4 actions to 1, and the visible card swaps from Publish an llms.txt manifest to Add FAQPage schema to Outflank the top-cited competitor on one prompt ## Does Improve refresh on its own? Yes. FixAEO regenerates recommendations in the background for brands with real scan data, so the board stays current even for a brand you haven't opened in a while. Pressing **Generate** yourself adds to the board rather than replacing it, and you won't collect duplicates of a card you're already working on. ## Turning a card into a draft If you've connected a WordPress site, each card gets a **Publish to WordPress** button. It creates a draft post from that recommendation and links you to the WordPress editor. Nothing goes live until you publish it there. See [WordPress](/integrations/wordpress). ## Why is my board empty? Improve needs scan data to reason about. A brand with no completed scans gives the model nothing to say. * No brands yet? Start at [Your brand profile](/brand-profile). * Brands but no scans? Scheduled scans start on a paid plan. See [Plans and limits](/plans-and-limits). * Want sharper cards? Fill in the Knowledge tab. Advice grounded in your real products beats generic advice every time. Once you've shipped a few actions, watch the effect on [your dashboard](/dashboard). Then set up [Alerts](/alerts) so you hear about the next drop without checking. Improve hands you the ranked to-do list. The [AI Marketer](/ai-marketer) can draft the work behind those actions, so each card is a starting point rather than a blank page. # Inbox Source: https://docs.fixaeo.com/inbox Every alert that fired on your account, in one filterable list. Inbox is the history of your fired alerts. Nothing else lands here. That's worth stating plainly, because the name suggests a notification feed. It isn't one. [Scan-completion emails, billing notices, and product news](/email-notifications) never appear. One thing writes to the Inbox: an [alert rule](/alerts) that tripped. Inbox page with active rules but zero fired events: an Armed and quiet card explains that your rules are set and watching, with reassurance that fires will land here plus email, Slack, and webhook depending on the rule Once rules start firing, the same page fills up. Each event carries the rule name, the quantified change, the brand that moved, and which channels delivered — click through to see the underlying scan snapshot. Inbox page with three fired alert events: Visibility drops 10 points (down 8.4%), Negative sentiment spike (5 negative mentions in window), and New competitor enters the ranking (Height). Each card shows an EMAIL delivery chip and an unread dot; the camera zooms in on the top drop card so the rule name and delta read clearly. ## When does something arrive? Only after a scan. Each time a scheduled scan writes a new daily snapshot for a brand, FixAEO checks your active rules against it. Rules that trip record an event, and that event is the card you see here. So an empty Inbox usually means no scan has run since you created the rule. The Inbox needs a plan with scheduled scans behind it. Cadence per plan is on [Plans and limits](/plans-and-limits). A rule also stays quiet for the cooldown you set on it, so a brand that moves every day won't fill this page with the same card. ## Reading a card Each card carries the rule's name, a one-line summary, the brand it's about, and how long ago it fired. Unread cards get a dot and a tinted border. The summary carries the figure that tripped the rule. A drop or rise card reads "Visibility Score dropped 22%", a sentiment card "4 negative mentions in window", a new-competitor card names the brand that appeared, and a surge card names the rival and how far it climbed. The alert email and the webhook payload carry the same event with the before and after numbers. Along the bottom sit delivery chips — **email**, **slack**, **webhook** — one per channel that actually delivered. A failed channel adds a red **delivery error** chip. Delivery is recorded per channel, so a Slack outage doesn't hide the fact that the email went out. Two actions: **Investigate** opens that brand's trends section, and **Mark read** clears the dot. Clicking the brand name does both. ## Filtering the list Three controls, pinned at the top of the list so they stay reachable. * **Type** — all types, drops, rises, sentiment, new competitor, competitor surge. * **Brand** — only shown when you track more than one brand. * **Unread only** — a checkbox. The list loads 10 cards at a time. **Load older fires** appends the next 10 rather than replacing them. Changing a filter starts a fresh list. ## How does the unread badge work? The number next to **Inbox** in the sidebar counts events you haven't marked read. It updates on its own while the app is open, and the same count drives the badge in the mobile nav and the chip beside the page title. **Mark all read** clears every unread event on your account at once, ignoring the filters you have set, and tells you how many it cleared. Re-marking a read event keeps its original timestamp, so the history stays in the order things actually happened. ## Why is my Inbox empty? The page tells you which of three situations you're in. You have no rules at all, so nothing can fire. The button takes you to [Alerts](/alerts) to create one. Rules exist and events exist, but your current filter combination excludes all of them. **Clear filters** resets type, brand, and unread in one click. Rules exist, no filters are set, and nothing has tripped. This is the normal healthy state. Check that your brand is actually scanning if it lasts for weeks. ## History and retention Events stay indefinitely. Nothing prunes them on a schedule, and there's no retention setting to change. Deleting an alert rule stops it firing immediately but leaves its past events in place, so your history stays readable after you retire a rule. Deleting your account removes every event with it. Treat the Inbox as the record and email as the notification. Set the rules you actually want interrupting you to email in [Alerts](/alerts), and use this page for the weekly read-back of what moved. ## Related * [Alerts](/alerts) — creating the rules that fill this page, and picking delivery channels. * [Email notifications](/email-notifications) — the emails FixAEO sends, and how to turn each category off. * [Understanding your dashboard](/dashboard) — where **Investigate** drops you to see what happened. * [Visibility Score](/metrics/visibility-score) — the metric behind the drop and rise rules. # Industry benchmarks Source: https://docs.fixaeo.com/industry How much of the AI conversation in your category you own. Your visibility number is only half the story. This page is the other half. Industry benchmarks rank you against every other brand the AI engines name when they answer your prompts. Visibility asks "am I mentioned?" This page asks "am I mentioned more than the people I compete with?" Everything on it is scoped to one brand and one time window — 7, 30, 90, or 365 days, opening on 30. ## What does share of voice measure? Your slice of all brand mentions, not your slice of all answers. When an AI engine names five brands and one of them is you, share of voice is how often you're the one being named. FixAEO Industry page: the Industry Trends chart plots share-of-voice over 30 days for Linear (highlighted yellow as YOU) against Jira, Asana, Monday.com, ClickUp, Notion, and Other It runs across every prompt, every engine, and every region in your tracked set, over the window you picked. [Share of voice](/metrics/share-of-voice) has the full treatment. The change column is the movement in that share against an earlier baseline inside the same window, expressed in percentage points. A brand that goes from 8% to 11% shows +3.0. A methodology popover in the page header explains the metric in place. It's there so anyone you send a screenshot to can see what they're looking at. ## The four cards **Industry Trends** plots share of voice over time for your closest competitors, plus you, plus an "Other" bucket for everyone else. The legend stays short enough to read. **Industry Ranking** is the table: every brand ordered by share, with its mention count and its change. Click any competitor row to open a drilldown. Your own row isn't clickable — there's nothing to compare you against yourself. **Competitive Quadrant** plots share of voice on the x-axis against sentiment on the y-axis. Dot size is how many classified mentions a brand has. **Tracked competitors** is where you pin rivals so they show up even at zero mentions. See [Tracking competitors](/competitors). FixAEO Industry page with the Industry Trends chart plotting 30 days of share of voice for Linear, marked YOU, against Jira, Asana, Monday.com, ClickUp, Notion and an Other bucket ## What's in the competitor drilldown? The most useful thing on the page. Click a competitor and you get three numbers up top: their cells, your cells, and the gap between the two. A **cell** is one prompt × one AI engine × one day. So 10 tracked prompts × 6 engines × 30 days = 1,800 cells in a 30-day window. The drilldown counts how many of those cells named the competitor vs how many named you. Industry page: scrolling to Industry Ranking, clicking the Notion row opens a competitor drilldown modal with Notion cells 142, Linear cells 160, total gap -18, and a Prompts tab listing the queries where Notion is beating Linear with per-engine chips and the latest example answer for each The drilldown counts cells. The ranking table above it counts mentions. Those are different units, so the competitor's number in the drilldown won't match the mention count on the row you just clicked. Read each one on its own terms rather than reconciling them. Then two tabs. **Prompts** lists the questions where they were named, sorted by the biggest gap first. The top row is the single query you're losing hardest. **Sources** lists the domains that got cited in the answers naming them. Take that list to [Sources](/sources) and you have a target list. ## Why is my quadrant empty? It needs at least two brands with sentiment data in the window — you plus a rival, or two rivals. Below that it shows a message instead of a chart. Industry page scrolled to the Competitive Quadrant card: share-of-voice on the x-axis and sentiment score on the y-axis, with your brand plotted top-right in the Leaders zone against grey Niche dots to the upper-left, an orange Defender dot bottom-right, and a red Laggard dot bottom-left — the four quadrants populated at once The dividers aren't fixed. The vertical line sits at the middle of the shares plotted, the horizontal at neutral sentiment. That gives you four reads. High share and positive sentiment is leading. Low share and positive is niche. High share and negative means you're defending. Low on both means you're behind. [Sentiment](/metrics/sentiment) explains the underlying score. ## Which denominator should you use? There's a toggle, but only once you've pinned at least one competitor. * **All brands** measures you against every brand the scanner detected. The honest baseline. * **Tracked only** measures you against your pinned competitors. Answers "how am I doing against the four rivals I care about". Use All brands for reporting. Use Tracked only when you're steering a specific fight. Don't mix them in the same slide. ## Narrowing the view Filters stack across the whole page: engine, topic, and region. Engine chips only offer the engines your plan scans — see [Plans and limits](/plans-and-limits). Topic chips come from your clusters on [Topics and labels](/topics-and-labels). The region row gives you something to choose between once a brand has data from more than one country. You set a brand's scan region on [Your brand profile](/brand-profile). Two extras sit in the header. **CSV** exports the current filtered ranking. **Email weekly digest** sends a summary of the week to your inbox straight away. Connect [Google Analytics](/integrations/google-analytics) and you can overlay real sessions on the trend chart. Share of voice going up while sessions stay flat is worth investigating. ## The weekly digest also arrives on its own You don't have to press that button. The same digest sends automatically, once a week, whether or not you ask for it. * **When.** On the weekday you signed up, counted in UTC. Sign up on a Tuesday and it arrives on Tuesdays. * **What's in it.** Every brand on your account in one email, not one email per brand. * **When it doesn't arrive.** A week with nothing worth reporting is skipped silently, so a gap isn't a bug. To stop it, turn off **Product & tips emails** under **Email preferences** in Settings. That switch is broader than the digest — it covers marketing and lifecycle mail generally, including welcome and setup-reminder emails. Account, billing and security mail always sends regardless. Scan-complete notifications aren't governed by that switch; they have their own separate control. See [Alerts](/alerts) for the notifications you configure yourself. ## Related * [Tracking competitors](/competitors) — detection, pinning, and how many to track. * [Share of voice](/metrics/share-of-voice) — the metric definition. * [Understanding your dashboard](/dashboard) — the compact ranking widget. # Chrome extension Source: https://docs.fixaeo.com/integrations/chrome-extension Check any site's AI visibility from your browser toolbar. Check any website's AI visibility in one click, without opening FixAEO. The FixAEO Chrome extension is a toolbar popup that scores whatever site you're currently on. Click the icon on a competitor, a prospect, or a client site. You get a visibility score out of 100, plus the prompts where that brand shows up. There's no sign-in and no setup. ## Install it The listing is called "AEO Quick Check — AI search visibility". [Install it here](https://chromewebstore.google.com/detail/kdjkndbpcaoiechiclpbeipnfbcjaflh) — it's free. Open the puzzle-piece menu in your toolbar and pin FixAEO. The extension only runs when you click it, so an unpinned icon is a buried feature. Try a brand you already know. The popup opens straight into a result. ## What the popup shows When the domain has been scanned before, you get four things: * A score donut out of 100 for that brand's presence in AI answers * The domain and when it was last scanned * The top three prompts where the brand appears, each with its rank * A button through to the full report on fixaeo.com The extension reads the root domain, not the exact page. Open `blog.uber.com` and it scores `uber.com`. The popup shows one combined score with no engine-by-engine breakdown. That's deliberate — the free surface is a quick check. Per-engine numbers live in the app, on your [dashboard](/dashboard) and in [Metrics overview](/metrics-overview). ## What if the site hasn't been scanned? You'll see a "Not scanned yet" state instead, with a **Run free AEO scan** button. That button hands you off to fixaeo.com, where the standard free-scan flow runs and takes about thirty seconds. The result is cached rather than pushed back to the popup, so reopen the popup on that domain to see the score. Every later check on it is instant. If you'd rather not wait, the same screen links out to the public leaderboard. Some pages can't be scored at all: `chrome://` pages, new tabs, IP addresses, and localhost. The popup tells you when the current tab isn't supported. ## Recent checks The extension keeps a short history of the domains you've looked up. That list lives in your browser's local storage on your machine. It's never sent to FixAEO and never synced to your Google account. Incognito lookups are never added to this list. The check itself still runs the same way, so the root domain still goes to `api.fixaeo.com` — only the history entry is skipped. ## What can it access? The extension requests two Chrome permissions: `activeTab` and `storage`. `activeTab` only grants access at the moment you click the toolbar icon, so the extension can't read tabs in the background. The only network permission is for `api.fixaeo.com`. Only the root domain leaves your device. No page content, no cookies, no query strings, no full URLs. Extension scores come from FixAEO's public free-scan data, not from your tracked brands. They're a fast read on any domain, including ones you don't track. For your own brand, trust the numbers in the app — see [Visibility Score](/metrics/visibility-score) for what those measure. ## Where to go next The extension is a scouting tool. When you find a brand worth watching properly, add it as a competitor and start tracking the prompts it wins on. * [Tracking competitors](/competitors) — turn a one-off check into ongoing monitoring * [Quickstart](/quickstart) — set up your own brand in the app # Google Analytics Source: https://docs.fixaeo.com/integrations/google-analytics Tie AI referral traffic to sessions, conversions, and revenue. Connect GA4 to find out whether AI traffic actually converts. The Google Analytics integration reads your GA4 property and pulls out the sessions that arrived from an AI assistant. FixAEO then reports those sessions, the conversions they drove, and the revenue behind them — broken down by engine and by landing page. FixAEO Integrations page: Inbound data section listing the Google Analytics 4 card (Moat tag) with Read-only attribution description and Connect Google Analytics 4 button, plus Google Search Console below ## Connect it Find the Google Analytics 4 card and click Connect. FixAEO asks Google for read-only analytics access. It can't change your property, your events, or your goals. Google returns every GA4 property you can see. Choose the one that matches this brand's website. Connecting requires a paid plan. If your GA4 lives on a different Google account, or a Workspace admin owns it, the card walks you through those cases directly. See [Plans and limits](/plans-and-limits) for what your tier includes. ## How does FixAEO decide a session came from AI? It reads GA4's `sessionSource` on every session and matches it against a fixed list of AI hostnames. A match tags the session with an engine: | Engine | Matched sources | | ---------- | -------------------------------------- | | ChatGPT | `chatgpt.com`, `openai` | | Claude | `claude.ai`, `anthropic` | | Perplexity | `perplexity.ai` | | Copilot | `copilot.microsoft.com` | | Gemini | `gemini.google.com`, `bard.google.com` | | Grok | `grok.com`, `x.ai` and its subdomains | | DeepSeek | `deepseek` | | Meta AI | `meta.ai` | Anything else is ignored. FixAEO pulls date, source, landing page, and country, then syncs hourly. This measures clicks, not answers. Most AI answers never produce a click — the reader gets what they needed and moves on. Treat AI sessions as a floor on your real impact, not a total. [Visibility Score](/metrics/visibility-score) measures the part that never shows up in analytics. ## What you get **Attribution page.** Three tiles for AI sessions, AI conversions, and AI revenue, with a chart you can switch between all three. Below that, a per-engine bar chart and your top landing pages. Revenue uses your GA4 property's own reporting currency. **Dashboard card.** Once connected, an AI attribution snapshot appears on your [dashboard](/dashboard) alongside your visibility numbers. **Industry overlay.** [Industry benchmarks](/industry) can overlay GA4 traffic on the share-of-voice chart, so you can see whether a share gain moved anything real. Until you connect, the Attribution page shows a connect prompt rather than empty charts. ## Reading the landing pages report The landing page list is the most actionable part. It tells you which of your pages AI assistants are sending people to, which is usually a shorter list than you'd guess. Cross-reference the top AI landing pages against [Sources](/sources). A page that AI engines both cite and send traffic to is your strongest asset in the category. Update it before you write anything new. ## Disconnecting Disconnecting stops the hourly sync. Data already pulled stays where it is. You can reconnect or switch to a different property at any time from the same card. ## Related pages * [Google Search Console](/integrations/google-search-console) — the ranking half, plus the rank-but-not-cited gap * [Agent analytics](/agent-analytics) — AI crawlers hitting your site, which GA4 can't see * [Metrics overview](/metrics-overview) — how every FixAEO number is defined # Google Search Console Source: https://docs.fixaeo.com/integrations/google-search-console Find the queries you rank for on Google but AI never cites. Connect Search Console to see where your SEO wins aren't turning into AI citations. The Google Search Console integration pulls your organic Google performance into FixAEO and lines it up against your AI visibility. It powers the **SEO** tab: your clicks, impressions, CTR, and average position, plus the part worth connecting for — a list of the queries you already rank for where AI engines don't mention you. ## Connect it Find the Google Search Console card and click Connect. FixAEO asks Google for read-only Search Console access. It can't change anything in your property. Google returns every site you're verified on. Choose the one that matches this brand. The list shows your permission level for each. Search Console connects per brand, so a multi-brand account can point each brand at its own property. Switch brands and connect again. Connecting requires a paid plan — see [Plans and limits](/plans-and-limits). ## What you get Once connected, the **SEO** tab under **Answer Engine Insights** fills in (the screen is titled **Search performance**). Four tiles across the top: clicks, impressions, average CTR, and average position. Below that sit a trend chart, your top queries, your top pages, and a country breakdown with a donut. Ranges are 7, 30, 90, and 365 days. FixAEO syncs hourly. Google itself lags roughly two to three days, so the page shows when the last pull happened. ## How does the rank-but-not-cited gap work? This is the part worth connecting for. FixAEO takes your top 50 organic queries by clicks and checks each one against your tracked prompts and your AI answers. Every query lands in one of three states: | State | What it means | | ------------------ | ------------------------------------------------------------------- | | Tracked and cited | You rank on Google and AI engines mention you | | Tracked, not cited | You rank on Google, FixAEO asks AI this question, and you're absent | | Untracked | You rank on Google and FixAEO isn't asking AI about it at all | Each row carries a gap score, and the table sorts on it — highest first. The score weighs the traffic a query already brings you against how well you rank for it, so queries with real click volume and a strong Google position rise to the top. High clicks plus a strong rank plus no AI mention is the clearest signal that AI is skipping content Google already trusts. Untracked rows get a **Track** button. One click turns that query into a tracked prompt, and the row re-classifies on the next scan. The card shows how much of your prompt pool is left and disables the button at the cap — see [Setting up your prompts](/setting-up-prompts). Start with the untracked rows that have real click volume. You're already ranking for those questions, which means the content exists — you just aren't measuring whether AI repeats it. ## Prompt suggestions from your organic queries Below the gap card, FixAEO clusters your untracked Google queries into suggested prompts. The cached set loads for free every time. Regenerating it costs a model call, so it only runs when you press Refresh. Anything you've already tracked disappears from the list. ## Disconnecting Disconnecting stops the hourly sync. Your existing performance data stays in place, it just stops updating. If Google revokes the token, the app shows a reconnect banner rather than silently freezing. ## Related pages * [Google Analytics](/integrations/google-analytics) — the traffic-and-revenue half of the same picture * [Improve](/improve) — turn a gap row into an actual content task * [Citations](/citations) — see which sources AI cites instead of you # WordPress Source: https://docs.fixaeo.com/integrations/wordpress Capture AI crawlers server-side and publish drafts from Improve. WordPress connects to FixAEO in two separate ways, for two different jobs. The **plugin** captures AI crawler traffic on your server, where a JavaScript tag can't reach. The **publishing connection** lets you push [Improve](/improve) recommendations into WordPress as draft posts. They're independent — set up either, or both. ## The Agent Analytics plugin Bots like GPTBot and ClaudeBot never run JavaScript, so a browser tag never records them. This plugin runs inside PHP on every request, spots the AI-looking ones, and forwards them to your [agent analytics](/agent-analytics) dashboard. Open **Crawl insights** under Agent analytics, choose WordPress in the platform picker, and download the `.zip`. Your site ID is shown on the same panel. In WordPress go to Plugins → Add New → Upload Plugin, upload the zip, then activate it. Open Settings → FixAEO Agent Analytics. Paste your API key and site ID, then save. Create the API key in your FixAEO account settings. The settings page has a test button. It confirms the key, the site ID, and your plan in one round trip. Requires WordPress 5.5 or later and PHP 7.4 or later. Server-side ingestion needs a paid plan — see [Plans and limits](/plans-and-limits). ### How does it avoid slowing your site down? Capture is one small database write, and it happens during PHP shutdown after the page has already been sent to the visitor. Nothing blocks a request. Uploads run separately: a background job fires every five minutes, batches up to 2,000 buffered rows, and posts them to FixAEO. Non-AI requests do almost nothing. Every step swallows its own errors. A bad key or an unreachable endpoint can't break your site, and the buffer is pruned as it drains, so it stays small even when delivery is failing. ### What leaves your server For AI-looking requests only: the user agent, request path, referer, visitor IP, HTTP status, request method, and a timestamp. Behind a CDN, with the proxy setting on, it also sends the visitor's country. No post content and no customer data. The plugin sees requests that reach PHP. If a full-page cache — Varnish, an nginx cache, or a CDN — serves a page before WordPress runs, that hit isn't counted. On a heavily cached site, use an edge connector instead. The setup panel lists the options. The settings page also has a "Behind a proxy / CDN" toggle for correct visitor IPs, plus an enable switch. A status panel shows what's captured, what's pending, and when the last send happened. Deleting the plugin removes the buffer table, the settings, and the scheduled job. Deactivating keeps your settings and just stops the job. ## The publishing connection Separately, you can connect a WordPress site so FixAEO can publish content recommendations to it. Open Integrations in the app and add a site using a WordPress Application Password. That's built into WordPress 5.6 and later, so no plugin is needed. Once connected, [Improve](/improve) gets a "Publish to WordPress" action. Recommendations always land as **drafts**, never live posts. You review and publish from the WordPress editor yourself. Connections bind to the current brand, so a multi-brand account keeps its sites separate. You can re-validate a connection at any time, or disconnect it — after which publishing needs a fresh connection. ## Related pages * [Agent analytics](/agent-analytics) — what the captured crawler data tells you * [Improve](/improve) — where publishable recommendations come from * [Google Analytics](/integrations/google-analytics) — the human half, for visitors AI sends you * [Plans and limits](/plans-and-limits) — which tiers get server-side capture # Welcome to FixAEO Source: https://docs.fixaeo.com/introduction Track how AI models answer questions about your brand. FixAEO shows you where AI models mention your brand, and where they name someone else instead. FixAEO is an AI search analytics tool. It runs the questions your customers ask into nine AI engines on a schedule. Then it records three things: whether you were named, which competitors were named instead, and which websites the engine cited to build its answer. ## How does FixAEO get its data? You give it a list of prompts, which are the questions your customers actually ask. FixAEO runs each prompt against each AI engine on a schedule and stores what came back. Every AI visibility number is counted from those stored answers, not estimated from traffic data. Because the answers are stored, you also get history. You can see the week a competitor first appeared, or the week a source stopped citing you. ## Which AI engines does FixAEO track? Nine of them: ChatGPT, Claude, Gemini, Perplexity, Copilot, DeepSeek, Grok, AI Overviews, and AI Mode. Your plan decides how many you get. Lite and Growth scan six engines: ChatGPT, Gemini, Perplexity, Copilot, AI Overviews, and AI Mode. Enterprise scans all nine. The full matrix is on [Plans and limits](/plans-and-limits). Tour of the FixAEO Integrations page: the Google Search Console inbound card, WordPress publishing section with a Connect a site CTA, and the Outbound Delivery row hosting Slack and generic webhook stubs — the full set of surfaces alongside the Google Analytics 4 card that lives higher on the page The free plan runs no scheduled scans. You can finish setup and pick prompts, but numbers stay empty until you're on a paid tier. ## What you get here that you don't get elsewhere **A free plan.** One brand and three tracked prompts. Scheduled scans start on a paid plan. **A Chrome extension.** Check a site's AI visibility from your browser without opening the dashboard. See [Chrome extension](/integrations/chrome-extension). **Agent analytics.** AI crawlers like GPTBot and ClaudeBot don't run JavaScript, so normal analytics never sees them. FixAEO reads your server logs instead and shows you which pages those crawlers actually fetched. See [Agent analytics](/agent-analytics). **An MCP server.** Point your own ChatGPT, Claude, or Cursor at your FixAEO data and ask it questions directly. See [MCP server](/mcp/introduction). **An in-app AI Marketer.** An assistant that answers questions about your own data and drafts work from it, on paid plans. Every result waits for your review before anything happens. See [AI Marketer](/ai-marketer). **Industry benchmarks.** Your share of voice against every brand the engines mention in your category, not just the rivals you thought to add. See [Industry benchmarks](/industry). ## Where should you start? Four steps from a bare domain to your first result. Your prompt list decides every number downstream. Get it right first. What each number means, and which one to actually watch. Turn a low Visibility Score into work you can ship this week. If you'd rather start with the vocabulary, read the [Metrics overview](/metrics-overview) first. It defines Visibility Score, share of voice, position, and sentiment in one page. ## Questions? Email [support@fixaeo.com](mailto:support@fixaeo.com). Feedback on these docs is welcome too. # Managing brands Source: https://docs.fixaeo.com/managing-brands Add, switch between, and remove the brands you track. One brand equals one domain you're tracking in AI answers. A brand in FixAEO is a domain plus everything attached to it. That means a profile, a set of prompts, one scan region, and every answer collected against it. Multi-region tracking is on the roadmap. Your plan sets how many you get — 1 on Free, 2 on Lite, 5 on Growth, 10 on Enterprise. See [Plans and limits](/plans-and-limits). FixAEO Brands page showing three tracked brands — Linear, Stripe, Insitechat — with a Using 3 of 5 plan cap and per-card scan cadence, then clicking Add brand opens the four-step setup wizard on a blank form ## Adding a brand Every brand goes through the same setup wizard, including your second and third. It's in the sidebar when you track two or more brands, and also when you track one and your plan has room for another — that's your path to adding the second. If one brand is your cap, the link is hidden and the page redirects to that brand instead. This opens the setup wizard on a blank form. Your existing brand's draft isn't carried over. Same flow as your first brand — domain, AI-drafted profile, topics, prompts — then the results screen. Adding a brand skips the "how did you hear about us" step, so it's four steps instead of five. Running the wizard is what makes a brand scan. It sets the brand's scan region and its prompt set in one go, and a brand needs both before there's anything to measure. That's why there's no quick "just add a domain" shortcut. The prompt step is capped at whatever's left in your shared pool, not at 15. If your other brands have already used the whole pool, the wizard says so and links you to free some up rather than letting you dead-end. See [Setting up your prompts](/setting-up-prompts). The **Add brand** button is disabled once you're at your brand cap. ## Switching between brands The sidebar cell at the top shows the brand you're looking at. It's a link to that brand's overview page rather than a switcher. Two ways to switch: open the one you want from **Brands**, or click a chip in the **Your other brands** row on your dashboard. Most analytics pages also accept a `?slug=` in the URL, so a link to one brand's view is shareable. Analytics pages follow the brand in the sidebar cell, so switching brands re-scopes [Citations](/citations), [Sources](/sources), [Topics](/topics-and-labels), and the rest at the same time. Check which brand is selected before you read a number that surprises you. ## Removing a brand Hover a brand card on the Brands page and click the trash icon. The confirm dialog asks you to type the brand name, and the **Stop tracking** button stays disabled until what you type matches. Capitalization and stray spaces don't matter. Stop tracking is what the button does — your past data stays and you can add the same brand back later. Removing a brand frees a brand slot and the prompts attached to it. ## How the brand cap and prompt pool interact These are two separate limits and they pull against each other. Brands are capped per account. Prompts are capped per account too, in a **shared pool** across every brand you track. Adding a brand doesn't add prompts. So on Lite, with 2 brands and 15 prompts, you're deciding how to split 15 questions across two businesses. Nine and six is a normal split. Twelve and three is fine too. What you can't do is run 15 on each. Plan the split before you add the second brand. Each brand's Prompts panel shows how much of the pool is in use — see [Setting up your prompts](/setting-up-prompts). On a one-brand plan, finishing setup with a different domain switches which brand you track. FixAEO reads it as "track this one instead" and stops tracking the old one. Upgrade first if you meant to keep both. ## Where do you compare brands? The **Portfolio** page, which appears in the sidebar once you track two or more. It opens with four account-wide numbers: brands tracked, average visibility, total mentions, and positive sentiment share. Below sit a Top performers list, a Needs attention list, and a per-engine bar chart averaged across brands. Last comes a sortable table with each brand's visibility, change, mentions, and last scan date. Filter by range and region, or export to CSV. With one brand, Portfolio is hidden and redirects to your [dashboard](/dashboard). There's nothing to compare. Use Portfolio to pick where to spend the week, then drop into that brand's [Industry benchmarks](/industry) to find out who's beating it. ## Related * [Plans and limits](/plans-and-limits) — brand caps and the shared prompt pool. * [Your brand profile](/brand-profile) — the fields that make a new brand's numbers work. * [Understanding your dashboard](/dashboard) — the per-brand home screen. * [Team and workspaces](/team-and-workspaces) — a teammate's access can be limited to specific brands. # MCP server Source: https://docs.fixaeo.com/mcp/introduction Query your FixAEO data from Claude, Cursor, or any MCP client. Point your AI assistant at your own AI visibility data, then just ask. ## What is MCP? The Model Context Protocol is an open standard for connecting an assistant to a data source. You add a server once in your client's config. The client then discovers what that server can do and calls it on your behalf, mid-conversation. FixAEO ships one: a read-only view of your account, served over HTTP at `https://api.fixaeo.com/api/mcp` and authenticated with the same API key the public API uses. ## What you get Fourteen tools. Every one is a read of data you already own, and each runs the same code the dashboard runs, so the numbers match what you see in the app. "Which competitors out-cite me on Perplexity this month." No SQL, no export, no CSV round-trip. Your assistant gets the underlying JSON, so it can spot movement you'd skim past in a chart. Each tool calls the existing handler in-process. There's no second pipeline to drift. Google Search Console data and AI-crawler traffic sit beside your visibility data, in one place. Prefer not to wire up your own client? The in-app AI Marketer uses these same read-only data tools inside FixAEO, on paid plans. See [AI Marketer](/ai-marketer). ## The honest shape of it The MCP server needs a paid plan. On a free account the connection is refused rather than returning empty results. See [Plans and limits](/plans-and-limits). Three things are worth knowing before you wire it up. **It's read-only.** There are no write tools. You can't add a brand, create a prompt, trigger a scan, or change a setting through MCP. Everything runs as a GET against your own workspace. If you want to change something, use the app. **There are no prebuilt prompts.** Some MCP servers ship a prompt library your client shows as slash commands. This one doesn't register any, and it exposes no resources either. Tools are the whole surface. [Use cases](/mcp/use-cases) is the substitute — a list of questions that map cleanly onto the tools. **Three tools depend on an integration.** `get_search_performance` and `get_seo_aeo_gap` need Search Console wired up. `get_agent_traffic` needs the tracking tag or a server-log connector. All fourteen still appear in your client's tool list — the three just come back empty until the brand is connected, which reads as "no data" rather than "not connected". A free account can still create an API key and read the public REST API. The paid gate is specific to MCP. ## Start here Config blocks for Claude Desktop, Claude Code, and Cursor, plus where the API key comes from. All fourteen tools, their parameters, and what each one returns. Sixteen questions worth asking once you're connected. The same data over plain REST, when you want a script rather than an assistant. # Setup Source: https://docs.fixaeo.com/mcp/setup Connect the FixAEO MCP server to Claude, Cursor, or another client. The server is remote. There's nothing to install and nothing to run locally — you point your client at one URL and pass your API key as a bearer token. | Setting | Value | | --------- | ---------------------------------------------------------- | | URL | `https://api.fixaeo.com/api/mcp` | | Transport | Streamable HTTP, stateless, JSON responses | | Auth | `Authorization: Bearer YOUR_FIXAEO_API_KEY` | | Plan | Any paid plan. Free accounts are rejected at the handshake | Open [Settings](https://fixaeo.com/app/settings#security) and find the **API keys** card, below two-factor and your active sessions. Select **Create API key** and give it a name you'll recognise later. The full key is shown once, at creation. FixAEO stores only a SHA-256 hash of it, so nobody — including support — can read it back. Copy it somewhere safe before you close the dialog. Keys start with `fixaeo_`. How many active keys you can hold depends on your plan: one on Free, three on Lite and Growth, fifty on Enterprise. Revoking a key frees the slot. Pick your client below, paste the config, restart the client. Ask your assistant: "list my brands in FixAEO". You should get back your brands with their slugs. That slug is the input to every brand-specific tool, so it's the right first call anyway. ## Client configuration ```bash Claude Code theme={null} claude mcp add --transport http fixaeo https://api.fixaeo.com/api/mcp \ --header "Authorization: Bearer YOUR_FIXAEO_API_KEY" ``` ```json Claude Code JSON theme={null} { "mcpServers": { "fixaeo": { "type": "http", "url": "https://api.fixaeo.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_FIXAEO_API_KEY" } } } } ``` ```json Claude Desktop theme={null} { "mcpServers": { "fixaeo": { "command": "npx", "args": [ "-y", "mcp-remote", "https://api.fixaeo.com/api/mcp", "--header", "Authorization:${AUTH_HEADER}" ], "env": { "AUTH_HEADER": "Bearer YOUR_FIXAEO_API_KEY" } } } } ``` ```json Cursor theme={null} { "mcpServers": { "fixaeo": { "url": "https://api.fixaeo.com/api/mcp", "headers": { "Authorization": "Bearer YOUR_FIXAEO_API_KEY" } } } } ``` **Claude Code** speaks HTTP natively. The command above writes the JSON block for you; add `--scope project` if you'd rather commit it to a project `.mcp.json` than keep it local. **Claude Desktop** needs the `mcp-remote` bridge, which runs through `npx` and needs Node installed. FixAEO's server authenticates with a bearer header and doesn't implement OAuth, so the built-in connector flow has no way to send your key. Note the header value has no space in the `args` array — some clients mangle spaces there, which is why the token lives in `env` instead. Config file lives at `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS. **Cursor** reads `~/.cursor/mcp.json` for every project, or `.cursor/mcp.json` for one. Cursor also expands `${env:VAR}` inside header values, so you can keep the key out of the file. Treat the key like a password. It reads every brand, mention, citation, and Search Console figure in your account. If a config file with a key in it is going into git, use the environment-variable form instead. ## Why does the server look unreachable? Almost always the plan. The paid gate runs before the MCP protocol does, so a free account gets a 403 on the handshake itself — your client reports "failed to connect" rather than "connected with zero tools". The header didn't arrive. On Claude Desktop this usually means the `mcp-remote` args are malformed. On Cursor, check that `headers` sits inside the server object, next to `url`. The key is wrong, or it's been revoked. Keys are shown once, so a truncated copy-paste is the common cause. Create a fresh one in Settings and swap it in. Exactly what it says. This also fires if a subscription lapsed: your effective plan drops back to Free, and MCP goes with it. The public REST API keeps working on Free. Your client tried to send several calls in one HTTP request. The server rejects batches on purpose, so one request can never fan out into several database reads. Turn batching off in the client. The public surface allows 120 requests a minute per IP, shared between the REST API and MCP. The response carries a `Retry-After` header. Normal conversational use never comes close. Each call gets a 30-second budget. If a wide query hits it, narrow the window — ask for `7d` instead of `90d`, or filter to one engine. ## Related pages * [Tools reference](/mcp/tools) — every parameter each tool accepts * [Use cases](/mcp/use-cases) — questions to try once you're connected * [Plans and limits](/plans-and-limits) — what each tier includes * [Security](/security) — how keys are stored and what deleting your account removes # Tools reference Source: https://docs.fixaeo.com/mcp/tools All fourteen FixAEO MCP tools, their parameters, and what they return. Every tool is a read. None of them write, and all of them are scoped to the account the API key belongs to. ## Conventions A few things hold across the whole surface, so they're stated once here. **`slug`** is a brand's `brand_slug`, from `list_brands`. Call that first. **`range`** accepts `7d`, `30d`, or `90d`, and `365d` also resolves. Anything else, including an empty value, falls back to 30 days. **`region`** is a lowercase ISO 3166-1 alpha-2 country code — `us`, `gb`, `de`, `in`. See [Managing brands](/managing-brands) for how a brand's scan region is set. **Engine slugs** are `chatgpt`, `claude`, `gemini`, `perplexity`, `copilot`, `deepseek`, `grok`, `ai_overviews`, and `ai_mode`. Your plan decides which of them are actually scanned, so a filter on an engine you don't scan returns nothing. Five tools take no brand parameter and read your newest brand: `list_citations`, `list_topics`, `get_model_channels`, `get_industry_metrics`, and `get_industry_gap`. If you track more than one brand and the numbers look like the wrong company, that's why. Use `get_visibility` and `list_mentions`, which take a slug, when you need a specific brand. The REST twins accept a `brand_slug` parameter to pick another brand; the MCP tools don't expose it. Each tool below names the REST endpoint it mirrors. Those endpoints live under the [Customer API](/api/introduction) tab and return byte-identical JSON. ## Account-level tools ### list\_brands Which brands does this account track, and what are their slugs? No parameters. Returns `brands` — one record per tracked brand with `id`, `brand_slug`, `brand_name`, `domain`, `vertical`, `site_id`, `scan_frequency_hours`, `next_scan_at`, and `added_at` — plus `count` and your plan's brand `limit`. Newest brand first. Mirrors `GET /api/public/v1/brands`. No visibility numbers here — this is the brand record only. For scores call `get_visibility` with the slug, or `get_model_channels` for the per-engine split. ### get\_portfolio How is every brand in the account doing, side by side? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------------------------ | | `range` | string | No | Defaults to 30 days | | `region` | string | No | Defaults to `us`, with language `en` | Returns `totals`: brand count, brands with data, average visibility and its delta (both percentage points), total mentions and responses, and the sentiment split. Then `top` and `bottom` — your five best and five worst brands, ordered to match the percentages the app prints — plus `per_engine` averages across the portfolio. A `brands` array carries each brand's latest snapshot, and `regions` lists the locales your brands are tracked in. Brands with no snapshot yet appear with `has_data: false`. Mirrors `GET /api/public/v1/portfolio`. `totals.avg_citation_rate` and `totals.avg_citation_delta` are both in percentage points, and both are weighted by how much data each brand has. A brand with far more responses moves them further, so neither is a plain average across brands. ### list\_citations Which sources do AI engines cite when they answer questions in your space? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | --------------------------------------------- | | `range` | string | No | Defaults to 30 days | | `region` | string | No | Bare region code, such as `us` | | `engines` | string | No | Comma-separated, such as `chatgpt,perplexity` | | `q` | string | No | Substring match on the domain, lowercase | Returns `domains`, ranked by citation count, each with `rank`, `domain`, `count`, `share`, `category`, the `engines` that cited it, `latest_date`, `is_owned`, `is_competitor`, and — when FixAEO has them — domain authority, top content type, sentiment counts, and a seven-day `series_7d` sparkline. Alongside that: `total_citations`, `categories`, `bucket_counts`, a `time_series`, the available engine and region facets, and `rank`, which is your own highest-placed domain and its position (`0` when you're not cited at all). Mirrors `GET /api/public/v1/citations`. `q` matches the domain string only, not full URLs. Searching for a path or a page title returns nothing. ### list\_topics Which themes do your tracked prompts cluster into? No parameters. Returns `themes` — each with `theme`, `count`, and a `tier` of 20, 30, 50, or 70 that drives the size of the chip in the app — plus `total_keywords`. Scoped to your newest brand. Mirrors `GET /api/public/v1/topics`. Background on how clusters are built is in [Topics and labels](/topics-and-labels). ### get\_model\_channels Which engines mention you most, and which ignore you? No parameters. Returns `engines`, one row per engine with `engine`, `score`, and `delta`, plus a fixed `range` of `30d`. `delta` is the movement across that window. Mirrors `GET /api/public/v1/model`. `score` here runs from 0 to 100. The `citation_rate` in `get_visibility` is a fraction from 0 to 1. Convert before you compare the two. ### get\_industry\_metrics Where do you sit against competitors, and who's gaining? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | -------------------------------------- | | `range` | string | No | Defaults to 30 days | | `engine` | string | No | One engine slug, not a list | | `region` | string | No | Defaults to the brand's primary region | Returns `ranking`: every brand mentioned in your space, with `name`, `mentions`, `share` as a percentage, `delta` in percentage points, `is_own`, `is_pinned`, and a `sentiment` split. Alongside it, a daily `time_series` carries per-competitor counts. An `own` block gives your total mentions, total responses, and average position. You also get `tracked_competitors`, `last_refreshed`, and a `methodology` block that spells out the denominator and the share formula. Mirrors `GET /api/public/v1/industry/metrics`. See [Industry benchmarks](/industry) for how to read it. ### get\_industry\_gap Which sites cite your competitors but never you? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ----------------------- | | `range` | string | No | Defaults to 30 days | | `region` | string | No | Empty means all regions | Returns up to 50 `gaps`, each with `domain`, `citations`, `competitor_chats`, `distinct_competitors`, the `competitors` named, the `engines` involved, a `gap_score`, and `latest_date`. Your own domains are excluded, as are the websites of competitors you pinned yourself. Mirrors `GET /api/public/v1/industry/gap`. Pinning a competitor puts its domain on file, which is what lets the gap list exclude it. Pin the rivals you care about and the results get sharper. See [Competitors](/competitors). ## Brand-scoped tools ### get\_brand What's on file for one brand? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------ | | `slug` | string | Yes | From `list_brands` | Returns a single `brand` object with the same fields one `list_brands` row carries. It's the brand record, not a scorecard — there are no scores in this response. Errors with "brand not found" when the slug isn't one of yours. Mirrors `GET /api/public/v1/brands/{slug}`. ### get\_visibility How has this brand's visibility moved over time? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------- | | `slug` | string | Yes | From `list_brands` | | `range` | string | No | Defaults to 30 days | Returns `snapshots`, one row per day, each with `date`, `citation_rate`, `brand_mentions`, `total_responses`, the sentiment split, `per_engine` rates, a `ranking` map, `ranking_per_engine`, and `sentiment_per_competitor`. The window is echoed back as `range`, `from`, and `to`. A brand with no scans yet returns an empty array, not an error. Mirrors `GET /api/public/v1/brands/{slug}/snapshots`. `citation_rate` is a 0..1 fraction. The app derives the headline percentage from the counts instead — `brand_mentions / total_responses × 100` — so do the same if you want a number that matches the dashboard. [Visibility score](/metrics/visibility-score) explains why. There's no region parameter here. The tool reads the brand's primary active region, which is the same scope the dashboard uses. ### list\_mentions Which answers actually named this brand? | Parameter | Type | Required | Notes | | ----------- | ------ | -------- | ------------------------------------ | | `slug` | string | Yes | From `list_brands` | | `sentiment` | string | No | `pos`, `neu`, or `neg` | | `region` | string | No | Overrides the brand's primary region | Returns up to 100 `mentions`, newest first, each with `id`, `engine`, `date`, `sentiment`, `confidence`, the `prompt` that produced it, a `snippet` of the answer, and `source_url` when the engine cited one. Any `sentiment` value outside the three listed is rejected as an error rather than ignored. Mirrors `GET /api/public/v1/brands/{slug}/mentions`. [Understanding answers](/understanding-answers) covers how these are classified. ### list\_prompts What is FixAEO asking on this brand's behalf? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------ | | `slug` | string | Yes | From `list_brands` | Returns `prompts` with `id`, `prompt_text`, `is_active`, `intent` (informational, commercial, or transactional), `created_at`, `last_snapshot_date`, and — for prompts accepted from a Search Console suggestion — `source` and `source_query`. Also `count` for this brand, `used_total` across the whole account, and your plan `limit`. The prompt pool is shared account-wide, which is why the last two differ. Mirrors `GET /api/public/v1/brands/{slug}/prompts`. There's no per-prompt visibility figure in this response. `last_snapshot_date` tells you when a prompt was last scanned; use `list_mentions` to see which answers named you. ## Integration-dependent tools All fourteen tools appear in your client's list on `api.fixaeo.com`. These last three still need a per-brand integration to have anything to return. Without one they answer with an empty result rather than an error, which reads as "no data" instead of "not connected". ### get\_search\_performance How does this brand do on Google organic search? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------ | | `slug` | string | Yes | From `list_brands` | Returns a daily `metrics` series with `clicks`, `impressions`, `ctr`, and `position`, window `totals` where position is impression-weighted, the top 25 `top_queries` and `top_pages`, and up to 25 `countries` with their click share. The window is fixed at 30 days — this tool takes no range. Needs [Google Search Console](/integrations/google-search-console) connected for that brand; without it you get an empty series rather than an error. Mirrors `GET /api/public/v1/brands/{slug}/search-performance`. ### get\_seo\_aeo\_gap Which Google queries do you rank for but get no AI mentions on? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------ | | `slug` | string | Yes | From `list_brands` | Takes your top 50 organic queries by clicks over the last 30 days and classifies each one. Returns `rows` with `query`, `seo_clicks`, `seo_impressions`, `seo_position`, `matched_prompt_id`, `gap_score`, and `ai_state`, which is one of: | `ai_state` | Meaning | | ------------------- | -------------------------------------------------- | | `untracked` | No tracked prompt matches this query | | `tracked_cited` | A prompt matches, and AI engines mention you | | `tracked_not_cited` | A prompt matches, and AI engines don't mention you | Rows come back sorted by `gap_score`, highest first, so the biggest opportunity is at the top. Needs Search Console connected. This one has no REST twin — it's only on MCP and on the app's [Search performance](/seo) page. ### get\_agent\_traffic Which AI crawlers are visiting the site, and what are they reading? | Parameter | Type | Required | Notes | | --------- | ------ | -------- | ------------------ | | `slug` | string | Yes | From `list_brands` | Returns a 30-day view. `totals` covers `hits`, `unique_visitors`, `active_bots`, pages crawled, and a `failure_rate`. Breakdowns arrive as `by_bot`, `by_vendor`, `by_kind`, `by_folder`, `by_country`, and `by_status`, with `per_engine_hits` beside them. You also get `top_page` — the single most-crawled URL — `series_by_bot` trend lines, and `previous` for the prior equal-length window. `channels` splits hits between the JavaScript tag and server-log ingestion. Needs the tracking tag or a server-log connector; see [Agent analytics](/agent-analytics). Mirrors `GET /api/public/v1/brands/{slug}/agents`. ## Related pages * [Use cases](/mcp/use-cases) — questions that map onto these tools * [Setup](/mcp/setup) — client configuration and troubleshooting * [Metrics overview](/metrics-overview) — what each returned field means # Use cases Source: https://docs.fixaeo.com/mcp/use-cases Sixteen questions to ask once the MCP server is connected. The server ships no prebuilt prompts, so this page is the substitute. Every question below is answerable with the tools your assistant already has, and each one names the tools that do the work. Start any session with "list my brands in FixAEO". The slug that comes back is what the brand-specific tools need, and your assistant will reuse it for the rest of the conversation. ## Visibility **"Pull my visibility for the last 30 days and tell me which days moved most."** `get_visibility` returns one row per day. Ask for the percentage as `brand_mentions / total_responses`, which is how the dashboard computes it — the raw `citation_rate` field is a 0..1 fraction and not the number you see in the app. **"Which engine mentions us least, and is it getting worse?"** `get_model_channels` gives a 0..100 score per engine over 30 days, with a delta that compares the recent half of that window against the older half. It's the fastest read on whether one engine has gone quiet on you. **"Show me every negative mention from the last month, with the prompt that produced it."** `list_mentions` with `sentiment: "neg"`. Each row carries the prompt, an answer snippet, the engine, and the source URL the engine cited. **"Across all my brands, which one is falling behind?"** `get_portfolio` returns top and bottom performers plus a per-brand table with deltas. Useful the moment you track more than one brand. **"Which of my tracked prompts have never been scanned?"** `list_prompts` marks each prompt with `last_snapshot_date`. A prompt with no date has never produced a snapshot, which usually means it was added since the last scan. ## Competitors **"Who owns the biggest share of AI mentions in my category, and how far behind am I?"** `get_industry_metrics` returns a ranked list with each brand's share as a percentage and a flag for your own row. **"Which competitor gained the most ground over the last 90 days?"** Same tool with `range: "90d"`. Each row's `delta` is in percentage points against the oldest snapshot in the window. **"Build me a weekly table of my mentions versus my pinned competitors."** `get_industry_metrics` again — the `time_series` block has per-day counts for every competitor, and `tracked_competitors` tells your assistant which ones you pinned deliberately. ## Sources **"What are the top 20 domains AI cites in my space, and am I anywhere on that list?"** `list_citations` ranks the domains and returns a `rank` block with your own highest-placed domain. Position `0` means you're not cited at all. **"Which sites cite my competitors but never me? Rank them by opportunity."** `get_industry_gap`. Each row carries a gap score, which competitors were cited there, and which engines did the citing. Your own domains are already excluded. **"Do Perplexity and ChatGPT cite different sources for us?"** One unfiltered call is enough — every domain row lists the engines that cited it. If you'd rather see each engine on its own, call `list_citations` twice with `engines: "perplexity"` and `engines: "chatgpt"` and diff the two lists. ## Agent traffic **"Which AI crawlers hit the site this month, and are any of them getting errors?"** `get_agent_traffic` returns a per-bot breakdown, a failure rate, and a per-status-code table. A rising failure rate usually means the crawler is hitting redirects or blocked paths. **"What single page do AI crawlers read most, and which section of the site do they prefer?"** Same tool. `top_page` is the most-crawled URL, and the per-folder breakdown shows whether they're living in your docs, your blog, or your product pages. ## Search gap **"Which Google queries do we rank for but get ignored by AI? Give me the top 10 by opportunity."** `get_seo_aeo_gap` classifies each of your top organic queries. Filter to `ai_state: "tracked_not_cited"` and take the first rows — they're already sorted so the biggest opportunity is first. **"Which of my best organic queries aren't tracked as prompts yet?"** Same response, `ai_state` of `untracked`. Those are candidates to add on [Setting up your prompts](/setting-up-prompts). **"Compare our Google clicks with our AI visibility over the same 30 days."** `get_search_performance` for the search side, `get_visibility` for the AI side. Both cover 30 days by default, so the windows line up without any extra work. The strongest habit is a weekly loop. Ask for `get_visibility`, `get_industry_metrics`, and `get_industry_gap` in one go, then have your assistant write the summary. It has the raw rows, so it catches the movement a chart flattens out. ## Related pages * [Tools reference](/mcp/tools) — every parameter, and what each field means * [Setup](/mcp/setup) — config blocks and the common connection errors * [Improve](/improve) — what to do with a gap once you've found one # Metrics overview Source: https://docs.fixaeo.com/metrics-overview The four numbers FixAEO tracks, and what each one answers. Four metrics, four different questions. Here's how they fit together. FixAEO measures your brand in AI answers with four metrics: Visibility Score, share of voice, position, and sentiment. They share one raw material — a captured answer per prompt, per engine, per region, per day — but each divides it up differently. ## What does each metric answer? | Metric | The question it answers | Denominator | Scale | | --------------------------------------------- | ------------------------------- | ------------------------ | ------------------------------ | | [Visibility Score](/metrics/visibility-score) | Am I named at all? | Answers captured | 0–100% | | [Share of voice](/metrics/share-of-voice) | Am I named more than my rivals? | All brand mentions | 0–100% | | [Position](/metrics/position) | Am I named early or late? | Answers that mention you | 1 and up, lower is better | | [Sentiment](/metrics/sentiment) | Is the mention any good? | Mentions of your brand | Positive, neutral, or negative | ## Which one should you watch? Start with [Visibility Score](/metrics/visibility-score). It's the headline number on your [dashboard](/dashboard), and it has to move before the others mean much. You can't rank well in an answer you're absent from. Once you're named consistently, [share of voice](/metrics/share-of-voice) becomes the more useful number. It's the only one of the four that accounts for what your competitors are doing. Treat [position](/metrics/position) and [sentiment](/metrics/sentiment) as quality checks on the first two. High visibility with a weak position means you're the afterthought in every list. High visibility with negative sentiment is worse than not being named. These four can disagree, and that's the point. If your Visibility Score climbs while share of voice drops, the engines are naming more brands overall — you included, but so is everyone else. ## Where do the numbers come from? Every metric comes from captured answers, not from estimates or modeling. FixAEO asks each AI engine your tracked prompts, reads the answer a real user would see, and counts what's in it. That makes your prompt list the denominator behind all four numbers. Get it right first — see [Setting up your prompts](/setting-up-prompts). Because every engine is asked separately, some numbers can also be read one engine at a time. [Visibility Score](/metrics/visibility-score) splits per engine on the AI engines tab, and [share of voice](/metrics/share-of-voice) splits behind the engine filter on the [Industry](/industry) tab: FixAEO Model page breaking Visibility Score out per engine for the demo brand Linear: ChatGPT 57.0%, Gemini 54.0%, Perplexity 66.0%, Copilot 61.0%, and AI Overviews 51.0%, each with a 7-day delta and a sparkline Each metric page defines its number and tells you how to read it, including the cases that show a blank instead of a zero. [Understanding AI answers](/understanding-answers) covers the sampling behind all four. Where each metric appears, and which panel to read first. The raw captured answers behind every number. Share of voice, ranking, and the competitive quadrant. Turn a weak metric into work you can ship. # Position Source: https://docs.fixaeo.com/metrics/position How early in an AI answer your brand gets named. Being named fifth in a list of five isn't the same as being named first. Position is the average ranking of your brand across the answers that name it. FixAEO shows it as a single number on the industry ranking card, like `#1.8`. Lower is better. Industry Ranking card on the Industry page: the AVG POSITION pill in the top-right shows #1.0 for Linear, meaning across every answer that names Linear it lands first on average, while the share-of-voice column below shows the brand ranked #4 overall on volume ## How is position calculated? The position metric averages your ranking across all the responses where your brand appears. Answers that never name you are left out, so being absent can't drag the number down. A lower number means the engines lead with you. Around 1 or 2, you're usually the first or second brand a reader meets. Higher up the scale, readers work through several competitors before they reach you — same answer, much less attention. Until an answer names your brand, position shows an em-dash rather than a number. An empty position isn't a bad position. ## What's a good position? Under 3 is strong, because most list-shaped answers name three to seven brands. Around 5 or higher means you're consistently the afterthought — present, but below the options a reader will actually click. There's a catch worth naming. A brand named twice, first both times, will beat a brand named two hundred times averaging 2.5. Never read position without volume beside it. Keep [Visibility Score](/metrics/visibility-score) and your mention count on screen at the same time. ## How do you improve it? Position follows authority, so the levers are the same ones that move visibility, just aimed higher. Look at which [Sources](/sources) the engines pull first, and work on being cited by the sites that get read early. Then check [Topics](/topics-and-labels). Position usually varies sharply by theme. You'll often find you lead on one topic and trail on another, which is a much more actionable finding than a single average. Whether you're named at all. Read this one first. How your mention count stacks up against rivals. Read the raw answers behind the average. All four metrics and how they fit together. # Sentiment Source: https://docs.fixaeo.com/metrics/sentiment How AI answers describe you once they name you. A mention isn't automatically a good mention. Sentiment is how an AI answer talks about your brand when it names you. Every mention is classified as positive, neutral, or negative. ## How is sentiment calculated? Sentiment is calculated from the overall tone and context of the answer — how it frames your brand, not whether it mentions you at all. Alongside the three buckets, FixAEO reports a single average on a scale from −1 to +1, where 0 is neutral. You'll see it in three shapes. Your [dashboard](/dashboard) shows a single word, the largest of the three buckets. The competitive quadrant on the [Industry](/industry) tab plots you above or below a neutral line on its vertical axis. The [Citations](/citations) table breaks it down per domain, so you can see which sites describe you well. Brand Overview tab: the Sentiment (30D) KPI tile shows the dominant-bucket word Positive-leaning above a positive/neutral/negative stacked bar and 1468 classified mentions, with a Break down link to the full Mentions view Before anything has been classified, FixAEO shows an em-dash rather than a score. A blank is honest; a zero would read as "perfectly neutral" when the truth is "no data." ## What's a good sentiment score? Most healthy brands sit close to 0, and that's fine. AI answers are written to be descriptive, not promotional, so a category-leading brand still collects plenty of flat, factual mentions. Read the direction rather than the exact figure. A steady lean toward positive is good. A drift toward negative over several weeks is the one that needs attention, and the negative mentions themselves will tell you why. ## How do you improve it? Start by reading the answers. [Understanding AI answers](/understanding-answers) lets you filter to negative mentions and see the exact wording. Negative sentiment usually traces back to a source. Use [Sources](/sources) to find which sites the engines read on those prompts. An outdated review or an old comparison page is a common culprit, and fixing the source fixes the answer. Set a sentiment alert so you hear about a shift instead of finding it later. See [Alerts](/alerts). Whether you're named at all, before you judge how. The other axis of the competitive quadrant. How early in the answer you show up. All four metrics and how they fit together. # Share of voice Source: https://docs.fixaeo.com/metrics/share-of-voice Your slice of every brand mention in your category. Visibility tells you whether you're named. Share of voice tells you whether you're winning. Share of voice is how often the AI engines name you, as a percentage of every brand mention across your tracked prompts. If the engines named brands 400 times last week and 48 of those were you, your share of voice is 12%. ## How is share of voice calculated? FixAEO reads every brand name out of each captured answer, not just yours. Your count is divided by the total. ``` share of voice = your mentions ÷ all brand mentions × 100 ``` The change beside it is reported in percentage points, not percent. You choose the denominator. **All brands** divides by every brand the scanner detected in your answers. **Tracked only** divides by you plus the competitors you've pinned, which gives a tighter read on a specific rival set. Industry Trends chart on the Industry page: clicking the Notion, ClickUp, and Monday.com legend chips hides those lines one at a time, and the remaining series re-normalize so Linear (highlighted yellow as YOU) stands out cleanly against the smaller field Hiding a competitor doesn't remove them from the calculation — it just clears the line off the chart so you can compare against a specific subset. The percentages on the y-axis stay tied to the denominator you picked above. The denominator toggle only appears once you've pinned at least one competitor. Until then, every share is measured against all detected brands. See [Tracking competitors](/competitors). You'll find share of voice on the [Industry](/industry) tab in three shapes. It's the ranking table, the trend chart for the top five brands plus you, and the x-axis of the competitive quadrant. ## What's a good share of voice? It depends entirely on how crowded your category is. In a four-brand market, 25% is average. In a forty-brand market, 10% would make you the clear leader. So read the rank and the direction, not the raw number. Being third and climbing beats being second and sliding. Share of voice is zero-sum. Yours can fall while your [Visibility Score](/metrics/visibility-score) rises, which just means the engines started naming more brands per answer. ## How do you improve it? Click any competitor row on the [Industry](/industry) tab to open their drilldown. It lists the prompts where they get named and you don't. That's your work queue. From there, check the [Sources](/sources) tab in the same drilldown to see which sites are feeding the engines their answer. Getting cited on those sites is usually the fastest route. [Improve](/improve) turns the gaps into concrete recommendations. Whether you're named at all, before you worry about rivals. The other axis of the competitive quadrant. Pin rivals so they always appear in your ranking. All four metrics and how they fit together. # Visibility Score Source: https://docs.fixaeo.com/metrics/visibility-score The share of AI answers that mention your brand. Visibility Score is the number FixAEO leads with, and the one worth watching daily. Visibility Score is the percentage of AI-generated answers that mention your brand. If FixAEO captured 120 answers about your category yesterday and you were named in 42 of them, your Visibility Score is 35%. Brand page Trends tab for Linear: switching the range from 30d to 90d expands the Visibility Score trend chart to 53 daily snapshots covering ~2 months, showing 54.2% latest with a 23.9% climb versus the window start Flat stretches at zero happen when scanning was paused — a canceled subscription, a hit rate limit, or a manual pause on the brand. The line resumes the day scans do. ## How is Visibility Score calculated? FixAEO captures one answer per prompt, per engine, per region, per day. Each answer is checked for your brand name. The score is a plain ratio of those two counts. ``` Visibility Score = brand mentions ÷ answers captured × 100 Per engine: engine score = mentions on that engine ÷ answers captured on that engine × 100 ``` The change beside the score is reported in percentage points, not percent. Visibility Score counts mentions, not links. An answer that recommends you in prose without linking to you still counts. For link-level data, see [Citations](/citations). ## What's a good Visibility Score? There's no universal benchmark, and you should distrust anyone who hands you one. Your prompt list sets the denominator, so two brands with different prompt lists aren't comparable. Five branded questions will score far higher than fifty category questions, and mean far less. Two comparisons do work. The first is your own trend over 30 days. The second is your rank against rivals in the [Industry](/industry) tab, where everyone shares your denominator. ## How do you improve it? Start with the per-engine split on [AI engines](/model). A weak overall score is usually one or two engines, not all of them. Check the engine rail on your [dashboard](/dashboard) first, so an outage doesn't read as a drop. Then find the themes dragging it down. [Topics](/topics-and-labels) groups your prompts so you can see where you're never named. [Sources](/sources) shows which sites the engines read before answering. [Improve](/improve) turns that into specific work. If the score looks wrong rather than low, your prompt list is usually the cause. See [Setting up your prompts](/setting-up-prompts). The same mentions, measured against your competitors instead of against answers. Not just whether you're named, but how early. How the answer describes you once it names you. All four metrics and how they fit together. # AI engines Source: https://docs.fixaeo.com/model Your Visibility Score, split by AI engine. AI engines is your [Visibility Score](/metrics/visibility-score) broken out one engine at a time. It's the **AI engines** tab under **Answer Engine Insights**. A single overall score hides the thing you can act on. A brand at 30% is rarely 30% everywhere. It's usually strong on two engines, invisible on a third, and drifting on a fourth. This page puts each engine on its own card so you can see which one is moving the average, and in which direction. ## What's on each card Every card carries four things: the engine's name and icon, its latest score, a change chip against a week ago, and a small trend line across the range you picked. FixAEO Model page: the per-engine grid loads with ChatGPT, Gemini, Perplexity, Copilot, AI Overviews cards, then zooms into ChatGPT showing 57% visibility, -4.0 vs 7d delta, and the 30-day sparkline The latest score is the most recent day that engine actually produced data, not simply the last day in the window. If an engine failed yesterday, the card falls back to the last day it worked instead of printing a zero it didn't earn. The same rule applies inside the trend line. Missing days are drawn as gaps, not as drops to the floor. That matters more than it sounds. An engine that went down for a day looks exactly like a brand collapse if its missing day is drawn as a zero. ## How do you read the change chip? The chip shows how that engine's score has moved over the past week, in percentage points. If the engine has no usable day to compare against, the chip is left off entirely rather than measured against nothing. Small moves are labelled flat instead of being given an arrow, so day-to-day noise doesn't read as a trend. ## Which engines appear here? Only engines that returned at least one day of data inside the window. Cards keep a fixed order so they don't reshuffle when you switch ranges. The set you could ever see is set by your plan, not by this page. Lite and Growth scan six engines. Enterprise scans nine. Free accounts get no scheduled scans at all, so there's nothing here to draw. [Plans and limits](/plans-and-limits) has the full split. An engine missing from this page but present on your plan usually means it hasn't produced a result for this brand yet. The engine health rail on your [dashboard](/dashboard) is the better place to tell "not scanned yet" apart from "scanned and failing". ## Why does an engine sit at zero? Zero and absent mean different things, and the difference matters. A card showing zero means that engine answered your prompts and named you in none of them. That's a visibility problem, and it's real. An engine with no card at all means it produced no data in the window. That's a coverage problem, and chasing content won't fix it. When a card is genuinely at zero, [Query fanouts](/fanouts) is the fastest next step. It shows the sub-questions that engine actually answered for the prompt, which usually explains the gap better than the score does. ## Range, brand, and region The range tabs cover 7d, 30d, 90d and 1y, and default to 30 days. The trend line redraws over whichever window you pick, so a card's sparkline on 1y is a year of daily points, not a fixed 30. A trend line needs more than a single day of data before it draws. Until then the card shows a dashed placeholder rather than a lone dot. Lines fill in over the first few days of a new brand, or of a newly added engine. The page follows the brand selected in the app, and also accepts a `?slug=` parameter so you can link straight to one brand's engine view. See [Managing brands](/managing-brands). AI engines shows one region at a time — your brand's primary region. There's no region picker on this page, so a brand tracking two countries shows one of them here. [Industry](/industry) and [Citations](/citations) let you choose. ## What this page doesn't cover AI engines answers "where am I strong", not "why". It has no prompt list, no topic split, and no citation data. Pair it with the pages that do. Read the cards as a spread, not as one number. A 20-point gap between your best and worst engine is a content problem you can name. If every engine sits in the same narrow band, your whole category reads you the same way. Then the lever is your prompt list, not any single engine. Per-engine scores are available over the API as well. See the [API reference](/api/introduction) for the endpoint and its parameters. The metric on these cards, and how the ratio is built. Why a given engine answered the way it did. Turns a weak engine into a list of things to write. How Visibility Score sits alongside the other three metrics. # Plans and limits Source: https://docs.fixaeo.com/plans-and-limits What each plan includes, and how the shared prompt pool works. Four plans, four sets of limits. Here are the exact numbers. Your plan controls a few things. How many brands you can track, how many prompts you can run, which AI engines answer them, and how often FixAEO rescans. It also sets your AI Marketer credits and workspace seats, covered below. Most everything else in the product works the same on every tier. FixAEO paywall showing the 7-day free trial with four plan cards side by side — Lite Monthly at $29, Lite Annual at $25 with SAVE 14% badge, Growth Monthly at $79, and Growth Annual at $68 with SAVE 14% — plus the six tracked AI engines above the grid ## The plan matrix | Plan | Brands | Tracked prompts | Engines scanned | Rescan frequency | | ---------- | ------ | --------------- | --------------- | ------------------ | | Free | 1 | 3 | None | No scheduled scans | | Lite | 2 | 15 | 6 | Every 72 hours | | Growth | 5 | 50 | 6 | Daily | | Enterprise | 10 | 500 | 9 | Every 6 hours | Two of those columns are reported back to you on each brand's Overview tab. Brand Overview tab for Linear showing PROMPTS TRACKED 10 / 50 with the note 'Using 10 of your plan's 50', and NEXT SCAN 4 Aug, 23:05 running 'Every 24 hours' Every brand has one scan region today — the country you pick during setup, which FixAEO localizes your prompts to. Multi-region tracking is on the roadmap; when it ships, paid plans will be able to track a brand across several countries at once. See [Your brand profile](/brand-profile). Pricing lives at [fixaeo.com/pricing](https://fixaeo.com/pricing). Dollar figures stay off this page so they can't go stale here. ## What else your plan sets The matrix covers the headline limits. A few other allowances move with your plan too. **AI Marketer work credits.** The [AI Marketer](/ai-marketer) runs on a monthly credit allowance: Free none, Lite 100, Growth 400, Enterprise custom. It's a paid-plan feature. Credits meter the measured cost of the AI work, so heavier tasks draw more than light ones. Your remaining balance shows in [Settings → Usage](/usage). **Workspace seats.** How many people can be in your workspace: Free 1, Lite 1, Growth 3, Enterprise custom. Both active members and pending invitations count against the seat limit. See [Team and workspaces](/team-and-workspaces). **Responses analyzed per month.** Roughly how much answer volume each scan cycle takes in — about 900 on Lite and about 9,000 on Growth. Free is minimal, since it's Gemini-only with no scheduled scans; Enterprise is custom. **Single sign-on and directory sync are Enterprise-only.** A workspace admin can connect an OpenID Connect provider and SCIM directory sync on the Enterprise plan. See [Single sign-on and SCIM](/sso-and-scim). ## How does the shared prompt pool work? This is the limit people misread, so it's worth stating plainly: **tracked prompts are a shared account-wide pool, not a per-brand allowance.** On Lite you get 15 prompts in total. Not 15 per brand. Track two brands and you split those 15 between them — say 9 on your main brand and 6 on the second. Because the pool is shared, a new brand needs prompt room left in it. If your first brand is using the full allowance, free some up on [Setting up your prompts](/setting-up-prompts) before you add the second one. Brand caps work the other way round — they're independent. Adding a brand never grants you extra prompts. ## Which engines does each plan scan? Lite and Growth scan the same six: ChatGPT, Gemini, Perplexity, Copilot, AI Overviews, and AI Mode. Enterprise scans all nine — those six plus **Claude**, **Grok**, and **DeepSeek**. Those three cost more to run, which is why they sit on the top tier. Any filter that lists engines, like the Platforms dropdown on [Citations](/citations), only offers the engines your plan scans. You won't see a Claude option on Lite. ## What do you get on the free plan? The whole product, minus the scans. You can sign in, finish setup, add a brand, and pick prompts. Scheduled scans only run for paying accounts, so no answers get captured and your numbers stay empty. FixAEO routes free accounts to the upgrade page rather than leaving you waiting for data that isn't coming. The [AI Marketer](/ai-marketer) is paid-only too. Free and no-subscription accounts are routed to upgrade if they try to open it. Setting up your first brand saves up to 15 prompts no matter which plan you're on, so nothing you picked during setup is thrown away. Adding more later is capped at your plan's number. ## Can the limits be changed? Every number in the table is a default, not a hard ceiling. Brand caps, prompt caps, engine sets, and scan frequency can all be raised for your account. When you hit your brand cap, the Brands page shows a **Talk to sales** card. That's the fastest route. You can also email [sales@fixaeo.com](mailto:sales@fixaeo.com). ## Picking between monthly and annual Every paid tier comes in two cadences. Monthly plans include a 3-day card-required free trial; annual plans bill immediately and save 14%. Cancel inside those 3 days and you're never charged. **The trial is once per account.** If you've trialed before, or held any paid FixAEO subscription before, a new monthly checkout charges the full price on day one instead of starting a second trial. That includes annual subscribers who never had a trial at all — annual plans don't come with one, but having held the subscription still counts as having used your go. The in-app paywall still shows "Start your 3-day free trial" in this case — that button carries the default label whether or not you're eligible. The Lemon Squeezy checkout page is the one to trust: it shows the amount due today before you pay. If you're resubscribing, read that line. In-app paywall: clicking the Lite Annual card selects it and the page heading changes to Pick a plan to keep tracking your brand, clicking the Lite Monthly card selects it and the heading flips back to Start your 7-day free trial — one page state carrying the trial vs billed-today distinction ## Your current plan and billing Settings, then Billing. It shows your tier, your status, and your renewal date, plus your invoice history with a download link on each row. You can switch between monthly and annual billing there, or cancel. For live used-vs-limit counters and your AI Marketer credit meter, open [Settings → Usage](/usage). If you cancel, access continues until the end of the period you've already paid for. The status is one of these: | Status | What it means | | ----------------------- | ------------------------------------------------------------------------------------------------------------- | | Active | Paid and running. | | Free trial | You're inside your 3-day trial. | | Payment processing | A charge has started but isn't confirmed yet. | | Payment needs attention | The last charge failed and is being retried. See [If a payment fails](#if-a-payment-fails). | | Recovery needed | Every retry failed and access has stopped. | | Cancelling | You cancelled; access runs to the end of the period you paid for. | | Paused | Billing is on hold — and so is scanning. See [Pausing instead of cancelling](#pausing-instead-of-cancelling). | | Inactive | The subscription has ended. | ## If a payment fails Cards expire and banks decline things. When a renewal charge doesn't go through, this is what happens. **You aren't locked out immediately.** You keep working through a short grace period of about three days, and a banner appears at the top of every page in the app telling you the payment didn't go through and the exact date your access runs through. **Lemon Squeezy does the retrying, not FixAEO.** Our payment provider tries the card again up to four times over roughly two weeks, and emails you each time an attempt fails. FixAEO never charges your card itself and doesn't send its own payment-failure email, so you won't get two copies of the same news. Those two facts don't line up, and it's the thing to plan around: **the retries run for about two weeks, but your access only covers the first three days or so.** If the card is fixed inside the grace period nothing is interrupted. After that the app locks even though Lemon Squeezy is still trying. **"Update billing details" is not a "pay now" button.** It opens a secure Lemon Squeezy form for changing your card or billing address. Saving a new card does not charge it on the spot — Lemon Squeezy decides when to try again. So it's normal to update your card and see no immediate charge. That doesn't mean it failed. While a payment is being retried, the **Cancel**, **Pause** and switch-plan buttons are hidden. That's deliberate — the payment needs to settle before the subscription can change shape. Starting a second checkout is blocked for the same reason: a new subscription could charge you twice if the original payment then succeeds. **You can still cancel while a payment is failing** — just not from inside FixAEO. Use the Lemon Squeezy billing portal at [fixaeo.lemonsqueezy.com/billing](https://fixaeo.lemonsqueezy.com/billing), signing in with the email you pay from, or reply to any Lemon Squeezy billing email. You can also email [billing@fixaeo.com](mailto:billing@fixaeo.com) and we'll cancel it for you. If every retry fails, the status becomes **Recovery needed** and access stops. The subscription still isn't gone: update the card on the existing subscription and it can come back. Buying a new one instead is the expensive mistake here. ## Pausing instead of cancelling Pause isn't a button on the billing screen. You reach it by clicking **Cancel subscription** — the dialog that appears offers **Pause for a month instead**. **Pausing stops your scans, not just your billing.** The dialog says your data stays put, and that's true: your history and settings are kept. But FixAEO stops running your scheduled scans while you're paused, so nothing new is collected. Those days are a permanent hole in your charts. FixAEO doesn't backfill a paused period when you return — that stretch stays empty for good. The rest of how it behaves: * **It runs about a month** from the moment you pause, not from your renewal date. * **It takes effect straight away.** If you pause partway through a month you've already paid for, you lose the rest of that period — there's no credit for the unused days. If you're pausing to save money, do it close to your renewal date rather than just after it. * **Your plan is set to restart on its own** at the end of the pause, and billing starts again then. * **To come back early, email [billing@fixaeo.com](mailto:billing@fixaeo.com).** There's a Resume button in Billing, but a paused account gets redirected away from that page before it can be used, so ask us and we'll resume it. * **It's only available on a normal, fully paid, active subscription.** You can't pause during a trial, while a payment is failing or still processing, or after you've already cancelled. ## What happens when a subscription ends Cancelling on its own removes nothing — you keep everything through the period you've paid for. Pausing removes nothing either. When a subscription actually **ends** — it expires, payment finally fails after every retry, or a charge is refunded — tracked brands are trimmed to what your plan allows. If you're tracking more brands than that, the extras stop being tracked. **Nothing is deleted.** A brand that goes over your limit is hidden from your dashboard, but the brand and every bit of its history stay stored. Your prompts aren't deleted either — the ones on a hidden brand simply stop running, and they stop counting toward your prompt allowance, which frees it up for the brand you still have. Two details that matter if this happens to you: * **The brands you added first are the ones kept.** The most recently added are hidden first, so the brand you originally signed up to track is the survivor. * **To bring a hidden brand back, use Add brand on the Brands page** and run setup again on the same website address. That restores the original brand with its history intact — it isn't a fresh start. Don't use the quick add-brand box on the dashboard for this. Typing the same address there returns "you're already tracking this brand" — because the brand does still exist, just hidden. It's a confusing dead end. Go through the Brands page instead, and email [support@fixaeo.com](mailto:support@fixaeo.com) if you get stuck. The app gives you no advance warning before this happens, which is why it's written down here. Scan frequency is the limit most people underrate. Growth rescans daily, Lite every three days. If you're shipping content and want to see the effect this week rather than next, that gap matters more than the prompt count. ## Related Adding, switching, and removing brands against your cap. How to spend your prompt pool well. From sign-in to your first scan. What one scan actually captures. Live counters and the AI Marketer credit meter. Invite teammates, assign roles, switch workspaces. The in-app assistant that reads your data and drafts the work. # Portfolio Source: https://docs.fixaeo.com/portfolio Compare every brand you track in one cross-brand view. Portfolio is one page that rolls up every brand on your account into a single comparison. It answers a question the per-brand dashboard can't: of the brands you're responsible for, which one needs your week? Every number on the page comes from the same daily scans each brand already runs. FixAEO Portfolio page: cross-brand view with KPI tiles showing Brands tracked and Avg AI Visibility, Top performers list, and the sortable All-brands table below ## Who gets a Portfolio page? Anyone tracking two or more brands. The sidebar link is hidden below that, and opening `/app/portfolio/` with one brand redirects you to your [dashboard](/dashboard). A rollup over a single brand is just a worse dashboard. Free plans cap you at one brand, so Portfolio starts on Lite. Caps by plan are on [Plans and limits](/plans-and-limits), and adding brands is covered in [Managing brands](/managing-brands). ## What's on the page Four blocks, in this order. * **KPI tiles** — brands tracked, average AI visibility, total mentions, positive sentiment share. * **Top performers and Needs attention** — your best and weakest brands by visibility. * **By AI engine** — average visibility per engine across your brands. * **All brands** — a sortable table of every brand with visibility, change, mentions, sentiment split, and last scan date. Above them sits a filter bar: a range picker (7d, 30d, 90d, 1y), a country picker, and a CSV button. ## How do you read the numbers? **Avg AI visibility** is how visible your brands are across the account as a whole. It's an account-level figure, so it won't always match the average of the percentages in the table below. [Visibility Score](/metrics/visibility-score) covers the metric itself. Each brand contributes its **most recent scan inside the range**, not an average across the range. So switching from 7d to 90d doesn't smooth the numbers — it moves the period you're comparing against. **Δ vs prev** compares that scan against the matching period immediately before, in percentage points. A dash means flat, not missing. The account-level delta only counts brands with data in both periods, so a brand added last week can't swing it. Brands that haven't been scanned yet still appear, marked **Pending** with dashes instead of zeros. They're excluded from every average, so a new brand can't drag your numbers down before it has data. ## What doesn't roll up Portfolio rolls up brand-level numbers only. These stay per brand: [prompts](/setting-up-prompts), [topics and labels](/topics-and-labels), [citations](/citations), [sources](/sources), and [Improve](/improve) recommendations. Click any row to drop into that brand. Region is a filter, not an aggregate. The page shows one country at a time. Brands that don't track the selected country drop out of the table and out of the totals. They still appear in the country dropdown, so you can switch to a country where they are tracked. The brand count on the page is the count **for the selected country**, not your account total. If you track five brands and three of them run in the UK, the US view says two. Check the country picker before you report that number to anyone. Portfolio is scoped to your own login, and covers every brand on your account. ## Why do the same brands show up in both lists? Both cards read the same ranked list from opposite ends. Track only a handful of brands and every one of them appears in both, just in opposite order. Both cards rank on the visibility percentage printed beside each brand, so the order always agrees with the numbers you're reading. ## Reading the By AI engine chart The bars show each engine's average visibility across your brands, strongest first. Clicking a bar filters the table below to brands with any citations from that engine. Click it again, or the chip, to clear. An engine your plan doesn't cover never appears, so the bars compare the engines you're entitled to, not all nine. See [Plans and limits](/plans-and-limits) for the per-tier split. ## Sorting and filtering the table The table defaults to visibility, highest first. Click any header to re-sort by name, visibility, change, mentions, or last scan. Brands with data always rank above pending brands, in both directions. Sorting ascending won't fill the top of the table with brands that never scanned. The search box next to the table matches the brand name, its domain, and its slug. ## Exporting to CSV The CSV button downloads the current range and country as one row per brand. Columns: `brand_slug`, `brand_name`, `domain`, `vertical`, `region`, `language`, `range_days`, `has_data`, `citation_rate_pct`, `citation_delta_pct`, `brand_mentions`, `total_responses`, `sentiment_pos`, `sentiment_neu`, `sentiment_neg`, `latest_scan_date`, `top_engine`, `top_engine_rate_pct`. `citation_rate_pct` is the Visibility Score on a 0-to-100 scale, the same number the page shows. Pending brands get empty cells rather than zeros, so spreadsheet averages aren't diluted by brands that never scanned. The filename carries the country, range, and date, so two exports never overwrite each other. [Export your data](/export-your-data) covers every export in the app. Use Portfolio to pick the brand, then [Industry benchmarks](/industry) to find who's beating it and [Improve](/improve) to get work you can ship this week. ## Related * [Managing brands](/managing-brands) — adding, switching, and removing the brands this page rolls up. * [Plans and limits](/plans-and-limits) — brand caps, the shared prompt pool, and scan cadence. * [Visibility Score](/metrics/visibility-score) — the metric behind every percentage here. # Quickstart Source: https://docs.fixaeo.com/quickstart From a bare domain to your first AI visibility read. Setup takes about ten minutes. FixAEO drafts most of it, so you're mostly reviewing and correcting. This quickstart is the four moves that get FixAEO working: create the data, structure it, read it, then act on it. Each step depends on the one before, so work in order. Sign in at [fixaeo.com/login](https://fixaeo.com/login) with a magic link or your Google account. There's no separate signup form. If you're not on a paid plan yet, you'll land on step 1 of setup automatically. Every number in FixAEO is derived from this step, which is why it comes first. You enter your domain. FixAEO reads your homepage and drafts a brand profile: description, industry, products, audience. Then it suggests up to 10 topics, and 8 realistic customer questions for each topic you keep. You check the ones worth tracking. Setup is five steps plus a results screen. It saves as you type, so you can close the tab and pick up where you left off on another device. Two limits worth knowing. Setup caps your first brand at 15 prompts on every plan, so add the rest afterwards from your brand settings. And prompts are a shared pool across your account, not a separate allowance per brand. **Your task:** pick the 15 questions a real customer would actually type, not the ones that flatter you. Read more: [Setting up your prompts](/setting-up-prompts) and [Your brand profile](/brand-profile). Prompt results on their own give you a score. Competitors turn that score into a ranking. FixAEO doesn't fill competitors in for you. Add the domains you compete with and they become a filter across your citation views. Track competitor names and they hold their place in your industry ranking even in weeks where no engine mentioned them. That silence is a signal too. Topics work differently. You don't group prompts by hand. FixAEO clusters your prompts into themes for you and refreshes them as your list changes. **Your task:** add the three or four competitors you actually lose deals to. Read more: [Tracking competitors](/competitors) and [Topics and labels](/topics-and-labels). Now there's something to read. Your first scan starts as soon as you finish setup. How long results take after that depends on the AI engines themselves, so don't sit on the page waiting. Check back later in the day. When data lands, your dashboard leads with Visibility Score: the percentage of AI answers that mention your brand. Under it sits a per-engine breakdown, your recent mentions, and your category ranking. A Free plan completes setup but doesn't run scheduled scans. Scans begin on Lite and above. See [Plans and limits](/plans-and-limits). **Your task:** write down your starting Visibility Score so you have a baseline to beat. Read more: [Understanding your dashboard](/dashboard) and [Visibility Score](/metrics/visibility-score). A number you never act on is just a number. Two surfaces close the loop. Improve gives you a list of pending actions drawn from your gaps. Alerts catch the changes you'd otherwise miss: a visibility drop, a new competitor, a rival surging past you. **Your task:** set one alert on your Visibility Score before you close the tab. Read more: [Improve](/improve) and [Alerts](/alerts). ## What happens after setup? FixAEO rescans on a cadence set by your plan. That's every 72 hours on Lite, daily on Growth, and every 6 hours on Enterprise. Each scan runs every tracked prompt against every engine your plan covers, in the country you picked during setup. Change your prompts whenever your positioning changes. Removing a prompt keeps its history, so your past data doesn't disappear when you clean the list up. ## Where to go next After a few days of scans the useful question becomes "who's beating me, and why". [Citations](/citations) shows which websites the engines trust enough to cite. [Industry benchmarks](/industry) shows your share of voice against your category. If a metric doesn't make sense, the [Metrics overview](/metrics-overview) defines all of them. # Search Source: https://docs.fixaeo.com/search Find brands, prompts, mentions, and cited URLs inside your account. Search is a single box that looks across your own FixAEO data: your brands, your tracked prompts, the mentions collected for them, and the URLs AI engines cited. It isn't Google Search Console, and nothing typed into this box searches the web. Your Search Console keywords, clicks, and impressions live on the [SEO page](/seo). The two surfaces share a name and nothing else. FixAEO Search page: typing 'project management' into the search box returns results grouped into Prompts and Mentions sections, with matching terms highlighted in yellow ## What can you search? Four buckets, each rendered as its own section of results. | Bucket | Matches on | Skips | | --------- | ---------------------------------------------------- | ------------------------------ | | Brands | Brand name, domain, slug | Brands you've stopped tracking | | Prompts | The prompt text | Archived prompts | | Mentions | The answer snippet, plus the prompt that produced it | Nothing extra | | Citations | The cited source URL | Mentions with no source URL | Every bucket is filtered to brands you currently track. Stop tracking a brand and its prompts, mentions, and cited URLs leave search with it. Brand name outranks domain, which outranks slug. On mentions, the answer snippet outranks the prompt, because that's usually the text you're hunting for. Citations are grouped by URL, not listed per mention. Each row carries a `×N` chip counting how many of your mentions cite that page. Clicking the row opens the page itself in a new tab. ## How does matching work? A new mention is searchable the moment it's written, so you're never reading a stale index. Prompts and mentions match on word variations, so "integrations" finds "integration" and "pricing" finds "priced". Brand names, domains, and slugs match as written, with a little room for typos — "stipe" still finds Stripe. An exact brand-name hit is pulled to the top rather than sitting below a mention that happens to use the same word. Matched words come back highlighted, which is why parts of a result snippet are marked. ## Is there a keyboard shortcut? Yes, but it opens something else. **⌘K** (**Ctrl-K** on Windows) opens the command palette, which jumps to pages, actions, and brands. It does not search prompts, mentions, or citations. That keyboard shortcut is the only way to open the palette now — the global topbar that used to carry a search chip is gone. The Search page has no shortcut of its own. The palette does list it under Pages, though, so **⌘K** then "Search" jumps you here. [Sources](/sources) is listed there too. Once you're on the page, the input is focused for you and takes four keys. | Key | Does | | ----- | ---------------------------------- | | ↑ / ↓ | Move the selection through results | | Enter | Open the selected result | | Esc | Clear the box | Results catch up with you a moment after you stop typing, so a fast typist only pays for one search. ## Where do results take you? Brands open that brand's overview. A prompt opens that brand's Tracking questions tab, a mention its Mentions tab. Citations open the cited page itself, in a new tab. A result puts you on the right tab, not on the exact row, so scan the tab once you land. To chase a specific cited URL instead, [Citations](/citations) is the faster route. ## Limits worth knowing * Search needs a couple of characters to run, and very long queries are trimmed. * Each section shows its strongest matches rather than everything it found. * The count next to a section heading is the number of results returned, not the number of matches that exist. A section showing 5 means "at least 5". A narrow query beats a broad one. Search a domain rather than a brand, or a distinctive phrase from a prompt rather than a single common word. ## What isn't searchable Topics and labels, competitor lists, industry rankings, alert history in your [Inbox](/inbox), agent and crawler traffic, Search Console keywords, and anything on the public site. Those surfaces have their own filters. Before you type, the page shows four shortcut cards instead of results: your brand, top themes, [citations](/citations), and the per-engine breakdown. They're navigation, not search. ## Recent searches The chips above the quick links are your last five queries that returned something. They're kept in your browser's local storage, not on your account, so they don't follow you to another device and **Clear** wipes them for good. A query that returned nothing is never saved. ## Related * [Citations](/citations) — the full view of which URLs AI engines cite for you. * [Setting up your prompts](/setting-up-prompts) — what the Prompts bucket is searching over. * [SEO](/seo) — the Search Console side, which this page is not. # Security and privacy Source: https://docs.fixaeo.com/security Where your data lives, what's encrypted, and what FixAEO doesn't have. FixAEO's security surface is small on purpose: one Go API, one Postgres database, and a published list of the third parties that touch your data. This page collects what a security review usually asks for. It links the real documents and states the gaps plainly, so you can decide early instead of mid-trial. FixAEO Settings — Security tab: Two-factor authentication with an Enable two-factor button, and Active sessions listing every signed-in device with a Revoke button and a This device chip on the current one ## What FixAEO doesn't have Start here. It saves you a call. * **No SOC 2.** No Type 1, no Type 2, no audit underway. * **No ISO 27001.** * **No contractual SLA.** There's no uptime commitment and no service credits. * **No SAML.** Single sign-on is OpenID Connect only, on the Enterprise plan. See [Single sign-on and SCIM](/sso-and-scim). * **No published uptime history.** The status page checks live health only. * **No paid bug bounty.** Reports still get answered — see below. If your procurement process requires a SOC 2 report or a signed uptime SLA, FixAEO can't clear it today. That's a hard no, not a "coming soon." ## Where does your data live? One place. Your account data, brands, prompts, and scan history sit in a single Postgres database on Oracle Cloud Infrastructure, in the Mumbai region in India. That matters if you're in the EU or the UK. Your data leaves the EEA. The Data Processing Addendum covers those transfers using the EU Standard Contractual Clauses and the UK Addendum. Cloudflare sits in front of the marketing site for CDN, DNS, and DDoS protection. The API is a separate origin at `api.fixaeo.com`. ## Subprocessors Fifteen third parties are listed at [fixaeo.com/subprocessors](https://fixaeo.com/subprocessors/), each with its purpose, the data it receives, and its processing region. The list was last updated on 25 May 2026. It covers the categories a reviewer expects: hosting, CDN, payments, transactional email, product analytics, OAuth providers, and the AI vendors FixAEO holds an API account with — Anthropic, OpenAI, Google, xAI, DeepSeek, plus SerpAPI for AI Overviews coverage. New subprocessors get published before they go live, not after. If you object to one and it's essential to the service, your only real remedy is to close your account. ## How are payments handled? Lemon Squeezy is the merchant of record, so card numbers never touch FixAEO systems. Lemon Squeezy (a Stripe company) handles the card details, the recurring charge, and sales tax or VAT. What FixAEO stores is a billing record: your email, the amount, the currency, and the charge date. No card number, no CVV, no expiry. Deleting your FixAEO account does not cancel your Lemon Squeezy subscription. Cancel the subscription first, from the link in your billing receipt. Otherwise the recurring charge continues against an account that no longer exists. See [Plans and limits](/plans-and-limits) for the billing controls in Settings. ## Signing in There are no passwords anywhere in FixAEO. No password column, no reset flow, nothing to leak. You sign in one of two ways: * **Magic link.** A one-time link emailed to you, valid for 15 minutes. * **OAuth.** Google. Google is the only social sign-in offered today. Magic link and Google sign-in are open to everyone. On the Enterprise plan, a workspace admin can connect an OpenID Connect provider, so members sign in with **Sign in with company SSO** using their work email. SAML is not supported. See [Single sign-on and SCIM](/sso-and-scim) and [Team and workspaces](/team-and-workspaces). You can turn on two-factor authentication in Settings — see [Two-factor authentication](#two-factor-authentication) below. The session cookie is `HttpOnly`, `SameSite=Lax`, and `Secure` outside localhost. Sessions last 30 days. Settings lists your active sessions so you can revoke them. ## Two-factor authentication Turn it on in Settings. It works with any authenticator app — scan the QR code, enter the six-digit code once to confirm, and every new sign-in then lands on a challenge screen before the app opens. At the moment you confirm, FixAEO shows you **10 recovery codes**. Save them somewhere that isn't your phone. **Your recovery codes are the only way back in, and you see them once.** They're shown on one screen, immediately after confirming. FixAEO stores only a scrambled copy it can check against, never the codes themselves, so nobody can show them to you again — not you, not us. Refreshing that page loses them. There is no way to generate a fresh set, and no screen anywhere that tells you how many you have left. Each code works once. Once all ten are used, your authenticator app is the only way in. Turning two-factor **off** also requires a valid code — either from your app or an unused recovery code. So if you lose the app and the codes together, you can't sign in and you can't switch two-factor off. There is no self-service reset and no email escape route. Recovering means emailing [security@fixaeo.com](mailto:security@fixaeo.com) and having someone clear the setting on your account by hand. A few things worth knowing: * **Lost your phone but still have a code?** On the challenge screen, click **Use a recovery code** and paste one instead of the six-digit code. * **Want a new set of codes?** Turn two-factor off and set it up again. That's the only route. * **Turning it on doesn't sign out your other devices.** Anything already signed in stays signed in and is never asked for a code — only new sign-ins are challenged. To clear old devices, use the active-sessions list in Settings. * **If you started setup but never finished it**, starting again is fine and just replaces the old QR code. The refusal only applies once an enrolment is confirmed. Two-factor protects signing in to the website. It does **not** apply to API keys or the MCP server — a bearer token is never challenged for a code. Treat an API key as full access to your account data, and revoke it in Settings if it leaks. See [Authentication](/api/authentication). ## What's encrypted? Everything in transit runs over TLS. At rest, FixAEO applies AES-256-GCM at the application layer to the credentials that would do the most damage if a database dump leaked: * Your Google Analytics refresh token * Your Search Console refresh token * Your WordPress application password API keys for the public API aren't stored at all. Only a SHA-256 hash is kept, and the plaintext key is shown once at creation. If you lose it, you rotate it. Visitor IP addresses collected by [Agent analytics](/agent-analytics) are hashed with a salted SHA-256 before they're written. The raw address isn't stored. Whole-disk and whole-database encryption is a property of the hosting layer, not of FixAEO's code, so this page doesn't make a claim about it. The three token columns above and the IP hash are the parts FixAEO encrypts itself. ## What reaches the AI providers Every scan sends your prompts to AI engines the way a buyer would ask them. The prompt carries your brand context, such as "best CRM for early-stage startups." No user identifiers go out with it, so the provider sees the question and FixAEO's own credentials, and nothing that ties the query back to you. Providers differ on whether they retain prompts for training. The subprocessor page links each provider's own policy, which is the authoritative source. ## Can FixAEO staff see your dashboard? Yes, read-only, and it's gated. There's an operator view that renders the same data your dashboard reads, straight from the database. No customer session is created and no write path exists. Every query is a `SELECT`. It sits behind HTTP Basic Auth on a single shared operator credential, compared in constant time against a salted SHA-256 hash. Anyone without it gets a 401. Each brand view writes a server log line with the brand ID, the client IP, and the user agent. Because the credential is shared, that line records *an* operator rather than which one. That's the honest granularity a shared credential allows, and it's worth knowing before you decide the audit trail meets your bar. FixAEO never signs in as you. Full identity assumption would expose billing, email, and settings, so it isn't built. ## Reporting a vulnerability There's an RFC 9116 file at [fixaeo.com/.well-known/security.txt](https://fixaeo.com/.well-known/security.txt). Reports go to `security@fixaeo.com`. The stated target is a response to verified reports within five business days, with coordinated disclosure on a reasonable timeline. There's no paid bounty. Researchers get credited with their permission. In scope: `fixaeo.com` and its subdomains, the public scan API, and the authenticated app. Out of scope: denial-of-service against AI provider quotas, social engineering of customers, physical or wireless attacks, and stale information inside cached AI answers. That last one is the thing FixAEO measures, not FixAEO's infrastructure. ## Uptime and status [fixaeo.com/status](https://fixaeo.com/status/) polls `api.fixaeo.com/health` every 30 seconds and reports one of three states. Operational means a 200 within two seconds. Degraded means it responded but took longer. Down means an error or no response within ten seconds. There's no 30-day uptime chart, because there's no historical pinger behind it. The page says so rather than showing a number it can't stand behind. ## Getting a DPA FixAEO is **GDPR-aligned, with a DPA available on request**. It isn't certified against any standard, and this page won't claim otherwise. The addendum is published at [fixaeo.com/dpa](https://fixaeo.com/dpa/). It sets the roles clearly: * For your **account data**, FixAEO is the controller. * For **visitor data collected by the analytics tag** — hashed IP, user agent, referrer, page path — you're the controller and FixAEO is the processor. For most customers, accepting the Terms brings the DPA into effect. If procurement needs a counter-signed copy, email `hello@fixaeo.com`. The privacy policy at [fixaeo.com/privacy](https://fixaeo.com/privacy/) covers the GDPR and CCPA/CPRA rights. FixAEO doesn't sell or share personal information as those terms are defined under the CCPA. Send a reviewer four links and most of the questionnaire answers itself: the DPA, the subprocessor list, `security.txt`, and the status page. The gaps in "What FixAEO doesn't have" are the only part that needs a human. ## Data retention FixAEO doesn't publish a retention window in days, and this page won't invent one. What the privacy policy commits to: account, product, and billing data is kept while your account is active. Deleting your account removes your personal data, except records that must be retained for legal or tax reasons, such as invoices, and routine backups that age out on a rolling schedule. Hashed IPs used for rate limiting are short-lived. One product surface does have fixed windows, because they're a storage decision rather than a policy: raw crawler hits are pruned at about 60 days and the daily rollups behind the charts at about 400. See [Agent analytics](/agent-analytics). ## Exporting and deleting your data Both are self-serve, under **Settings → Privacy & data**. No support ticket, no waiting period. **Download my data** returns a JSON file for GDPR Article 20 portability. It carries your profile and your billing history. Your brands, prompts, and measurements come out through the CSV exports instead — [Export your data](/export-your-data) has the detail on each one. **Delete account** is Article 17 erasure. You type your own email address to confirm. The delete cascades through sessions, OAuth identities, brands, snapshots, mentions, prompts, alerts, integrations, and API keys. All sessions are revoked and the cookie is cleared. It can't be undone. ## Related Every CSV and JSON export, and what each one contains. Tiers, caps, and where billing lives in Settings. The tag that collects visitor data, and how IPs are hashed. The OAuth connection whose refresh token is encrypted at rest. Connect OIDC SSO and directory sync on Enterprise. Sign-in and security emails are always on, and what you can toggle. # Search performance Source: https://docs.fixaeo.com/seo Your organic Google numbers, plus the queries AI engines skip. Search performance is the Google half of your visibility picture, pulled from Search Console. It lives behind the **SEO** tab in the **Answer Engine Insights** area (under the Analytics group in the sidebar). The screen itself is titled **Search performance**. The top of the page is a straight read of your organic performance: clicks, impressions, click-through rate, and average position. The bottom is the part worth connecting for — the queries you already rank for on Google where AI engines don't mention you. Search performance page with no Search Console connection: a centered card promotes the one-click OAuth to Google Search Console and explains that clicks, impressions, CTR, and position start syncing hourly once connected — plus the SEO-vs-AEO gap surfaces below ## What you need first Everything on this page rolls up to one brand. With no brands, you get an "Add a brand" card. Both connecting and reading are gated to paid plans. See [Plans and limits](/plans-and-limits). OAuth alone isn't enough. Until you select one of your verified sites, the page shows "Pick a Search Console site". The connection is per brand, so each brand can point at its own property. Setup, permissions, and disconnecting are covered on [Google Search Console](/integrations/google-search-console). ## What do the four tiles mean? Click any tile to change what the chart below plots. | Tile | What it is | | ------------ | ---------------------------------------------------------------- | | Clicks | Times someone clicked through to your site from Google's results | | Impressions | Times your site appeared in Google's results, clicked or not | | Avg CTR | Clicks divided by impressions | | Avg position | Your average ranking. Lower is better — 1 is the top | Clicks and impressions are sums across the range. The other two aren't. CTR is your total clicks over your total impressions, and average position is weighted by impressions rather than averaged day by day. A day where you ranked second on two impressions doesn't get equal weight with a day where you ranked ninth on two thousand. ## Reading the trend chart The chart plots the selected metric over your chosen range: 7, 30, 90, or 365 days. You can switch it between daily, weekly, and monthly. Weekly unlocks at 14 days of data, monthly at 60. Weekly and monthly buckets add up clicks and impressions, then work out CTR and position across the whole bucket. Neither of those two is ever summed. For average position the vertical axis is flipped, so better rankings sit higher on the chart the way you'd expect. The last two or three days are usually missing. That's Google, not FixAEO — Search Console finalises data on a lag, so the sync deliberately stops short rather than plotting a partial day as a crash. ## Top queries, top pages, and countries Three tables sit under the chart. Top queries and top pages are shown ten rows at a time. Countries displays the top eight next to a donut, with each country's share of your clicks. Query and page rows are ranked by clicks, with impressions and position worked out across the whole window rather than copied from any single day. ## What is the rank-but-not-cited gap? This is the card the rest of the page exists to support. It is labelled "SEO × AEO gap" in the app. FixAEO takes your top 50 organic queries by clicks for the selected range and asks, for each one, whether you're tracking it as an AI prompt and whether AI answers mention you. Every query lands in one of three states. | State | What it means | What to do | | ------------------ | --------------------------------------------------------- | --------------------------------------------------- | | AI cites you | You rank on Google and at least one engine mentions you | Nothing. This is working | | AI gap — not cited | You rank, FixAEO asks AI this question, and you're absent | The **Improve** button opens [Improve](/improve) | | Not tracked | You rank and FixAEO isn't asking AI about it at all | The **Track** button turns it into a tracked prompt | A Google query and a tracked prompt rarely read word for word the same, so the match allows for differences in wording. Once matched, FixAEO reads your recent answers for that prompt and asks a single question: did any of them mention the brand? The table is ordered so the rows worth working sit at the top. It favours queries where you rank well and still earn real clicks, because those are the ones where AI's silence costs you most. The AI half reads one region — your brand's own scan region, not a fixed US window. A UK brand is checked against UK answers. If you track several regions, check [Citations](/citations) before acting on a row. Tracking a query from here counts against your prompt pool, which is shared across the whole account rather than per brand. The card shows "Tracking X of Y prompts" and disables the button at the cap. See [Setting up your prompts](/setting-up-prompts). ## Suggested prompts from your Google searches The last card clusters the organic queries you aren't tracking into AI prompts worth watching. Each suggestion lists the searches it covers and why it matters, with a Track button that behaves like the gap card's. Two things run on different rules here: * **Opening the page is free.** The existing list loads every time, with no model call. * **Refreshing costs a model call.** It runs only when you press the button. Never on load, never on a timer. A refresh reads your recent organic queries, skips any you already track, and comes back with a handful of fresh suggestions. If it can't produce anything, your existing suggestions stay put rather than being wiped. Anything you track disappears from the list on the next load. ## How fresh is the data? FixAEO syncs every active connection through the day. The header shows when your last pull landed. The first sync after you connect backfills about 13 months, so the 365-day range has something in it straight away. After that, recent days keep being re-pulled as Google finalises them. If Google revokes access, syncing stops and a red banner appears at the top of the page. Nothing below it is updating at that point, so reconnect before reading the numbers. ## Limits worth knowing * **Paid only.** Free accounts can't connect or read this page. * **One site per brand.** A brand covering several verified properties needs several brands. * **The gap needs both halves.** No tracked prompts means every query reads as "Not tracked", however well you rank. * **Google's own filtering applies.** Search Console withholds low-volume and privacy-sensitive queries, so the query table is never the complete set. ## Related pages * [Google Search Console](/integrations/google-search-console) — connecting and reconnecting * [Citations](/citations) — which answers actually mention you, per engine * [Sources](/sources) — the domains engines cite instead of you * [Attribution](/attribution) — the traffic and revenue half, from Google Analytics # Setting up your prompts Source: https://docs.fixaeo.com/setting-up-prompts The questions FixAEO asks AI models on your behalf. A prompt is one question you think a real customer would type into an AI assistant. FixAEO runs each prompt across every AI engine your plan covers, on your plan's schedule. It then reads each answer for three things: whether you're mentioned, which competitors show up, and which sources the model cited. Your prompt list is the measurement instrument. It sets the denominator of your [Visibility Score](/metrics/visibility-score), so everything on [your dashboard](/dashboard) is downstream of it. FixAEO brand page for Linear: clicking the Prompts tab reveals the Tracked prompts panel with the plan-limit counter (10 of 50 prompts) and the list of tracked prompts with their category chips ## How many should you start with? Fifteen. That's what the setup wizard selects for you, and it's a good first list regardless of plan. Setup writes eight prompts for each topic you picked and pre-selects 15 of them, spread across your topics rather than concentrated in one. The 15-prompt ceiling applies to your first brand on every plan. If your plan allows more, finish setup first, then add the rest from your brand's Tracking questions panel. When you add a *later* brand, the wizard caps you at whatever's left in your account-wide pool instead. ## How the shared prompt pool works This is the part that trips people up, so read it twice. **Your prompt limit is account-wide, not per brand.** All your brands draw from one pool. Say you're on Growth with 50 prompts and three brands. You could run 30 on your main brand, 15 on the second, and 5 on the third. The split is yours to choose. What you can't do is run 50 on each. Two consequences: * Adding a brand can fail at the prompt limit because of prompts already on another brand. Free up room or upgrade. * At the cap, adding a prompt is rejected. Remove one first. Per-plan pool sizes are in [Plans and limits](/plans-and-limits). The counter on the Tracking questions panel already does this math for you. It reads "Using N of L tracking questions", where N covers your whole account, not just the brand you're looking at. ## Branded vs non-branded prompts Both belong in your list, but they answer different questions. **Branded** prompts name you. They measure how AI models describe you when someone already knows you exist. > Is Linear good for bug tracking? > > What does Stripe charge for international payments? **Non-branded** prompts describe the need, not the vendor. Nobody's name is in them. This is where visibility is won or lost, because the model chooses who to name. > What's the best issue tracker for a small engineering team? > > How do I accept payments in a SaaS app? **Comparison** prompts pit you against a rival. High purchase intent, and the fastest way to see how you're framed. > Notion vs Confluence for engineering documentation > > Linear or Jira for a startup Most of your list should be non-branded. Branded prompts tell you how you're described. Non-branded prompts tell you whether you're described at all, and they're what populates your rival list. See [Tracking competitors](/competitors). ## What makes a good prompt? * Sound like a person typed them, not a keyword tool. * Ask one thing. A prompt with three questions gets a scattered answer. * Stay true a year from now. Avoid dates and version numbers. * Stay short. One sentence is plenty. * Keyword strings: "best crm software cheap small business". * Yes or no questions. They leave the model no room to name brands. * Questions only your own docs could answer. You'll always win, and you'll learn nothing. * Near-duplicates of a prompt you already track. They cost you a slot and tell you nothing new. ## How much work is behind your list? Each prompt runs once per engine, per scan. A brand with 15 prompts on a six-engine plan captures up to 90 answers per scan day. A brand has one scan region today, so the region doesn't multiply anything (a scan is prompts × engines, not × regions). Multi-region tracking is on the roadmap. See [Your brand profile](/brand-profile) for how it's set. ## Editing your list later Add and remove prompts from the Tracking questions panel. Prompts tab on a brand page: typing a natural-language prompt into the input, clicking Add prompt, and the row appearing at the top of the tracked list with an auto-classified Commercial chip, the plan counter jumping from 10 to 11 of 50, and a toast that reads Prompt added — Daily eval starts on next worker tick * New prompts start running on your next scan. * Removing a prompt keeps its past snapshots. Your history doesn't disappear. * A prompt you already track won't be added twice. Once your list grows past a dozen or so, group it. [Topics](/topics-and-labels) covers how. # Sources Source: https://docs.fixaeo.com/sources Which websites AI engines read and show when answering about you. Sources shows what the AI engines actually pulled while answering your prompts. The Sources page is a per-brand list of every website an engine touched while answering your tracked prompts. It splits that into two levels: pages the engine **showed** a reader, and pages it **fetched in the background** and never displayed. Both are useful, and they tell you different things. ## Citations and network sources Four tiles sit above the table. **AI responses** counts the answers captured in the window, across every engine and prompt. The percentage columns in the table are all measured against it. **Domains** counts unique hostnames in the window. youtube.com is one domain no matter how many URLs came from it. **Citations** counts the times an engine put a source on screen — a chip, a footnote, or a sources-panel row. This is the level a reader sees. [Citations](/citations) is the dedicated view for it. **Network sources** counts the URLs an engine quietly fetched while drafting and then never showed the reader. That gap is the interesting part. It's the difference between what an engine considered and what it was willing to put its name behind. FixAEO Sources page showing 652 AI responses, 8 domains, 871 citations and 429 network sources, with reddit.com top of the table at 348 citations and a 90% cite rate This is observed data, not an estimate — it's what the engines actually loaded while answering. It only exists once a scan has run, so the page stays empty until then. Free plans don't get scheduled scans — see [Plans and limits](/plans-and-limits). ## The two views FixAEO Sources page: switching from the Domains tab to By prompt reveals per-prompt cited-vs-total counts (e.g. 'Best issue tracking software for startups' with 107 cited of 155 total) **Domains** rolls everything up by hostname. Each row gives you the domain (linking to a real example URL), Citations, Total, Retrieved %, Cited %, Cite rate, which engines used it, and when it was last seen. * **Total** covers both levels, shown and fetched, so it's always the larger number. * **Retrieved %** is how often the domain turned up at all. * **Cited %** is how often it was shown on screen. * **Cite rate** is the one to read first: when an engine pulls this domain, how often does it actually show it? The **Citations only** toggle hides hosts that were never shown on screen. Rows that stay still report their full totals. **By prompt** flips the axis. Each prompt shows a cited count and a total, and expands into the URLs behind them, tagged `cited` or `network`. This is where you find out that one prompt is quietly feeding an engine a competitor's comparison page. Filter both views by date range and region. ## How do you read the cite rate? Compare a domain's Citations column against its Total column, or just read the Cite rate column. Three patterns are worth acting on. **High total, low citations.** The engines keep fetching this site and keep deciding not to show it. It's in the retrieval pool but not trusted enough to display. A placement there is worth less than the raw numbers suggest. **High total, high citations.** The engines both read it and quote it. This is the strongest placement target in your category. **Your own domain, low on both.** The engines aren't reaching your pages at all. That's a content and structure problem before it's a placement problem. [Improve](/improve) turns this into specific work. ## Finding placement and partnership opportunities Sources is the most direct path from a number to a task. A working method: Start with what readers actually see. Everything else is context. Sort by citations. The top domains that don't mention you are shaping your category's answers without you in them. A high-citation domain in the Earned Media bucket is a pitch. One in Social is a thread to join. One in Institution is a listing to get into. See [Citations](/citations). Read the exact page the engine cited. Often it's a roundup you can ask to join, or a comparison with your details out of date. Check which prompt pulls that domain. That tells you which customer question the placement will influence. A single correction on a page the engines already cite often beats a new page of your own. They've already decided to trust that domain. Getting into it is cheaper than earning that trust yourself. ## How this relates to your other pages Sources is per-brand and shows both levels, fetched and shown. [Citations](/citations) covers only what was shown, but adds category, share, rank, sentiment, and export. [Industry benchmarks](/industry) tells you which competitors those sources are naming instead of you. If a domain here surprises you, go read the answer it came from. [Understanding AI answers](/understanding-answers) shows you how. # Single sign-on and SCIM Source: https://docs.fixaeo.com/sso-and-scim Connect your identity provider to FixAEO with OIDC single sign-on and SCIM directory sync. If your company signs people in through Okta, Microsoft Entra ID, OneLogin, or another identity provider, FixAEO can hand sign-in and account provisioning to it. Single sign-on (SSO) lets your team reach FixAEO through your provider. Directory sync (SCIM) lets your provider add and remove workspace members for you. Both are **Enterprise-only**, and both are set up by a workspace administrator. You need the manage permission on the workspace, and the plan has to be Enterprise. If either isn't true, the section explains that instead of showing the setup. FixAEO speaks **OpenID Connect (OIDC)** only. SAML is not supported. If your identity provider can only offer a SAML app for us, that's a hard no today, not a coming-soon. Any standards-compliant OIDC provider works — Okta, Microsoft Entra ID, OneLogin, and the rest. You find both controls under **Settings → Enterprise**. There are two cards: **Single sign-on** and **Directory sync**. They're independent — turn on either one without the other. ## Set up single sign-on Have your provider's OIDC issuer URL, client ID, and client secret ready before you start. You'll create the app in your identity provider, then paste its details here. In the **Single sign-on** card, fill in your **Company domain** (for example, `company.com`), the **OIDC issuer URL**, **Client ID**, and **Client secret** from your provider. Click **Save configuration**. The card shows a **Provider callback URL** (`https://api.fixaeo.com/auth/sso/callback`). Copy it and paste it into your identity provider's app as the redirect or callback URL. FixAEO shows a TXT record to publish — a **Name** that looks like `_fixaeo-sso.company.com` and a **Value**. Add it at your DNS provider, then click **Verify DNS**. This proves you control the domain. Click **Test sign-in** and complete a real sign-in through your provider as the admin. This confirms the connection works before anyone relies on it. Click **Enable SSO**. People at your verified domain can now sign in to FixAEO through your identity provider. A few things worth knowing once SSO is on: * **One domain binds to one workspace.** A company domain can be connected to a single FixAEO organization, not several. * **SSO never creates access on its own.** Someone has to already be a member — invited by a teammate or provisioned by directory sync — before they can sign in through your provider. A valid company login is not, by itself, a FixAEO account. * **Turning SSO off keeps your configuration.** If you disable it, the saved OIDC details stay, so you can re-enable later without typing them again. Always run **Test sign-in** before **Enable SSO**, and keep at least one admin who can still sign in another way — a magic link or Google. Enabling SSO doesn't remove those sign-in methods, so a mistyped issuer URL or a rotated client secret can't lock your whole workspace out. ## Set up directory sync (SCIM) Directory sync uses SCIM 2.0. Your identity provider becomes the source of truth for who belongs to the workspace — it adds people when you assign them and removes them when you deprovision them. In the **Directory sync** card, pick your **Identity provider** — Okta, Microsoft Entra ID, OneLogin, or Custom SCIM. Click **Enable and create token**. FixAEO shows a **SCIM base URL** and a **bearer token**. Paste the base URL and bearer token into your identity provider's provisioning settings. The **token is shown once** — copy it now. If you lose it, use **Rotate token** to issue a new one, which replaces the old. Assign the users or groups you want in your identity provider. FixAEO provisions them into the workspace as they're assigned. ### How provisioning behaves * **New members get the Member role and access to all brands.** Directory sync controls who's in and out; roles and per-brand access stay editable inside FixAEO afterward. * **Provisioned members count toward your seat limit,** the same as invited teammates. If a sync would push you past your seats, FixAEO refuses that add rather than overfilling — raise your seats or free some up, then it syncs. * **Deactivating a user removes them from this workspace only.** Their personal FixAEO account, and any other workspace they belong to, is untouched. Directory removal never deletes an account. * **The workspace owner and the last active admin can't be removed by directory sync,** so an errant deprovision can't leave the workspace with no one in charge. Rotating the SCIM token stops your provider from syncing until you paste the new token in, so plan a rotation for a quiet moment. The same is true if you disable directory sync: your provider can no longer add or remove members until you turn it back on. ## Related Roles, seats, invites, and how a workspace is organized. Sign-in methods, two-factor, and what FixAEO encrypts. What Enterprise includes, including seats and engines. Seat counts, credits, and per-member activity. # Team and workspaces Source: https://docs.fixaeo.com/team-and-workspaces Invite teammates, set roles and brand access, switch workspaces, and hand over ownership. Every FixAEO account is a workspace. It's created the moment you sign up, and you're its owner. There's no separate "create an organization" step, and nothing to set up before you can invite people. A workspace holds your brands, prompts, scan history, and billing. When you add teammates, they work inside that same workspace and see the brands you give them. This page covers seats, invites, roles, switching workspaces, and transferring ownership. ## Seats by plan A seat is one person in the workspace. Your plan sets how many you get: * **Free** — 1 seat * **Lite** — 1 seat * **Growth** — 3 seats * **Enterprise** — custom Because Free and Lite are a single seat, the owner fills it and there's no room for teammates. Multi-user teams are practical on **Growth** and **Enterprise**. Every limit is a default that can be raised on your account. Both active members **and** pending invitations count toward your seat limit. An invite you've sent but nobody has accepted still holds a seat until it's accepted or revoked. The full plan matrix lives on [Plans and limits](/plans-and-limits). ## Inviting teammates Team management lives in **Settings → People**, under the Organization section of the settings rail. The People section is where owners and admins manage the workspace; it has **People**, **Activity**, and **Roles** views along the top. (Activity is an audit log of workspace changes; Roles appears on Enterprise, where custom roles are available.) Open Settings from the sidebar footer, then pick **People** in the Organization section. Choose each person's role and brand access. Add rows one at a time, or use **Import CSV** (grab **Download template** first) to add several at once. The number you can add is bounded by your available seats. Click **Send Invitation**. Each person gets an email with a single-use link. They accept it after signing in, and then appear in your People list. Switch the list to **Pending** to see invites that haven't been accepted. From a pending row you can **Resend invitation** or **Revoke invitation** — revoking stops the link working and releases its reserved seat. ## Roles and brand access Each member has one role. Roles decide what a person can do; brand access decides which brands they can do it on. * **Admin** — manages the workspace: people, roles, and brand access, across every brand. * **Editor** — uses the app and makes changes on the brands they're assigned. * **Member** — standard day-to-day access on their assigned brands. * **Viewer – AEI only** — read-only access to Answer Engine Insights (the analytics screens). * **Viewer – AEI + AI Marketer** — the same read-only insights, plus the AI Marketer chat. * **Agent Operator** — runs and manages your Agents (saved workflows). For any member, set **Brand access** to **All brands** or **Selected brands**. With selected brands, tick the specific brands that person should see. To change someone later, open their row's actions menu and choose **Edit role and brand access**. **Custom roles are Enterprise-only.** On Enterprise, the **Roles** view lets an admin build a role from a specific set of permissions and assign it in place of a preset. On other plans, the six roles above are the full set. ## Switching between workspaces You can belong to more than one workspace — for example, your own and one a colleague invited you to. When you do, a **Workspace** section appears in the account menu (open it from the sidebar footer). It lists each workspace you're in, shows your role in each, and marks the active one. Switching swaps everything: brands, prompts, history, and billing all belong to one workspace at a time. **Data never merges across workspaces.** ## Transferring ownership The owner is the one person tied to the workspace's billing. To hand that over, open a member's actions menu in the People list and choose **Transfer ownership** (only the current owner sees this option). The person you pick becomes the new owner and controls billing. You stay in the workspace as an **Admin** with full brand access. Because billing is tied to the workspace itself, the subscription carries over with ownership — there's nothing to re-purchase. ## Enterprise single sign-on and directory sync On the **Enterprise** plan, admins can set up company sign-in and automatic provisioning under **Settings → Enterprise**. There are two cards: **Single sign-on** connects a standards-compliant OpenID Connect (OIDC) provider to one company domain, and **Directory sync** provisions and deactivates members over SCIM 2.0. The two are independent — you can turn on either without the other. FixAEO supports OIDC; SAML is not supported. Sign-on never grants access on its own — a person must already be invited or provisioned first. Full setup steps, DNS verification, token handling, and the "don't lock yourself out" checklist are on [SSO and SCIM](/sso-and-scim). ## Related Enterprise single sign-on and directory sync, set up end to end. Seats, brands, prompts, and every other plan cap. Sign-in, sessions, two-factor, and what FixAEO doesn't have. Add and organize the brands you grant members access to. # Topics and labels Source: https://docs.fixaeo.com/topics-and-labels Two ways to group a prompt list that's outgrown one screen. Topics and labels are how you slice a prompt list once it's too big to read line by line. Topics are themes. Labels are tags you define yourself. They're separate systems, and FixAEO uses the word "topic" for two related things, so it's worth ten seconds to get them straight. ## The two kinds of topics **Setup topics** are the themes you picked during setup. FixAEO suggests up to ten from your brand profile, pre-selects five, and lets you type your own. They exist to steer prompt generation. Once your prompts are written, their job is done. **Topic clusters** are what you see on the Topics page. FixAEO groups your tracked prompts into themes, then reports performance for each theme. These aren't the same list, and they can drift apart. You might pick "pricing" during setup, then add ten prompts about migrations, and the clusters will grow a migration theme you never named. That drift is visible in the clusters themselves: FixAEO Topics page showing four clustered themes for the demo brand Linear with 30-day Visibility Scores: Category discovery 39%, Head-to-head comparisons 25%, Alternative searches 2%, and Jira migration 42% ## The Topics page Each cluster tile shows its [Visibility Score](/metrics/visibility-score), its sentiment, and which competitors are winning on it. Two views: * **Cards** — the default, richer per topic. * **Leaderboard** — a ranked table, better when you have a lot of clusters. FixAEO Topics page for Linear: switching from Cards view to Leaderboard reveals a ranked table with prompts, citation %, sentiment, and the top competitor winning each topic (Jira, Asana, Monday.com) Click any topic to open a panel with per-engine detail. Clusters don't regroup themselves on every page load. Press **Re-cluster** to force a fresh pass, which takes a few seconds. FixAEO also refreshes stale clusters on its own. Re-cluster after you add a batch of prompts. Otherwise your new prompts sit in whatever theme the old grouping had room for, and the tiles read as stale. ## Labels: tags and personas Labels are your own vocabulary for describing prompts. There are two kinds, stored the same way but meant for different cuts: * **Tags** describe intent. Examples: awareness, purchase intent, support. * **Personas** describe audience. Examples: startup founder, enterprise buyer. Create and delete both from the Labels card in your brand settings. Give each one a color so it's readable at a glance. **Attaching a label to a prompt isn't built yet.** You can create and delete labels today, but there's no control anywhere in the app that applies one to a prompt. Until that ships, the **Tags** and **Personas** filters never appear on the [Citation page](/citations). Those two chips only render once at least one label is actually in use, so an unused set stays hidden rather than showing up empty — which is why creating labels appears to do nothing. Build the vocabulary now if it helps you think. Just don't plan a reporting workflow around filtering by it yet. ## A play: find where the category talks without you Here's a concrete use for topic clusters. It takes about five minutes. Switch from Cards to Leaderboard so you can read every cluster at once. Your weakest clusters are the themes where AI models answer your category's questions and don't name you. That's the gap. A cluster full of prompts that name you will score high and tell you nothing about reach. The interesting rows are the non-branded ones. See [Setting up your prompts](/setting-up-prompts) for the difference. Open a weak cluster and read the competitors listed on it. Then go to [Citations](/citations) and filter by that topic to see which domains the models cited when they answered. You now have a theme you're losing, the brands beating you, and the specific pages the models trusted. That's a content brief. ## How do you keep a growing list organized? * Keep your topic count modest. Ten broad themes read better than thirty narrow ones. * Re-cluster after every batch of new prompts, not every day. * When a cluster's name surprises you, that's a signal, not a bug. Your prompt list has drifted from your brand profile. * If a theme matters and no cluster covers it, the fix is more prompts, not more topics. ## Related * [Setting up your prompts](/setting-up-prompts) — what to feed the clusters. * [Your brand profile](/brand-profile) — the upstream context for topic suggestions. * [Tracking competitors](/competitors) — who shows up in the themes you're losing. # Understanding AI answers Source: https://docs.fixaeo.com/understanding-answers The raw AI answers every other number is built from. Every metric in FixAEO is counted from one thing: an AI answer. An AI answer is one engine's response to one of your tracked prompts, on one day, in one region. FixAEO stores the full text, then reads it to work out whether you were named, how you were described, and which competitors showed up. [Your dashboard](/dashboard) and [Citations](/citations) are summaries of these answers. ## How many answers do you get? One per prompt, per engine, per region, per day. Scanning the same prompt twice in a day replaces that day's answer rather than adding a second one. A brand with 10 prompts on a six-engine plan produces up to 60 answers on a scan day. How often that happens depends on your plan — see [Plans and limits](/plans-and-limits). This is a sample, not a survey. One answer per engine per day is a single draw from a system that gives different people different answers. Two customers asking your exact prompt the same afternoon can get different results. Read the trend across days, not one answer. ## Where do you read them? FixAEO brand page: clicking the Mentions tab reveals the sentiment breakdown (1027 Positive, 493 Neutral) and the Recent mentions feed with a Gemini answer to 'What's the best issue tracking software for distributed engineering teams?' plus a Show full response button and Source link Open your brand page and go to the **Mentions** tab. Each row shows: * the engine that answered * the sentiment FixAEO classified * the date * the prompt that produced it * a short excerpt * a source link, when the answer carried one Longer rows get a **Show full response** button that opens the whole answer in place. The feed runs newest first and is scoped to your brand's region, so the count agrees with the Visibility Score above it. Filter by sentiment, or export to CSV. An excerpt starts where your brand is first named, not at the top of the answer, so you land on the sentence that matters. **Show full response** gets you the rest. Only answers that named your brand become rows. Answers where you were absent still count — they're the denominator of your [Visibility Score](/metrics/visibility-score). A short Mentions list next to a low score isn't a bug. It's the same fact stated twice. ## What does FixAEO pull out of an answer? Mentions tab on the Linear brand page: a sentiment bar summarizes 1468 classified mentions as 67.6% Positive and 32.4% Neutral, then clicking the Positive filter chip narrows the Recent mentions list to answers judged positive FixAEO reads each answer for four things: 1. **Was your brand named?** By name or by domain. A close alias counts. An unrelated brand with a similar name doesn't. 2. **Sentiment**, judged only from your brand's point of view. Positive means recommended favorably. Negative means criticized or dismissed. Neutral means listed without endorsement. 3. **Which competitors were named.** 4. **Sentiment for each competitor**, on the same scale. Only real brands count as competitors. Publishers, forums, social platforms, and listicle titles don't, which is why "Best CRM Tools 2025" never lands in your competitor set. [Tracking competitors](/competitors) covers the ones that do. If your brand wasn't named at all, sentiment is recorded as neutral. That's why a brand with almost no visibility still shows a large neutral bar. Read it next to the mention count, not on its own — [Sentiment](/metrics/sentiment) covers this in full. ## Why does the same prompt give different answers? Four reasons, and all of them are normal. **The models aren't deterministic.** Ask twice, get two phrasings, sometimes two different recommendations. **Each engine retrieves differently.** Perplexity and AI Overviews search the live web for almost everything. Others lean on what's already in the model. Same question, different evidence, different answer. [Sources](/sources) shows what each engine actually pulled. **Region changes the answer.** The same prompt run for the US and for Germany can name entirely different brands. That's why FixAEO asks you to pick a country at setup and localizes every query to it. **The web moved.** A new comparison post, a Reddit thread, a competitor's launch — any of it changes tomorrow's answer. When a number moves, don't start from the chart. Open the Mentions tab and read three or four answers from the engine that moved. The cause is usually right there in the text: a new competitor listed, a changed framing, a source that stopped being cited. If the answers look wrong for your category, the problem is usually upstream in your prompt list. See [Setting up your prompts](/setting-up-prompts). # Usage and credits Source: https://docs.fixaeo.com/usage Track your AI Marketer credits, plan limits, and per-member usage from Settings → Usage. The **Usage** page answers two questions in one screen: how much of your AI Marketer credit allowance is left this cycle, and how close you are to the limits your plan sets. It also breaks the numbers down by conversation, brand, agent, and teammate, so you can see where the work went. Usage is a section of the single Settings page, not a route of its own. Open **Settings** from the sidebar footer, then pick **Usage** (the gauge icon). The deep link is `/app/settings/#usage`. Usage is role-gated, not plan-gated. It's available to **Admin**, **Editor**, and **Member** roles. The two Viewer roles don't have it — a viewer who follows the deep link sees "Your workspace role does not include organization usage access." The page itself works on every plan. ## AI credits The top card, **AI credits**, is the meter for the [AI Marketer](/ai-marketer). It shows your plan and how many credits are included this cycle — one allowance, shared across your whole workspace. Two totals sit under that: **Organization usage** (everything the workspace has spent) and **Your usage** (your own share), with your percentage of the total. Below them, a bar fills as credits are spent. A lighter segment marks credits **in flight** — held for a turn the AI Marketer is still working on. When that turn finishes, the reserved amount reconciles to what the work actually cost. Credits are the only unit here. There are no dollars on this page — pricing lives on [fixaeo.com/pricing](https://fixaeo.com/pricing). A credit meters the measured cost of the AI work, so a heavy task spends more than a light one. The meter reflects whether you're running normally, running low, or used up, and turns red when you're near the top. Credits **reset** on a fixed day each cycle. If you have an active subscription, that's your renewal day; with no subscription to anchor to, it falls back to the 1st of the month. The card labels which basis it used, and shows your renewal date separately when the two differ. Your monthly credit allowance depends on your plan: **Free** gets none, **Lite** 100, **Growth** 400, and **Enterprise** a custom allowance. On a plan without the AI Marketer, the card reads **not included** rather than showing a spent bar — that's the expected state, not an error. **Manage plan** on the card jumps to your billing controls. See [Plans and limits](/plans-and-limits) for the full breakdown. ## Plan limits The **Plan limits** card lists the caps that actually gate the product, each shown as used against your limit with a small bar. These apply on every plan, including Free. It covers your brands, tracked prompts, API keys, AI engines, scan frequency, and the monthly server-log agent events that feed [Agent analytics](/agent-analytics). Account-wide caps are marked **across all brands** so you know a number is pooled rather than per-brand. If you go over a limit — for example after a downgrade — the row turns red and says so. Existing items keep working; you just can't add more until you upgrade or trim. That's a plain limit, not a failure. ## Breakdown The **Breakdown** table is the same numbers sliced four ways. Switch between the tabs at the top: * **AI Marketer** — each conversation, with its turns, average credits per turn, credits used, and share of total usage. * **Brands** — each brand, with scans, prompts, engines, and when it was last scanned. * **Agents** — each workflow, with total runs, how many succeeded, and how many failed. * **Users** — each member, with their role, status, turns, credits used, and last activity. Filter any tab to the last **7, 30, 90, or 365 days**. You can sort by column, search within the table, and page through longer lists. On a team, AI Marketer credits are one shared pool for the whole workspace. The **Users** tab is how you see who spent what — it attributes credit use per member. Click a member's name to drill into just their AI Marketer conversations, then clear the filter to go back to the workspace view. Team roles and seats are covered in [Team and workspaces](/team-and-workspaces). ## Export **Export CSV** downloads the breakdown you're looking at — the same rows, the same tab, and the same date filter that's on screen. This is separate from the analytics CSVs and the account JSON on [Export your data](/export-your-data); those cover your measurements and profile, while this covers usage and credits. For a scheduled pull, the same file is served at `https://api.fixaeo.com/api/v1/me/usage/export.csv`, signed in with your account cookie. The columns match the breakdown Settings → Usage shows. ## Related The assistant that spends the credits this page meters. Tiers, allowances, and where billing lives in Settings. Roles, seats, and the shared credit pool across your team. The analytics CSVs and account JSON, separate from this export. # What's in the app Source: https://docs.fixaeo.com/whats-in-the-app Every screen in the app, and the docs page that explains it. The sidebar groups your screens into a few areas. These docs are organised by concept, the app by screen. This page is the bridge. Press ⌘K (or Ctrl+K) anywhere in the app to jump straight to any screen without touching the sidebar. A couple of screens live only in that palette now, so it's worth learning. Command palette in FixAEO: pressing ⌘K opens a search overlay, typing 'citation' narrows to the Citation page, and Enter jumps straight there ## Top of the sidebar The first two entries sit above every group and carry no heading. | Screen | What it answers | Docs | | ----------- | ------------------------------------- | --------------------------- | | AI Marketer | What should I do about my visibility? | [AI Marketer](/ai-marketer) | | Portfolio | Which of my brands is winning? | [Portfolio](/portfolio) | On a paid plan the **AI Marketer** is your app home — it's the screen you land on after signing in. Portfolio only appears once you track more than one brand. ## Analytics This group holds two **areas**. Each area opens as one screen with tabs across the top, not as a row of separate links. **Answer Engine Insights** — the nine tabs that measure how AI engines see you: | Tab | What it answers | Docs | | ------------- | ------------------------------------------------- | ------------------------------------------ | | Overview | Where does my brand stand today? | [Understanding your dashboard](/dashboard) | | Industry | How do I compare to my category? | [Industry](/industry) | | Topics | Which themes do I win and lose? | [Topics and labels](/topics-and-labels) | | AI engines | Which engine drags my score down? | [AI engines](/model) | | Query fanouts | Why wasn't I cited for that prompt? | [Query fanouts](/fanouts) | | Citations | Do engines link to my site or my rivals? | [Citations](/citations) | | Sources | Which pages did engines read? | [Sources](/sources) | | Attribution | Does AI traffic become revenue? | [Attribution](/attribution) | | SEO | Where do Google rankings and AI answers disagree? | [Search performance](/seo) | **Agent Analytics** — two tabs that read your server logs to show which AI crawlers reach your site: | Tab | What it answers | Docs | | -------------- | ------------------------------- | ----------------------------------- | | Crawl insights | Which AI bots crawl my site? | [Agent analytics](/agent-analytics) | | Crawlability | Does my robots.txt let them in? | [Crawlability](/crawlability) | ## Action Where you turn findings into work. | Screen | What it answers | Docs | | ------- | ------------------------------------------- | ------------------- | | Agents | Build, run, and schedule reusable workflows | [Agents](/agents) | | Improve | What should I fix first? | [Improve](/improve) | | Alerts | What should trigger a notification? | [Alerts](/alerts) | ## Context Where you set up what everything else measures. | Screen | What it answers | Docs | | ------------ | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | Brands | Add, rename, or switch brands | [Managing brands](/managing-brands) | | Integrations | What's connected to this brand? | [Analytics](/integrations/google-analytics) · [Search Console](/integrations/google-search-console) · [WordPress](/integrations/wordpress) | Two things named "Agent" do different jobs. The **AI Marketer** and the **Agents** screen (in Action) do work for you — planning, drafting, and running workflows that always wait for your review. The **Agent Analytics** area (in Analytics) is unrelated: it reads server logs to show which AI crawlers visit your site. Same word, different jobs. ## Reaching Search and Inbox Search and Inbox no longer have their own sidebar rows. Open them — and jump to any screen — from the command palette (⌘K), where they're listed by name. * [Search](/search) — find any brand, prompt, mention, or source across the app. * [Inbox](/inbox) — the alerts that fired, and whether you've read them. ## Where the names differ A few labels read differently in the sidebar, on the page, and in these docs. * The **Overview** tab opens a page titled **Today**. * The **SEO** tab opens a page titled **Search performance**. * The **Industry** tab is documented as [Industry benchmarks](/industry). * The **Topics** tab is documented as [Topics and labels](/topics-and-labels). * **Crawl insights** is documented as [Agent analytics](/agent-analytics). ## What's hidden, and when? Two entries are conditional on how many brands you track. * **Portfolio** shows only at two or more brands. Over a single brand it would just be a worse home screen. * **Brands** shows at two or more brands, or when you have one brand and are still under your plan's brand cap. The Free plan tracks one brand, so both entries stay hidden there. They appear as soon as your plan has room for a second brand. See [Plans and limits](/plans-and-limits). Settings aren't in the nav list. They open from the **sidebar footer** — the gear at the bottom of the rail. There's no top-right avatar menu; that global top bar is gone. The same footer menu holds the **workspace switcher** (it appears only when you belong to more than one workspace, and data never merges across them), the theme toggle, and sign-out. Inside Settings: **People** is where owners and admins invite teammates and set roles ([Team and workspaces](/team-and-workspaces)); **Usage** shows live counters and the AI Marketer credit meter ([Usage](/usage)); and **Notifications** holds your email preferences ([Email notifications](/email-notifications)). The brand cell at the top of the sidebar shows your current brand and links to its [brand profile](/brand-profile) page. It's a plain link, not a switcher — swap brands from the [Brands](/managing-brands) grid. On phones the sidebar becomes a drawer with the same list. ## Related The assistant that reads your data and drafts the work. Invite teammates, assign roles, switch workspaces. Live counters and the AI Marketer credit meter. The emails FixAEO sends, and how to turn each category off. What each plan includes, and how limits behave. Connect OIDC SSO and directory sync on Enterprise.